汇编中的嵌套循环

先贴代码:

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Achou.Wang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值