【笔记】汇编中jmp指令的相关处理

0x01 前记

编译器有一个地址地址计数器(AC),编译器在编译的过程中,每读到一个字节AC就加1.

0x02 jmp指令之向前转移

在向前转移时,编译器可以在读到标号s后记下AC的值as,在都到jmp ... s后记下 AC的值aj。编译器计算而这的差值disp。

  • 当disp在-128到127之间,编译指令不管是
    • jmp s
    • jmp short s
    • jmp near ptr s
    • jmp far ptr s
      中的哪一个,都将它转变为jmp short s,并写入机器码 EB disp
  • 当disp在-32768到32767之间,那么
  • jmp short s则会产生编译错误;
  • 对于jmp s和jmp near ptr s,都会当作jmp near ptr s看待,写入机器码 E9 disp
    -对于jmp far ptr s,会写入机器码 EA 偏移地址 段地址

0x03 jmp指令之向后转移

在这种情况下,编译器先读到jmp ... s指令。由于它还没有读到标号s,所以编译器此时还不能确定标号处的ac值,那么disp的值也不能确定。
此时,编译器将jmp ... s指令当作jmp short s来读取,记下jmp ... s指令的位置和ac的值。

  • 对于jmp short s,将生成EB和一个nop指令(相当于一个字节空间,存放8位disp)
  • 对于jmp s和jmp near s,将生成EB和两个nop指令
  • 对于jmp far ptr s,将生成EB和四个nop指令
    当向后读取到标号s时,记下ac的值,然后计算disp
  • 当disp的值在-128到127之间
    • 不管指令是哪种,都会在前面jmp ... s的地方写入EB disp
  • 当disp的值在-32768到32767之间
    • 对于jmp short s会产生错误
    • 对于jmp s和jmp near ptr s将会写入E9 disp
    • 对于jmp far ptr s将会写入EA 偏移地址 段地址

你可能感兴趣的:(【笔记】汇编中jmp指令的相关处理)