记录下jmp, jcxz, loop, ret, retf, call等转移指令的概念和使用。
jmp 指令
概念:
无条件转移指令,可以只修改IP,或者同时修改CS 和 IP。
指令格式:
分为三种:
jmp 标号
jmp 16位寄存器/reg
jmp 内存单元地址
其中, jmp 标号 又细分为:
jmp short 标号
段内短转移,修改IP
8位位移,范围为-128~127。
如果jmp 后的那条指令的IP地址与标号处的IP地址相距超过127个字节,会出现越栈。
jmp near ptr 标号
段内近转移,修改IP, 与jmp short 标号 非常相近。
16位位移,范围为-32768~32767。
jmp far ptr 标号
段间转移,远转移。
其中,(CS)= 标号所在段的段地址,(IP)= 标号在段中的偏移地址
在debug 模式下使用u命令可以比较清晰的看到CS和IP的值。
jmp 内存单元地址 也细分为:
jmp word ptr 内存单元地址
段内转移。
(IP)= (内存单元地址)
jmp dword ptr 内存单元地址
段间转移。
(CS)= (内存单元地址 + 2),(IP)= (内存单元地址)
jcxz 指令
概念:
有条件转移指令,所有的有条件转移指令都是短转移。
指令格式:
jcxz 标号
相当于:
if ((cx)==0) jmp short 标号;
另有与cmp 组合使用的条件转移指令:je, jne, jb, jnb, ja, jna等。
loop 指令
概念:
循环指令,所有的循环转移指令都是短转移。
指令格式:
loop 标号
相当于:
(cx)--;
if ((cx)!=0) jmp short 标号;
ret 指令 & retf 指令
概念:
两者都是转移指令,ret 用栈中的数据修改IP的内容,从而实现近转移。retf 用栈中的数据修改 CS 和 IP的内容,从而实现远转移。
指令格式:
ret
retf
执行 ret 相当于:
pop IP
执行 retf 相当于:
pop IP
pop CS
call 指令
概念:
转移指令,CPU 执行 call 指令时,进行两步操作:先将当前的IP或CS压栈,随后转移。
指令格式:
同jmp 一样,分为三种:
call 标号
call 16位寄存器/reg
相当于:
push IP jmp 16位reg
call 内存单元地址
其中,call 标号 细分为:
call 标号
相当于:
push IP jmp near ptr 标号
同ret 正好对应入栈出栈。
call far ptr 标号
相当于:
push CS push IP jmp far ptr 标号
同retf 正好对应入栈出栈。
同样,对应jmp, call 内存单元地址 细分为:
call word ptr 内存单元地址
段内转移。
相当于:
push IP jmp word ptr 内存单元地址
call dword ptr 内存单元地址
段间转移。
相当于:
push CS push IP jmp dword ptr 内存单元地址
通常 可以使用call 和 ret 来实现子程序机制,比如:
assume cs:code
code segment
start: ......
......
call sub
......
......
mov ax, 4c00h
int 21h
sub: ......
......
ret
code ends
end start