专栏首页乱码三千8086汇编语言之Loop

8086汇编语言之Loop

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]

本文分享自微信公众号 - 乱码三千(infree6),作者:有瓣知识

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-08-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 8086汇编语言之代码分段

    以上代码存在一个问题, 由于数据是在代码段中定义, cpu默认将数据识别为代码, 将导致数据不可用,那么解决办法为,增加入口标记:

    乱码三千
  • 8086汇编语言之dos打印hello world

    乱码三千
  • x86汇编语言之8086语法和指令集

    上面使用db或者dw定义数据的方式,定义数据的同时就已经定义好了数据所在的物理地址, 如果我们想要从指定的内存地址中写入或者读取数据的话,需要借助段寄存器来实现...

    乱码三千
  • 8086汇编语言——处理字符串

    zy010101
  • 8086汇编语言——循环的使用

    zy010101
  • 8086汇编语言之函数的声明和调用

    由于print函数默认执行,为了保证在call时才执行, 咱们将print函数代码移至中断后:

    乱码三千
  • 8086汇编语言之debug模式常用指令介绍

    上面为 (段地址:偏移地址) 查看方式。D命令默认会显示寻址地址开始的后128个内存单元的内容,以16进制的方式显示(每个内存单元8位,一行最多16个内存单元)...

    乱码三千
  • 8086汇编语言——双层循环的使用

    zy010101
  • 8086汇编语言——一个很骚的程序

    zy010101
  • 未整理的计组复习笔记?

    计组是我听过的最脑阔疼的课。不过已经考过了orz以及,大家学的计组内容可能不一样,这篇复习包括的内容应该是比较简略的。

    gojam
  • 8086汇编语言之各个通用寄存器的作用

    1. asm编译器无法识别中括号,mov ax,[0]编译时会默认去除中括号.使用bx替代可以解决这个问题,如果在debug模式下使用-a命令输入中括号则没有问...

    乱码三千
  • 8086汇编语言——使用数据段和栈段

    zy010101
  • 8086汇编语言——操作内存中的数据

    zy010101
  • 汇编语言之ARM64汇编

    对于arm64系的CPU来说, 如果寄存器以x开头则表明的是一个64位的寄存器,如果以w开头则表明是一个32位的寄存器,在系统中没有提供16位和8位的寄存器供访...

    乱码三千
  • 汇编语言之MIPS汇编

    咱们知道x86架构cpu用于PC端和工作站较多,ARM架构cpu常见于手机和单片机,那么MIPS架构的cpu主要在哪些设备可以找到它们的身影呢?

    乱码三千
  • 汇编语言之ARM32汇编

    以上两种编译环境,使用的指令集都是一致的, 只是语法格式有不同,也就是宏指令,伪指令,伪操作不一样

    乱码三千
  • 8086汇编语言——交换寄存器中的内容

    zy010101
  • 8086汇编学习之jump指令

    由于在8086cpu中更改段寄存器CS和指针寄存器IP的值不能直接使用mov赋值, 比如:

    乱码三千
  • 8086汇编语言——向显示缓冲区中写入数据

    注意这段代码请不要Debug,直接运行即可。结果如下所示:最后一行的效果是闪烁显示。

    zy010101

扫码关注云+社区

领取腾讯云代金券