前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >8086汇编语言之Loop

8086汇编语言之Loop

作者头像
乱码三千
发布2021-08-24 15:12:20
1.5K0
发布2021-08-24 15:12:20
举报
文章被收录于专栏:乱码三千乱码三千

LOOP指令

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

使用格式

代码语言:javascript
复制
	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, 二进制第一位为符号位

小练习

题目: 取出以下内存地址中的值并且相加取和

代码语言:javascript
复制
FFFF0H----->20h  #每个内存单元存放一个字节数据

FFFF1H----->ach

FFFF2H----->FFh

正常思维是使用八位寄存器取出对应地址的值,比如:

代码语言:javascript
复制
mov ax,ffffh
mov ds,ax
mov al,[0]
add al,[1]
add al,[2]

但是这里面存在一个问题, ach+ffh明显超出一个字节, 如果使用al寄存器接收势必数据保存不全,此时,需要再借助一个寄存器,代码修改后如下:

代码语言:javascript
复制
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循环优化代码,如下:

代码语言:javascript
复制
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来获取数据之外, 还可以利用其它段地址来获取, 比如:

代码语言:javascript
复制
mov ax,ds:[0]
mov ax,cs:[0]
mov ax,ss:[0]
mov ax,es:[0]
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 乱码三千 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • LOOP指令
  • 使用格式
  • 执行流程
  • 总结
  • 特殊案例
  • 小练习
  • 补充
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档