汇编中的转移指令

记录下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

参考

汇编语言