标志寄存器三

例题:有四个字符串,把每一个字符串的字母大写
assume cs:codesg,ds:datasg
datasg segment
db 'ibm.............'
db 'dec.............'
db 'dos.............'
db 'var...............'
datasg ends
codesg segment
start:mov ax,datasg
mov ds,ax
mov bx,0
mov cx,4
s0:mov dx,cx
mov si,0
mov cx,3
s:mov al,[bx+si]
and al,11011111b
mov [bx+si],al
inc si
loop s
add bx,16
mov cx,dx
loop s0
codesg ends
end start
解析:
注意:loop s命令是程序从s处到loop s处执行cx遍。
所以说这个程序就是s0-(loop s0)处执行4遍,s-(loop s)处执行3遍
bx代表每一行的偏移地址,si代表每一列的偏移地址


2.第二种做法:运用栈
assume cs:codesg,ds:datasg,ss:stacksg
datasg segment
db 'ibm.............'
db 'dec.............'
db 'dos.............'
db 'var...............'
datasg ends
stacksg segment
dw 0,0,0,0,0,0,0,0一个数据占一个字,可按需增加或减小
stacksgends
【标志寄存器三】codesg segment
start:mov ax,stacksg
mov ss,ax
mov sp,16
mov ax,datasg
mov ds,ax
mov bx,0
mov cx,4
s0: push cx
mov si,0
mov cx,3
s:mov al,[bx+si]
and al,110111111b
mov [bx+si],al
inc si
loop s
add bx,16
pop cx
loop s0
mov ax,4c00H
int 21h
codesg ends
end start

    推荐阅读