前言
在汇编语言中有一些指令在机器码中是通过位移来转移的,就比如说:jmp short指令、jmp near ptr指令、jcxz指令和loop指令,这些指令在机器码中给出的都不是地址,而是位移,我们要用IP值去加上这个位移才能得到新的IP值。
妙用:
一旦编译成功就不会改变机器码,所以可以通过复制一段转移指令的代码来实现一个固定位移的跳转。
汇编16中的经典示例:
assume cs:codesg
codesg segment
mov ax, 4c00h
int 21h
start: mov ax, 0 ;只是凑三个字节的代码,不必理会
s: nop ;nop占一个字节,在之前文章有提及
nop
mov di, offset s ;offset即取标号偏移地址,详情见之前文章
mov si, offset s2
mov ax, cs:[si] ;代码段中偏移地址为si处的机器码赋给寄存器ax
mov cs:[di], ax ;把ax中的机器码赋给代码段中偏移地址为di处的内存
s0: jmp short s ;这是一个普通的跳转
s1: mov ax, 0 ;凑字节的三行代码
int 21h
mov ax, 0
s2: jmp short s1 ;机器码EBF6,即位移是-10,前面代码复制时也是复制的机器码
nop
codesg ends
end start