do-while、for循环、while的实现思路

关于循环的实现思路

其实最近也学习了下汇编,不过还是从8086开始学起,感觉这个还是比较容易上手的,然后学到loop指令,忽然发现这个指令不就是拿来实现循环的吗。然后进行了些许测试。在这里有总结下,这里是借助了一个工具来进行实现的。

先看看这个指令的用法吧

这里cx表示的是8086CPU里面的一个寄存器。loop指令和cx寄存器结合使用就可以达到循环的效果

mov cx,循环次数
标记:
      循环执行的程序代码
      loop 标记

这里执行的步骤其实是这样的

  • 先按照顺序执行下来,包括标记后面的循环执行的代码也会先去执行
  • 然后执行到loop 标记的那个地方,会先把cx寄存器的值减1
  • 判断cx的值如果不为0的话就去执行中间的那个程序代码
  • 如果为0就去loop 标记之后的代码

其实loop指令也可以这么理解,其实就是一个高级指令,其实就是可以理解为将IP寄存器改变,然后就是jmp到标号那边。之后还需要去判断条件是否需要再次jmp。jmp就是可以拿来改变IP寄存器的值的一个指令。

下面可以用一个实例计算2的6次方,可以用循环加法来做,如下所示,这里可以看到AX的低8位部分为40,转换为10进制就是64,先前mov ax 2h的时候其实就代表的是2的1次方了,然后循环会执行5次
这里写图片描述

这里需要注意的是,我们如果把循环次数定为0次,也就是说让cx寄存器的值-1溢出得到的其实是FF FF也就是最大值,而不是-1,还是其他的值,试验如下所示
这里写图片描述

cx原本的值为00 00 减1之后的值变成了FF FF,也就是说会一直循环下去,循环2的16次方次,AX的值最终会从80 00 再加上80 00所以会变成00 00
这里写图片描述

使用loop指令和bx寄存器去实现从ffff:0到ffff:b单元中数据的加到dx寄存器中,里面主要是依赖于一个16位的寄存器ax来做的,先把数据弄到ax寄存器中,然后再加到dx寄存器中,其中inc bx 就是让bx = bx + 1的意思

assume cs:code

code segment

    mov ax,0ffffh
    mov dx,ax
    mov bx,0

    mov dx,0

    mov cx,12

s: mov al,[bx]
   mov ah,0
   add dx,ax
   inc bx
   loop s

   mov ax,4c00h
   int 21h

code ends
end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值