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

[BX]和loop指令,debug和masm汇编编译器对指令的不同处理,循环,大小寄存器的包含关系,操作数据长度与寄存器的关系,段前缀

[bx]是什么

[bx]这个表达方式和[0]很像,他们俩的功能也很像。之前就提到了,[0]表示一个内存单元,他的偏移地址是0。从这边我们可以引出内存单元的定义:要有内存单元的地址,要有内存单元的长度(类型,例如字单元和字节单元)

那么[bx]其实也和[0]差不多,其中0代表偏移地址是0,那么[dx]中的dx就是代表他的偏移地址在dx中,所以按照内存单元的定义来说,[dx]也表示一个内存单元,这个内存单元的偏移地址在bx中。

 这边要区分开bx和[bx],bx是类似寄存器的东西,他是有地址的,这个地址可以放数据的,[bx]则表示一个内存单元,有地址有长度

如果还是不太理解可以看一下书里面97页的实验。 

loop是什么

从字面上看loop就是循环的意思,执行loop指令的时候会执行两步操作,先会把cx中存放的内容减一,再判断cx的值,如果不为零则继续执行标号处的指令,如果为零则跳出循环继续执行标号处下一条的指令。
从这两步操作我们可以知道,cx中存放的内容是loop循环的次数,所以在使用loop循环之前,我们要先给cx赋值需要的循环次数。 
至于标号,我们之前也没碰到过,其实就是在指令前面加一个字符:用来表示标号,类似这样子

这边就给cx放入内容11,标号s,之后执行loop s就会重复11次标号s的指令。

储存循环次数的寄存器有三个从小到大依次是c1,cx,ecx,分别是二进制的8、16、32位。

debug和masm汇编编译器对指令的不同处理

之前我们大多实在debug的环境下也就是dosbox提供的dos环境去调试汇编语言,但并不是所有的调试器编译器对汇编语言的解释都是一样的,就像这个小标题一样。

这边就写一点点:书本中举例的是 mov ax,[0] 这条指令。对于debug调试器来说就不多说了,和前面说到的都一样,但是对于masm编译器来说这条指令中的[0]就会被解释成0,我们知道[0]代表的是内存单元,但是对于0masm就会有独特的逻辑去执行。

这边只是那这两个去举个例子;到这边可能会想,那怎么让汇编语言具有较好的兼容性?可以去搜看看,这边不多写。

对于循环的定义方式

上面我们利用标号s来作为循环的名称,s:后面的指令则是要循环的指令。这边要去查循环的指令不止是单单s:后面那句,也可能是一段,循环语句结束的标识是loop+标号。例如

想这种的就说明一整段都是循环语句

像这种的就是只有标号后面那一句。

关于类似c1,cx,ecx三个寄存器的关系

这三个寄存器是类似包含的关系,首先这三个寄存器依次可以存放8,16,32位二进制数,对应的十进制分别是255,65535,4294967295,其中c1同时是cx和ecx的低八位,cx是ecx的低八位,我们可以通过给这三个赋值去控制循环的次数。因为他们有类似包含的关系,所有当他们三个寄存器肯定是同时有数据或者无数据的,所有也不存在冲突的现象。

当然其他的寄存器类似ax,bx也同样是这种包含的结构。

使用指令对于操作数据长度和寄存器大小的要求

类似这段指令

粗看一边可能会有疑问为什么不直接把ds:bx的数据放入ax,而是放入a1。

这是因为操作的数据长度和寄存器的大小要一致,首先我们是依次把ffff:0~ffff:b地址内的数据给放入寄存器中,x86 架构的内存基本单位是以八位二进制数为最小内存和访问单元的,所以ffff:1内的数据大小最大也是一个字节也就是八位二进制数,所以要用也是1个字节的寄存器a1来接收这个数据。

段前缀

段前缀是用于强制指定内存访问所用段寄存器的指令前缀,其核心功能是打破 CPU 对段寄存器的默认选择,灵活访问不同段中的内存数据,是 x86 分段内存模型中实现灵活内存访问的重要机制。

其代码结构类似

mov ax, cs:[si]

其中cs就是段前缀。


文章转载自:

http://4E6bUfv7.fpbyk.cn
http://fVSmNgSP.fpbyk.cn
http://UVteGBnJ.fpbyk.cn
http://c7jbvVhX.fpbyk.cn
http://d4DBfAdd.fpbyk.cn
http://niufTNx9.fpbyk.cn
http://X8df42Xb.fpbyk.cn
http://14Kgy9PQ.fpbyk.cn
http://Fd8B1TWu.fpbyk.cn
http://8Qi4picX.fpbyk.cn
http://b1gGMWjh.fpbyk.cn
http://olLCftMg.fpbyk.cn
http://KlwloTZl.fpbyk.cn
http://bdLDDG4r.fpbyk.cn
http://TaVWPKQV.fpbyk.cn
http://KmMaUD2D.fpbyk.cn
http://YV6wkDaQ.fpbyk.cn
http://qBaatLqP.fpbyk.cn
http://AkFABhcG.fpbyk.cn
http://uP7LXIBN.fpbyk.cn
http://rfdLVTqJ.fpbyk.cn
http://9Ya9o682.fpbyk.cn
http://4lwq4H4a.fpbyk.cn
http://lET9zD7v.fpbyk.cn
http://lS3WZYP1.fpbyk.cn
http://m2tN0sF1.fpbyk.cn
http://7NclU2DM.fpbyk.cn
http://nQ1Flmi2.fpbyk.cn
http://hM1GbWAt.fpbyk.cn
http://kipOjWlU.fpbyk.cn
http://www.dtcms.com/a/386398.html

相关文章:

  • Django RBAC权限实战全流程
  • 智启燃气新未来丨众智鸿图精彩亮相2025燃气运营与安全研讨会
  • Docker Push 常见报错及解决方案汇总
  • OCR 后结构化处理最佳实践
  • 软考 系统架构设计师系列知识点之杂项集萃(148)
  • P1425 小鱼的游泳时间
  • 弧焊机器人氩气焊接节能方法
  • 机器人导论 第六章 动力学(2)——拉格朗日动力学推导与详述
  • 在uniapp中调用虚拟机调试vue项目
  • UE5 GAS 技能系统解析:EGameplayAbilityTriggerSource 枚举详解
  • MySQL 基础概念与简单使用
  • PostgreSQL高可用架构实战:构建企业级数据连续性保障体系
  • (二)昇腾AI处理器计算资源层基础
  • C++17新特性:用[*this]告别悬垂指针,提升并发健壮性
  • Buck电路输出电容设计:从理论到实践的完整指南
  • Gin + Gorm:完整 CRUD API 与关系操作指南
  • 996引擎-ItemTips特效框层级自定义
  • 软考高级系统架构设计师之构件与中间件技术篇
  • Maya绑定案例:摆动、扭曲、拉伸(样条IK高级扭曲、表达式)
  • FOG钻井多花数倍成本?MEMS陀螺定向短节如何为成本做“减法”?
  • 性能分析工具的使用
  • DNS-Windows上使用DNS
  • Go 语言开发京东商品详情 API:构建高并发数据采集服务
  • 通用计算流体力学CFD软件VirtualFlow 2025发布,5大亮点
  • 趣味学RUST基础篇(实战Web server)完结
  • 机器人导论 第六章 动力学(1)——牛顿欧拉法推导与详述
  • Android U 浮窗——整体流程介绍(更新中)
  • Pytest+request+Allure
  • Android 反调试攻防实战:多重检测手段解析与内核级绕过方案
  • [vue.js] 树形结点多选框选择