【汇编语言/底层开发】10、CALL和RET指令

CALL和RET指令常常用来实现子程序的设计。这两个指令同jmp、loop、jcxz等指令同属于转移指令。

1、ret和retf

转移指令的主要功能就是修改CS和IP或者只修改IP的内容。其中ret利用栈中的数据修改IP的内容,从而实现近转移;而retf则通过使用栈中的数据同时修改CS和IP的值,实现远转移。

ret指令的作用相当于:

pop IP

retf指令的作用相当于:

pop IP
pop CS

ret和retf指令同程序的栈息息相关。通常情况下可以使用默认的栈空间,另外还可以自己定义一段内存为栈,并通过ss和sp指定位置,并在栈中存放数据来手动控制ret和retf指令执行后程序的走向。

2、call指令

call所进行的操作有:

①将当前的IP或CS+IP压入栈中;

②转移。

该指令不能实现短转移,除此之外该指令的转移方法类似于jmp指令。调用call指令总体上有4中方法:

(1)根据位移进行转移:

这一类调用的方法为直接call目标位置的标号:

call mark
该指令的作用等同于:

push ip
jmp near ptr mark
在call指令的这类调用方法的机器语言中不包含目标代码的实际位置,而是通过目标位置同当前指令的偏移来确定将要跳转到哪里,偏移的范围为-32768~32767。

(2)根据目的地址进行转移:

这一类调用方法实现的是段间的call方法,可以同时保存并修改CS和IP的值。调用方法为:

call far ptr mark
该指令的作用相当于依次将CS和IP压入栈中,然后跳转到目标地址,即:

push CS
push IP
jmp far ptr mark

(3)根据寄存器中的值进行转移

这种调用方式即直接使用寄存器中的值来改变ip的值,调用方法如下:

jmp ax

(4)根据内存地址中的值进行转移

这种调用方法有两种方式,分别实现对ip和cs及ip的修改:

①字型调用:实现对ip的修改

调用方式为:

call word ptr 内存地址
该指令将ip保存入栈中后,从目标内存地址中获取目标地并进行跳转,即:

push ip
jmp wort ptr 内存地址
②双字型调用:实现的ip和cs的修改

调用方式为:

call dword ptr 内存地址
调用时,首先依次将cs和ip保存入栈,随后根据内存地址获取双字型的目标地址进行跳转,即:

push CS
push IP
jmp far ptr 内存地址
同理,执行该指令后,双字型内存中的高位字赋予目标的段地址,低位字赋予目标的偏移地址。

3、mul指令

该指令实现乘法功能,默认使用的寄存器为ax(al)和dx。进行相乘的两个数必须同为8或16位;如果是8位乘法其中一个乘数位于al,另一个位于8位寄存器或内存中,乘积保存于ax;16位乘法的一个乘数位于ax,另一个位于16位寄存器或者内存中,乘积的高16为保存于dx,低16位保存于ax。

上一篇:源码分析Dubbo服务消费端启动流程


下一篇:awk详解