本系列将讲解《汇编语言》一书,本节讲解**【汇编语言】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)将当前的IP或CS和IP压入栈中;
(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
;剩下子程序代码
;.....

最低0.47元/天 解锁文章

1693

被折叠的 条评论
为什么被折叠?



