关于循环的实现思路
其实最近也学习了下汇编,不过还是从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