首页 > 代码库 > 汇编语言笔记 转移指令的原理
汇编语言笔记 转移指令的原理
?8086CPU转移指令分类
- 无条件转移指令(如:jmp)
- 条件转移指令
- 循环指令(如:loop)
- 过程
- 中断
?操作符offset
offset在汇编语言中是由汇编器处理的符号,它的功能是取标号的偏移地址。
?jmp指令
类型 | 功能 | 示例 |
jmp short 标号 (段内短转移) | assume cs:codecode segmentstart: mov ax, 0 jmp short s add ax, 1s: inc axcode endsend start | |
jmp near ptr 标号 (段内近转移) |
| |
jmp far ptr 标号 (段间转移) | assume cs:codecode segmentstart: mov ax, 0 mov bx, 0 jmp far ptr s db 256 dup (0)code endsend start | |
jmp 16位reg (段内转移) | 设置:(IP)=(16位reg) 编译器根据情况判断段内short/near转移 |
|
jmp word ptr 内存单元地址 (段内转移) | mov ax, 0123Hmov ds:[0], axjmp word ptr ds:[0] | |
jmp dword ptr 内存单元地址 (段间转移) | mov ax, 0123Hmov ds:[0], axmov word ptr ds:[2], 0jmp dword ptr ds:[0] | |
jmp 2000:0100 (段间转移) |
|
- 举例说明:
?条件转移指令和循环指令
所有的有条件转移指令和循环指令都是短转移,在对应的机器码中包含转移的位移,而不是目的地址,而不是目的地址。对IP的修改范围都为:-128~127。
类型 | 功能 |
jcxz (条件转移指令) | |
loop (循环指令) |
|
?根据位移进行转移的指令
1 jmp short 标号2 jmp near ptr 标号3 jcxz 标号4 loop 标号
等几种汇编指令,它们对IP的修改是根据转移目的地址和转移起始地址之间的位移(补码)来进行的,而不是在对应的机器码包含转移的目的地址。
分析一个奇怪的程序:
1 assume cs: codesg 2 3 codesg segment 4 mov ax, 4c00h 5 int 21h 6 7 start: 8 mov ax, 0 9 s: nop ;jmp short s110 nop11 12 mov di, offset s13 mov si, offset s214 mov ax, cs:[si]15 mov cs:[di], ax16 17 s0: jmp short s18 19 s1: mov ax, 020 int 21h21 mov ax, 022 23 s2: jmp short s124 nop25 26 codesg ends27 28 end start
通过debug查看汇编指令,就可以知道这个程序为什么可以正常退出啦
汇编语言笔记 转移指令的原理
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。