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。