这篇文章是在学习过程中对于转移地址偏移地址的理解以及网上缺乏帮助理解计算转移地址偏移地址的前提下诞生的。初次写知识点分享,如有误,请指出多包含。
JMP是在编写程序中经常使用的指令,它的功能是转移到指令指定的地址执行相应的指令。实际用法如下:
1,段内直接转移
1)短转移
JMP SHORT 转移地址标号
功能:改变IP;(即:(IP)=(IP)+8位位移量
其中:式子右边(IP)为JMP后第一个字节的偏移地址;8位位移量为JMP机器指令中EB后接的16进制数值。
下边我们通过一道例题理解JMP指令转移地址偏移地址
例题:设有一段程序如下,假定(CS)=1000H
汇编语言 | 机器指令 | 偏移地址 | 短地址 |
XOR BX,BX JMP SHORT NEXT ADD AX,BX
MOV BX,AX NEXT:MOV AX,1 | 33 DB EB 04 03 C3 8B D8 B8 0001 | 0000 0002 0004 0006 0008 | 1000 1000 1000 1000 1000 |
由表中程序我们可知,JMP的八位位移量为0004H;
JMP后第一个指令即指令(ADD AX,BX)第一个字节的偏移地址为0004H;
故执行JMP后,所得
转移地址偏移地址=(IP)+位移量=0004H+0004H=0008H
段内转移,故转移地址段地址=(CS)=1000H
故转移后物理地址=1000H×16+0008H=10008H
2)段内直接近转移
jmp near ptr 转移地址标号
或 JMP 数值偏移地址
功能:(IP)=(IP)+16位位移
与JMP SHORT的区别在于JMP NEAR PTR 转移的距离更远。SHORT转移范围为-128~127个字节;JMP NEAR PTR为-32768至32767。
例:将上例的(CS)改为1003H;
JMP SHORT NEXT 改为
JMP NEAR PTR NEXT
此时JMP的机器指令随之变为 E9 04 00 占用3个字节,故JMP后第一个指令即指令(ADD AX,BX)第一个字节的偏移地址也随之更改为0005H
故执行JMP后,所得
转移地址偏移地址=(IP)+位移量=0005H+0004H=0009H
段内转移,故转移地址段地址=(CS)=1003H
故转移后物理地址=1003H×16+0009H=10039H
注意,在E9 04 00中,04为低字节,00为高字节
(以下用法偏移地址计算类似,故不再举例。
2.段间间接转移
1)jmp 16位寄存器名
功能:用寄存器中的值修改IP
2)jmp WORD PTR 存储器寻址方式
或 jmp 存储器寻址方式
功能:将存储单元的第一个字赋值给(IP)
例:TABLE偏移地址为0010H,(DS)=1000H,(10015H)=12H,(10016H)=34H,(BX)=0005H 指令为:
JMP WORD PTR TABLE[BX]
由TABLE[BX]可知寻的的地址为:1000H*16+(0010H+0005H)=10015H;
其第一个字的值为3412H;故执行JMP后(IP)=3412H。
3.段间直接转移
1) JMP FAR PTR 转移地址标号
功能:用转移地址标号的段地址和偏移地址分别修改CS和IP
(CS)=转移地址标号所在段的段地址;(IP)=转移地址标号所在段的偏移地址
2)JMP 段地址值:偏移地址
(IP)=偏移地址值
(CS)=段地址值
4.段间间接转移
JMP DWORD PTR 存储器寻址方式
功能:(IP)=寻址所得的存储单元的第一个字
(CS)=寻址所得的存储单元的第二个字