
AI-摘要
PrideLzh GPT
AI初始化中...
介绍自己 🙈
生成本文简介 👋
推荐相关文章 📖
前往主页 🏠
前往爱发电购买
6-堆栈的作用
pridelizihao一、过程调用和返回指令
(1)过程
过程
:汇编语言中的子程序称为过程(procedure),对应C语言中的函数。- 调用子程序(过程、函数)在本质上是控制转移,它与无条件转移的区别是调用子程序要考虑返回
(2)过程调用指令
名称 | CALL(过程调用指令) | |
---|---|---|
格式 | CALL LABEL |
|
动作 | 先把返回地址偏移(EIP内容)压入堆栈,然后给EIP赋值为目标LABEL的地址偏移,实现转移 | |
注意 | 返回地址 :紧随过程调用指令的下一条指令的地址(有效地址) |
|
目标地址 :子程序开始处的地址(有效地址) |
||
与无条件转移指令相比,过程调用指令CALL只是多了第一步(保存返回地址) |
(3)过程返回指令
名称 | RET(过程返回指令) |
---|---|
格式 | RET |
动作 | 从堆栈弹出地址偏移,并送到指令指针寄存器EIP |
注意 | 通常,这个返回地址就是在执行对应的调用指令时所压入堆栈的返回地址 |
过程返回指令的使用应该与过程调用指令相对应 | |
示例: |
1 | /* |
二、参数传递
(1)参数传递
参数传递
:主程序在调用子程序时,往往要向子程序传递一些参数;同样,子程序运行后也经常要把一些结果返回给主程序。主程序与子程序之间的这种信息传递被称为参数传递入口参数
:由主程序传给子程序的参数称为子程序的入口参数
出口参数
:由子程序传给主程序的参数称为子程序的出口参数- 一般而言,子程序既有入口参数,又有出口参数。但有的子程序只有入口参数,而没有出口参数;少数子程序只有出口参数,而没有入口参数。
(2)参数传递方式
- 有多种传递参数的方法∶寄存器传递法、堆栈传递法、约定内存单元传递法和CALL后续区传递法等。有时可能同时采用多种方法,根据具体情况而事先约定好
- 常用的两种方法:
方法 | 说明 | 特点 |
---|---|---|
寄存器传递参数 | 把参数放在约定的寄存器中,在主程序中将参数放入寄存器,在子程序中取出 | 实现简单和调用方便,但只适用于传递参数较少的情形 |
堆栈传递参数 | 主程序在调用子程序之前,把需要传递的参数依次压入堆栈,然后子程序从堆栈中取入口参数 | 不占用寄存器,也无需额外的存储单元。但较为复杂 |
示例: |
1 | /* |
堆栈传递参数的堆栈变化示意
三、局部变量
- 局部变量是高级语言中的概念。所谓局部变量指对其的访问仅限于某个局部范围。在C语言中,局部的范围可能是函数,或者是复合语句。局部变量还有动态和静态之分。
- 堆栈可以用于安排动态局部变量
示例:
1 | /* |
堆栈示意,安排局部变量并且由堆栈传递参数
评论
匿名评论隐私政策
TwikooValine
✅ 你无需删除空行,直接评论以获取最佳展示效果