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

简介: CALL和RET指令常常用来实现子程序的设计。这两个指令同jmp、loop、jcxz等指令同属于转移指令。 1、ret和retf 转移指令的主要功能就是修改CS和IP或者只修改IP的内容。

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。

目录
相关文章
|
3月前
|
存储 程序员
【汇编】“转移”综述、操作符offset、jmp指令
【汇编】“转移”综述、操作符offset、jmp指令
|
存储
汇编语言中“$”的作用
汇编语言中“$”的作用
722 0
汇编语言中“$”的作用
|
3月前
汇编指令学习(CALL,JMP,RET)
汇编指令学习(CALL,JMP,RET)
24 0
|
3月前
汇编指令学习(LOOP)
汇编指令学习(LOOP)
14 0
|
3月前
|
存储 程序员 开发者
【汇编】其他转移指令、call指令和ret指令
【汇编】其他转移指令、call指令和ret指令
|
8月前
|
C++
VS code 编写汇编代码【微机原理】3
VS code 编写汇编代码【微机原理】3
48 0
|
5月前
|
C++
汇编 -- c++/c 多函数调用
汇编 -- c++/c 多函数调用
23 0
|
11月前
|
存储 JavaScript
x86汇编基础指令
x86汇编基础指令
x86汇编基础指令
|
存储 编译器 API
Win32汇编:过程与宏调用
在计算机领域,堆栈是一个不容忽视的概念,堆栈是一种`后进先出(LIFO,Last-In,First-Out)`的数据结构,这是因为最后压入堆栈的值总是最先被取出,而新数值在执行PUSH压栈时总是被加到堆栈的最顶端,数据也总是从堆栈的最顶端被取出,堆栈是个`特殊的存储区`,主要功能是暂时存放数据和地址,通常用来保护断点和现场.
89 0
|
存储 程序员
Win知识 - 程序是怎样跑起来的——汇编语言的语法是“操作码+操作数”
Win知识 - 程序是怎样跑起来的——汇编语言的语法是“操作码+操作数”
90 0
Win知识 - 程序是怎样跑起来的——汇编语言的语法是“操作码+操作数”