加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

程序集如何访问/存储堆栈上的变量

发布时间:2020-12-16 09:50:48 所属栏目:百科 来源:网络整理
导读:在汇编中您可以将数据存储在寄存器或堆栈中.在任何给定时刻只能访问堆栈的顶部(对吗?).考虑以下C代码: main(){ int x=2; func();}func( int x ){ int i; char a;} 在调用func()时,以下内容被推入堆栈(考虑一个32位系统): variable x (4 bytes,pushed by m
在汇编中您可以将数据存储在寄存器或堆栈中.在任何给定时刻只能访问堆栈的顶部(对吗?).考虑以下C代码:

main(){
    int x=2;
    func();
}

func( int x ){
    int i;
    char a;
}

在调用func()时,以下内容被推入堆栈(考虑一个32位系统):

variable x (4 bytes,pushed by main)
<RETURN ADDRESS> (4 bytes pushed by main?)
<BASE POINTER> (4 bytes pushed by func())
variable i (4 bytes,pushed by func())
variable a (1 byte,pushed by func())

我有以下问题:

>在C代码中,您可以从函数内的任何位置访问局部变量,但在汇编中,您只能访问堆栈顶部. C代码被转换为程序集(在机器代码中,但程序集是它的可读形式).那么程序集如何支持读取不在堆栈顶部的变量?
>在我的例子中,我是否遗漏了任何可能被推入堆栈的东西?
>在汇编中如果你在堆栈或int上推送一个char,它如何确定它需要推送4个字节还是1个字节?因为它使用相同的操作(推)对吗?

提前致谢
克. Maricruzz

解决方法

编译器正在生成程序集,每个指令集可能不同,但在一天结束时,堆栈只是一个寄存器,其中包含一个存储器地址.编译器正在创建并知道它正在创建的函数的整个范围,并知道在堆栈中查找本地数据项的每个数据项的距离,因此它将根据该指令集创建适当的代码以访问本地数据项.项目.

你需要一些指令集来复制堆栈指针和/或用堆栈指针作为操作数进行数学运算,但是那些其他寄存器作为数学运算的结果,然后基于该数学运算(例如堆栈指针8个字)你访问该内存地址.某些指令集具有寻址模式,您可以在加载或存储中将偏移量应用于堆栈指针,数学运算是指令执行的一部分,您不必使用中间结果和寄存器.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读