当前位置: 首页 > news >正文

汇编语言:loop指令

        loop指令是循环指令,在8086CPU中,所有的循环指令都是短转移,其对应的机器指令有2个字节,低8位字节存放的是操作码;高8位字节存放的是转移位移(相对于当前IP的位移),用补码形式表示,范围在:-128 ~ 127。

指令格式:loop 标号

        loop 标号 指令的循环次数存放在cx寄存器中,其基本原理为:

1. (cx) = (cx) -1;

2. (1)如果 (cx) != 0,则 (IP) = (IP) + 8位位移,控制CPU回到标号处执行指令。

    (2)如果 (cx) = 0,什么都不做,程序继续往下顺序执行指令。

其功能就像 C 语言所描述的代码:if ((cx) != 0 ) jmp short 标号;

示例:利用 loop 指令,实现从CS(段地址)中查找第一个值为0的字节,并把偏移地址存储在dx寄存器中

assume cs:code
code segment
start:mov ax, csmov ds, axmov bx, 0
s:mov cl, [bx]    ;cl = ds:[bx]指向的一个字节数据mov ch, 0       ;cx的高8位置0inc cx          ;因为执行 loop s 指令, cx = cx - 1, 所以这里要 inc cxinc bx          ;让偏移地址移向下一个字节单元loop s          ;(1)cx = cx -1; ;(2) --如果 cx != 0, IP = IP + 8位位移,CPU回到S标号指向的指令处执行指令;    --如果 cx == 0,什么都不做,CPU继续顺序往下执行指令dec bx          ;mov dx, bxmov ax, 4c00hint 21hcode ends
end start

从图中,我们可知,程序加载到内存后

(1)-r 查看各个寄存器设置情况,CS:IP = 204D:0000

(2)-d cs:0 查看128个字节的内存中,偏移地址 = 5,是第一个值为 0 的字节

(3)-u 查看汇编指令以及其对应的机器码

(4)-g 0012 控制CPU从CS:IP指向的指令处开始执行指令,直到 IP = 0012 时停下来,这时 dx = 0005,和我们在步骤(2)中观察到的第一个值为 0 的字节的偏移地址 = 5 是一致的

(5)loop s 被编译器编译成 loop 0007,其对应的机器指令为:E2F8(低字节序),低8位:E2是操作码,高8位:F8是转移位移,转移位移 = 0007h - 000Fh = -8(十进制) =  F8h(负数的补码形式)。

参考文献

《汇编语言(第4版)》王爽

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 系统分析师3:嵌入式技术
  • 高级java每日一道面试题-2024年8月12日-网络篇-说一下JSONP的实现原理?
  • 【区块链+金融服务】基于区块链的一站式绿色金融开放平台 | FISCO BCOS应用案例
  • docker 安装mino服务,启动报错: Fatal glibc error: CPU does not support x86-64-v2
  • ComfyUI工作流|给你的线稿换上任意颜色,这个就太秀了!
  • 2024海外电商数据分析之巴西篇
  • Java语言程序设计基础篇_编程练习题*16.16(使用ComboBox和ListView)
  • 网络编程day3
  • Java中金额转换处理(转大写,三位一逗)
  • 您知道有哪些主流的大模型LLM开源项目吗?
  • Marmir,一个超牛的Python库
  • 力扣题/图论/岛屿数量
  • 【大数据】智慧园区大数据云平台整体建设方案(Word原件)
  • 【Python学习-UI界面】PyQt5 小部件14-QDock 子窗口
  • Redis常见的数据类型和应用场景
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • 30天自制操作系统-2
  • Java多态
  • java多线程
  • JDK 6和JDK 7中的substring()方法
  • windows下使用nginx调试简介
  • 服务器从安装到部署全过程(二)
  • 汉诺塔算法
  • 计算机常识 - 收藏集 - 掘金
  • 普通函数和构造函数的区别
  • 前嗅ForeSpider教程:创建模板
  • 我看到的前端
  • 我是如何设计 Upload 上传组件的
  • 异常机制详解
  • 如何正确理解,内页权重高于首页?
  • ‌前端列表展示1000条大量数据时,后端通常需要进行一定的处理。‌
  • !!java web学习笔记(一到五)
  • # linux 中使用 visudo 命令,怎么保存退出?
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (办公)springboot配置aop处理请求.
  • (补充):java各种进制、原码、反码、补码和文本、图像、音频在计算机中的存储方式
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (回溯) LeetCode 131. 分割回文串
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (原創) 未来三学期想要修的课 (日記)
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转) 深度模型优化性能 调参
  • (转)Unity3DUnity3D在android下调试
  • .gitignore文件---让git自动忽略指定文件
  • .net 获取某一天 在当月是 第几周 函数
  • .NET 直连SAP HANA数据库
  • .net反编译的九款神器
  • .NET运行机制
  • .sh 的运行
  • @Query中countQuery的介绍
  • @SpringBootApplication 包含的三个注解及其含义
  • [.net] 如何在mail的加入正文显示图片
  • [14]内置对象
  • [202209]mysql8.0 双主集群搭建 亲测可用
  • [AIGC] Spring Interceptor 拦截器详解