【汇编语言】10-ret和call指令与子程序


公粽号「专注Linux」,专注Linux内核开发

本系列将讲解《汇编语言》一书,本节讲解**【汇编语言】10-ret和call指令与子程序**。


本节速览
1.ret指令的本质是?能够用其他指令表示?
2.retf和ret指令的区别是?
3.call指令的本质是?能够用其他指令表示?
4.call指令有哪几种用法(分类)?
5.mul指令怎么使用?有哪几个专属寄存器?
6.参数和结果传递的本质是?
7.批量数据如何传递?
8.如何解决数据传输过程中的寄存器冲突的问题?
9.子程序的标准模版是?

导读:

call 和ret 指令都是转移指令,它们都修改IP,或同时修改CS和IP。它们经常被共同用来实现子程序的设计。这一章,我们讲解call和ret指令的原理以及规范子程序编写流程。

1.ret指令

ret 指令用栈中的数据,修改IP的内容,从而实现近转移;

CPU的执行ret时的工作
(IP)=((ss)*16+(sp))
(sp)=(sp)+2

等价于汇编语言:

pop IP  

2.retf指令

retf指令用栈中的数据,修改CS和IP的内容,从而实现远转移;

CPU的执行retf时的工作
(IP)=((ss)*16+(sp))
(sp)=(sp)+2
(CS)=((ss)*16+(sp))
(sp)=(sp)+2 

等价于汇编语言:

pop IP
pop CS

3.call指令

1.CPU的动作

CPU执行call指令时,进行两步操作:

(1)将当前的IPCSIP压入中;

(2)转移

2.call的分类

call指令不能实现短转移除此之外,call指令实现转移的方法和jmp指令的原理相同,我们可以以转移目的地址不同方法为主线,讲解call指令的主要应用格式

call指令格式 举例
call 标号A call 标号A(将当前的IP压栈后,转到标号处执行指令),实现的是段内转移
call far ptr 标号A 相较之于上一个,实现的时段间转移
call 16位reg 这是转移地址在16位寄存器中的转移
call word ptr 内存单元地址 这是转移地址在内存单元中的转移,仅仅压入IP
call dword ptr 内存单元地址 这是转移地址在内存单元中的转移,压入IP和CS

4.mul指令

数据位数 默认存储位置 乘数1 乘数2
8 AX AL 8位reg或者内存字节单元
16 高位DX,低位AX AX 16位reg或者内存字节单元

格式:

mul reg

mul 内存单元

5.参数和结果的传递与存储问题

本质:我们探讨参数和返回值传递的问题,本质上就是在探讨如何存储子程序需要的参数和产生的返回值的问题。


(1)参数存储在哪里?

可以存储在寄存器中。但是如果参数太多,寄存器不够,也可以存储在首地址开头内存单元中。


(2)计算的返回值,存储在什么地方?

和参数存储一致。


6.子程序的标准框架

子程序的框架就是利用call和ret指令实现参数、结果合理存储转移的过程:
标准框架

类似于如下:

show_str:                   ;开始保存某程序中的数据
    push ax
    push bx
    push cx
    push dx
    push si
    push di
    push es
    
    ;剩下子程序代码
    ;.....
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值