8086转移指令
8086转移指令
8086的控制转移指令可以由如下表表示:
本文重点解析JMP
,CALL
与INT
指令
补充内容
PTR
指令:
PTR
是一个伪指令(pseudo-instruction),用于指示编译器或汇编器如何解释后续的内存操作数的类型和大小。举例:PTR
用于指定操作数是字节(BYTE)、字(WORD)、双字(DWORD)等不同大小,从而帮助汇编程序正确生成访问内存所需的有效地址和操作码
FAR
类型
FAR 是一个源自早期计算机体系结构和编程环境(6位系统)的指针类型修饰符:
- Far Pointer: 在16位系统中,由于寻址能力的限制,内存访问被分为“段:偏移”形式。一个“far”指针包含一个段地址和一个偏移地址,能够访问整个1MB的地址空间,即所谓的“远”地址空间
随着32位系统的出现,使得所有指针都自然具有了“far”指针的寻址范围。因此,在32位及以上的体系结构中,far
和near
(原本指只能访问64KB段内地址的指针)失去了原有的意义,成为了兼容性的残留,通常被编译器忽略或者仅仅作为符号保留,没有实际的内存访问大小影响
转移指令
JMP
指令解析
JMP
指令可以有下面几种调用方式:
- 若需要调用的过程与调用前的代码在同一个代码段,就可以直接使用段内转移方式
- 如果调用方式为直接使用需要调用的标号,那么就是直接转移方式,直接转移方式可以进一步分为短转移与近转移方式
- 如果调用方式为地址表示,那么可以通过类似于
MOV
指令寻址的方式把这种间接转移分为寄存器与存储器
注意
在存储器取数据中,由于存储器不知道究竟需要多少位的数据,因此需要使用PTR
指令声明要从存储器中拿出多少位长的数据:
JMP WORD PTR 5[BX]
声明了从存储器取出一个字节的地址JMP DWORD PTR [DI]
声明了从存储器取出两个字节的地址
对于标号转移命令,类似存储器数据,由于也需要区分标号是否在同一个段内,因此需要也给标号前面加上NEAR PTR
或者FAR PTR
对寄存器的影响
- 对于段内转移,会更改
IP
的值,让IP
的值直接修改为对应调用过程的段内偏移地址 - 对于段间转移,会同时修改
CS
与IP
的值,让它们指向对应调用过程的段地址与偏移地址 JMP
指令不改变堆栈段的SS
与SP
,因为不须要返回,因此就不需要存下调用前的代码地址
CALL
指令解析
类似于JMP
指令调用的方式,就是将JMP
改为CALL
即可,但是这个指令会改变SS
与SP
:
- 对于段内转移指令,会执行
SP <- SP-2
将IP
入栈,再执行RET
指令的时候让IP
出栈 - 对于段内转移指令,会执行
SP <- SP-2
将CS
入栈,再执行执行SP <- SP-2
将IP
入栈(先CS
再IP
),RET
指令的时候让IP,CS
先后出栈