本博文是对原书8.3.10的内容的总结。
### 一、相对短转移
指令格式是:
~~~
jmp short 标号
~~~
标号也可以替换成具体的数值(标号和数值是等价的),例如
~~~
jmp short 0x2000
~~~
说明:
(1)该指令属于段内转移指令,而且只允许转移到距离当前指令-128~127字节的地方。
(2)指令的功能是:(IP) = (IP)+8位位移量(范围是-127~128,用补码表示)
(3)short指明此处的位移为8位
(4)8位位移=标号处的地址-jmp指令后的第一个字节的地址;8位位移由编译器在编译时算出;
### 二、16位相对近转移
指令格式是:
~~~
jmp near 标号
~~~
同理,标号也可以是具体的数值,如
~~~
jmp near 0x3200
~~~
说明:
(1)该指令属于段内转移,转移范围是-32768~32767
(2)指令的功能是:(IP)= (IP)+16位位移量(范围是-32768~32767,用补码表示)
(3)near指明此处的位移为16位
(4)16位位移=标号处的地址-jmp指令后的第一个字节的地址;16位位移由编译器在编译时算出;
注意:如果没有指定关键字是near或者short,那么NASM编译器会根据目标位置距离当前指令的位移量自动选择near(范围在-127~128内)或者short(范围在-127~128外,但是在-32768~32767内)。
### 三、16位间接绝对近转移
指令格式为:
~~~
jmp (near) r16/m16
~~~
说明:
(1)这种转移也是段内转移,但是转移的目标不是在指令中直接给出,而是由一个16位的通用寄存器或者内存地址间接给出
(2)near关键字可以省略
(3)执行时,处理器将用16位通用寄存器的值或内存中的那个字取代IP寄存器的内容。
### 四、16位直接绝对远转移
指令格式为:
~~~
jmp 段地址:偏移地址
~~~
说明:
(1)属于段间转移
(2)执行时,处理器用段地址的内容取代CS的值,用偏移地址(也可以是标号)取代IP的值
### 五、16位直接绝对远转移
指令格式为:
~~~
jmp far m32
~~~
说明:
(1)关键字far是必须的
(2)操作数是一个内存地址,内存地址处存放着2个字,低字是偏移地址,高字是段地址
(3)执行时,处理器根据内存地址找到偏移地址和段地址,分别用来代替IP和CS的内容
(完)