程序集如何访问/存储堆栈上的变量
发布时间: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代码被转换为程序集(在机器代码中,但程序集是它的可读形式).那么程序集如何支持读取不在堆栈顶部的变量? 提前致谢 解决方法
编译器正在生成程序集,每个指令集可能不同,但在一天结束时,堆栈只是一个寄存器,其中包含一个存储器地址.编译器正在创建并知道它正在创建的函数的整个范围,并知道在堆栈中查找本地数据项的每个数据项的距离,因此它将根据该指令集创建适当的代码以访问本地数据项.项目.
你需要一些指令集来复制堆栈指针和/或用堆栈指针作为操作数进行数学运算,但是那些其他寄存器作为数学运算的结果,然后基于该数学运算(例如堆栈指针8个字)你访问该内存地址.某些指令集具有寻址模式,您可以在加载或存储中将偏移量应用于堆栈指针,数学运算是指令执行的一部分,您不必使用中间结果和寄存器. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |