转移指令是可以修改IP,或同时修改CS和IP的指令
offset 是用于提取标号偏移地址的操作符
jmp在第2章里说到时用于修改IP或同时修改CS和IP的转移指令,这章里单独的jmp指令是一个无条件的转移指令
jmp short 标号 是实现段内短转移
jmp near ptr 标号 是实现段内近转移
这两条指令的机器码都没有记录要转移的目的地址,而是记录着执行jmp指令后第一个字节的地址到目的地址的位移量
而 jmp short 标号 的位移量只有8位(-128~127)
jmp near ptr 标号 的位移量就是16位(-32768~32767)
可以通过书本上的一段代码可以观察到:
这是书本上让我们分析的一段奇怪的代码
assume cs:code
code segment
mov ax,4c00h
int 21h
start: mov ax, 0
s: nop
nop
mov di, offset s
mov si, offset s2
mov ax, cs:[si]
mov cs:[di], ax
//这是把S2标号所对应地址的机器码,
//复制给S标号所对应地址的内存单元里
s0: jmp short s
s1: mov ax,0
int 21h
mov ax,0
s2: jmp short si
nop
code ends
end start
通过debug可以观察到:·
由图可以看到s2标号处的jmp指令所对应的机器码是EBF6
那么mov di, offset s
mov si, offset s2
mov ax, cs:[si]
mov cs:[di], ax
这4条指令执行后,s标号处地址对应的内存单元存储着EBF6这机器码
而F6转为有符号的十进制是-8,就是说当指令执行到 jmp short s时,就转移到s标号处执行下一条指令,而这条指令的机器码是EBF6,而这指令的解释是(标号所对应的地址-8),
得到的地址就是1455:0000,那么转移到1455:0000处继续执行指令,这地址内存单元存储的指令是mov ax,4c00h
jmp far ptr 标号 是实现段间转移,又称为远转移,它的转移时通过指明目标的CS:IP实现的。
jmp word ptr (内存单元地址)这是通过内存单元里的数据来指明转移地址
jmp dword ptr (内存单元地址) 这是通过内存单元里的数据来指明转移的IP和CS
jcxz 这是条件转移指令(所以条件转移指令都是短转移),这条件是cx 为 0 才进行转移
之前所学的loop指令是属于转移指令(所有的循环指令都是短指令)