Loop指令和cx寄存器配合使用, 用于循环操作,类似于高级语言中的do while循环
mov cx,循环次数
标号:
循环执行的程序代码
loop 标号
标号的名称可以自定义
loop 标号
位置时,程序不知道是个循环体, 当做正常流程代码执行)loop 标号
位置,确认是个循环体后, 先将cx减1,也就是cx=cx-1loop 标号
后面的代码因此,从代码层面上看cx的值代表了循环次数, 事实上只循环了cx-1次 只不过判断之前会先执行一遍循环体, 类似于do while
根据以上结论, 如果cx的值为0, 减1后为-1, 那程序会怎么执行呢?
答案是会进入死循环 , 8086cpu是16位 的会循环执行65535次
为什么?
因为-1在计算机里面对应的十六进制为FFFF, 二进制第一位为符号位
题目: 取出以下内存地址中的值并且相加取和
FFFF0H----->20h #每个内存单元存放一个字节数据
FFFF1H----->ach
FFFF2H----->FFh
正常思维是使用八位寄存器取出对应地址的值,比如:
mov ax,ffffh
mov ds,ax
mov al,[0]
add al,[1]
add al,[2]
但是这里面存在一个问题, ach+ffh明显超出一个字节, 如果使用al寄存器接收势必数据保存不全,此时,需要再借助一个寄存器,代码修改后如下:
mov ax,ffffh
mov ds,ax
mov dx 0h ;确保数据为0 避免系统脏数据
mov al,[0]
mov ah,0h
add dx,ax
mov al,[1]
mov ah,0h
add dx,ax
mov al,[2]
mov ah,0h
add dx,ax
这种方式保证了数据超出后自动进位, 最后结合loop循环优化代码,如下:
mov ax,ffffh
mov ds,ax
mov dx 0h ;确保数据为0 避免系统脏数据
mov bx 0h
mov cx,3h
s: mov al,[bx]
mov ah,0h
add dx,ax
add,bx,1H
loop s
获取数据, 除了通过ds来获取数据之外, 还可以利用其它段地址来获取, 比如:
mov ax,ds:[0]
mov ax,cs:[0]
mov ax,ss:[0]
mov ax,es:[0]