汇编中的嵌套循环

先贴代码:

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

猜你喜欢

转载自blog.csdn.net/andrewgithub/article/details/78941213
今日推荐