先贴代码:
assume cs:code,ds:data
data segment
db 'ibm ' ;定义一个16个字节的字符串
db 'dec '
db 'dos '
db 'vax '
dw 0 ;定义一个内存区域用于保存cx
data ends
code segment
start: mov ax,data
mov ds,ax
mov bx,0
mov cx,4
s0: mov ds:[40H],cx
mov si,0
mov cx,3
s: mov al,[bx+si]
and al,11011111b
mov [bx+si],al
int si
loop s ;loop s的执行过程是先执行cx = cx - 1;在判断cx是否为0若cx为0则进行 跳转到 s处进行程序的运行
add bx,16
mov cx,ds:[40H]
loop s0
mov ax, 4c00H
int 21H
code ends
end start
代码中使用 内存区域为[40+ds]的地方作为 保存cx的值 以此来达到上层循环的计数器cx不会因为下层的cx值的改变而受到影响
当然也可以使用 dx等通用寄存器来保存cx的值但是这样做在内部循环中就无法使用dx通用寄存器 相比之下牺牲一个内存跟家的划算
上面的程序中,使用内存单元来保存数据,可是上面的做法却有写麻烦,因为如果需要保存的多个数据的时候,你就需要记住数据存放在哪个内存单元之中,这样的程序容易引起混乱。
因此一般来说需要暂存数据的时候我们都应该使用栈,来进行数据的暂存。再次的个那个该以上的成需:
assume cs:code,ds:data,ss:stack
data segment
db 'ibm '
db 'dec '
db 'dos '
db 'vax '
data ends
stack segment
dw 0,0,0,0,0,0,0,0,0 ;定义一个段,用来做栈段,容量为16个字节
stack ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,16 ;设置栈顶ss:sp指向stack:16 堆栈使用的时候要指向栈顶
mov ax,data
mov ds,ax ;数据的ds数据段指向上面定义的数据段
mov bx,0
mov cx,4
s0: push cx ;将外层循环的cx压栈
mov si,0
mov cx,3 ;将cx设置成内层循环的次数
s: mov al,[bx+si]
and al,11011111b
mov [bx+si],al
inc si
loop s
add bx,16
pop cx ;从栈顶将cx的值进行恢复
loop s0 ;外层循环的loop指令将cx中的计数值cx中的计数值减1
;执行过程 loop是先将 cx减1 再判断 cx是否为0 若不为0则进行循环直到cx为零的时候为止
mov ax, 4c00H
int 21H
code ends
end start