8086转移指令

8086转移指令

​ 8086的控制转移指令可以由如下表表示:

控制转移指令

​ 本文重点解析JMPCALLINT指令

补充内容

PTR指令:

PTR是一个伪指令(pseudo-instruction),用于指示编译器或汇编器如何解释后续的内存操作数的类型和大小。举例:PTR用于指定操作数是字节(BYTE)、字(WORD)、双字(DWORD)等不同大小,从而帮助汇编程序正确生成访问内存所需的有效地址和操作码

FAR类型

​ FAR 是一个源自早期计算机体系结构和编程环境(6位系统)的指针类型修饰符:

  • Far Pointer: 在16位系统中,由于寻址能力的限制,内存访问被分为“段:偏移”形式。一个“far”指针包含一个段地址和一个偏移地址,能够访问整个1MB的地址空间,即所谓的“远”地址空间

随着32位系统的出现,使得所有指针都自然具有了“far”指针的寻址范围。因此,在32位及以上的体系结构中,farnear(原本指只能访问64KB段内地址的指针)失去了原有的意义,成为了兼容性的残留,通常被编译器忽略或者仅仅作为符号保留,没有实际的内存访问大小影响

转移指令

JMP指令解析

JMP指令可以有下面几种调用方式:

JMP指令分类

  • 若需要调用的过程与调用前的代码在同一个代码段,就可以直接使用段内转移方式
    • 如果调用方式为直接使用需要调用的标号,那么就是直接转移方式,直接转移方式可以进一步分为短转移与近转移方式
    • 如果调用方式为地址表示,那么可以通过类似于MOV指令寻址的方式把这种间接转移分为寄存器与存储器

注意

​ 在存储器取数据中,由于存储器不知道究竟需要多少位的数据,因此需要使用PTR指令声明要从存储器中拿出多少位长的数据:

  • JMP WORD PTR 5[BX]声明了从存储器取出一个字节的地址
  • JMP DWORD PTR [DI]声明了从存储器取出两个字节的地址

​ 对于标号转移命令,类似存储器数据,由于也需要区分标号是否在同一个段内,因此需要也给标号前面加上NEAR PTR或者FAR PTR

对寄存器的影响

  • 对于段内转移,会更改IP的值,让IP的值直接修改为对应调用过程的段内偏移地址
  • 对于段间转移,会同时修改CSIP的值,让它们指向对应调用过程的段地址与偏移地址
  • JMP指令不改变堆栈段的SSSP,因为不须要返回,因此就不需要存下调用前的代码地址

CALL指令解析

​ 类似于JMP指令调用的方式,就是将JMP改为CALL即可,但是这个指令会改变SSSP

  • 对于段内转移指令,会执行SP <- SP-2IP入栈,再执行RET指令的时候让IP出栈
  • 对于段内转移指令,会执行SP <- SP-2CS入栈,再执行执行SP <- SP-2IP入栈(先CSIP),RET指令的时候让IP,CS先后出栈