1.定义:
可以修改IP,或者同时修改CS和IP的指令统称为转移指令。
2.操作符OFFSET
offset是取得标号距离代码段的偏移地址:(例如)
assume cs:codesg
codesg segment
start: mov ax, offset start %相当于将start到code段开始的偏移地址(0),移到ax中
S: mov ax, offset s %相当于将s到code段开始的偏移地址(3),移到ax中
codesg ends
end start
3.指令JMP
jmp指令可以修改:IP或者同时修改IP和CS。但是怎样修改呢?,一般来说JMP指令要给出两种信息才能够修改:
(1)转移的目的地址;(2)转移的距离(分为:段间转移;段内短转移;段内近转移)
下面列出jmp指令不同的给地址方式:(注意观察每种方式的跳转范围,超出范围编译器将报错)
- 直接给出偏移地址:
- jmp short 标号 -> 跳转到标号处继续程序,该指令将会修改IP的值
- 修改范围:段间短转移 -128~127范围(8位补码)
- 进一步理解:
上述指令在被编译成为机器语言的时候,会被编译为EB XX形式。
机器指令中:EB是JMP指令,而XX代表的是一个偏移地址,是一个编译器帮忙算出来的、相对于此跳转指令的下一个指令位置的偏移位移。(为什么?思考CPU指令执行过程:是先修改IP的值,再执行指令)
- jmp near ptr 标号 与上面指令功能相近, 实现段内近转移 -32768~32767(16位补码)
- jmp far ptr 标号 ->段间转移,该指令同时修改CS和IP,跳到另外一个段的标记位置;在机器码中会被翻译成:JMP XXXX:XXXX 形式
- 通过寄存器给出偏移地址:
- jmp 寄存器号 ->修改IP为寄存器内容
- 通过内存单元给出地址:
- jmp word ptr 内存地址 ->段内转移;内存单元处放着一个字,是转移目的的偏移地址;修改IP的值为内存单元中的内容。
- jmp dword ptr 内存地址 -> 段间转移;内存单元处存放着两个字,高地址处存放的是段地址,低地址存放偏移地址;修改CS为(内存单元+2),修改IP为(内存单元)
- 条件转移指令:JCXZ 标号 -> 如果CX寄存器值为零则跳转;跳转距离同短转移的相同
- 特殊跳转指令:loop 标号 -> 如果CX寄存器不等于0,则跳转到标号处
4.为什么根据位移来寻找地址? 因为偏移量不依附于大环境,只跟程序内相对地址有关,方便重定位等操作。
网友评论