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 偏移地址 段地址