汇编语言程序设计(九)转移指令的原理

8086CPU转移指令分类

  • 无条件转移指令,如jmp
  • 条件转移指令
  • 循环指令,如loop,本质也是转移指令
  • 过程,类似函数
  • 中断,这是个很重要的概念

offset操作符

  • offset是个伪指令,作用是取得标号的偏移地址,如下例子,相当于将标号start代表的偏移地址给了ax寄存器。

jmp指令,无条件转移

  • jmp无条件转移指令,可以只修改ip,也可以同时修改cs和ip

jmp short 标号,段内短转移

  • 转移到标号处执行指令,实现段内短转移,其对IP修改范围为-128~127,即向前最多越过128个字节执行指令,向后转移最多越过127个字节。值得注意的是,在机器码中并不会出现标号代表的偏移地址,原理不再赘述(见下图),会用就行。

jmp near ptr 标号,段内近转移

  • jmp short 标号是实现段内短转移,后者是只能转移8位地址,即256个(-128127),前者则是可以实现16位地址的转移(-3276832767),即功能完全一样,只是能够转移的距离更长了。

jmp far ptr 标号,段间转移,又叫远转移

  • far ptr指明用标号的段地址和偏移地址来修改CS和IP,实现段间跳转

jmp 16位寄存器

  • 16位寄存器中的数据用于修改IP,即通过修改偏移地址实现指令跳转

转移地址放在内存中的jmp指令

  • jmp指令中转移地址可以通过标号给出,或放在寄存器中,当然也可以放在内存中。

jmp word ptr 内存单元地址,段内转移

  • 从内存单元处取一个字的数据,作为目的偏移地址,其中内存单元地址可以用任意一种寻址方式给出。

jmp dword ptr 内存单元地址,段间转移

  • 内存单元处取出两个字,第一个字的数据作为目的段地址,第二个字的数据作为目的偏移地址。

有条件转移指令jcxz与loop

jcxz指令,有条件转移

  • jcxz和loop都是有条件转移指令,有条件转移指令都是段转移,在对应的机器码中包含转移的位移而不是目的地址,对偏移地址IP的修改范围是-128~127。
  • 指令格式: jcxz 标号,转移条件由寄存器cx给出,如果(cx) = 0,则跳转到标号处执行。当(cx)不等于0时,程序继续向下执行,不跳转。

loop指令,段转移指令

  • 对IP修改范围为-128~127,指令格式loop 标号,转移条件也是由寄存器cx给出,跟jcxz不同的是只有当cx中内容不为0时loop才正常跳转。每次跳转之后cx中的值自减1。

根据位移进行转移的意义

  • jmp short 标号,jmp near ptr 标号,jcxz 标号,loop标号,这几种汇编指令对IP的修改时根据转移目的地址和转移起始地址之间的位移来进行的,即对应的机器码中不包含转移目的地址,而包含的是到目的地址的位移距离。
posted @   肖肖凯  阅读(408)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示