8086汇编语言之Loop

您所在的位置:网站首页 汇编语言loop指令 8086汇编语言之Loop

8086汇编语言之Loop

2023-04-02 07:14| 来源: 网络整理| 查看: 265

小知识,大挑战!本文正在参与“  程序员必备小知识  ”创作活动

LOOP指令

Loop指令和cx寄存器配合使用, 用于循环操作,类似于高级语言中的do while循环

使用格式 mov cx,循环次数 标号: 循环执行的程序代码 loop 标号 复制代码

标号的名称可以自定义

执行流程 第一步:不管cx中值是否大于0, 先执行一遍循环体(因为程序还未执行到loop 标号位置时,程序不知道是个循环体, 当做正常流程代码执行) 第二步: 执行到loop 标号位置,确认是个循环体后, 先将cx减1,也就是cx=cx-1 第三步:减1后结果如果大于1,则重复执行循环体, 否则跳过循环体代码,继续执行loop 标号后面的代码 总结

因此,从代码层面上看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] 复制代码


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3