汇编语言程序设计(九)转移指令的原理
目录
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的修改时根据转移目的地址和转移起始地址之间的位移来进行的,即对应的机器码中不包含转移目的地址,而包含的是到目的地址的位移距离。
分类:
汇编语言程序设计
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现