汇编怎么处理高级语言中的变量?

zhou_lei 2008-09-18 11:04:28
本人猜想:
高级语言中的局部变量,在汇编里就是用栈实现的
全局变量,初始化时就是放在一块固定的内存里面

小弟刚学汇编不久,喜欢乱想象,希望高手指点下!
...全文
155 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
疯哥哥 2008-09-19
  • 打赏
  • 举报
回复
局部变量在栈里,
已经初始化的全局变量在DATA段,
没有初始化的在BSS段
XXX.c
short n;
int i;//假定int为32位.short为16位

XXX.asm
;如果使用了.model C就直接
EXTRN n:WORD
EXTRN i:DWORD
;否则加 下划线,一般的ABI都这样规定C命名格式
;加了.model C 的时候编译器会自动帮你加下划线
EXTRN _n:WORD
EXTRN _i:DWORD

链接的时候把两个obj文件link上就好了.嗯,汇编的obj文件格式,最好使用COFF
嗯,C要使用汇编里面的变量的话,
XXX.asm
PUBLIC n,i
.data
_n DW ?
_i DD ?

XXX.c
extern int i;
extern short n;

大致就这样,你可以在网上搜搜这方面的东东.待会儿我发个日志YY一下...
cnf 2008-09-19
  • 打赏
  • 举报
回复
楼上几位说的都是编译器处理的结果。
楼主应该不是这意思。
zuo53664640 2008-09-19
  • 打赏
  • 举报
回复
;函数入口处
push bp
mov bp, sp
sub sp, NN ;NN表示所有局部变量储存空间的总大小
;函数中保持bp不变
;用[bp-n]访问局部变量
;用[bp+n]访问函数参数
;函数结尾处
mov sp, bp
pop bp
ret
如果是32位程序,用ebp和esp。

大哥你的话不是很懂,能详细说下吗??

sp不是一直指向栈顶,mov sp,bp后 bp也指向栈顶 那[bp-n]为何能访问局部变量,说细点好吗,我初学者!!
cnzdgs 2008-09-19
  • 打赏
  • 举报
回复
;函数入口处
push bp
mov bp, sp
sub sp, NN ;NN表示所有局部变量储存空间的总大小
;函数中保持bp不变
;用[bp-n]访问局部变量
;用[bp+n]访问函数参数
;函数结尾处
mov sp, bp
pop bp
ret
如果是32位程序,用ebp和esp。
大熊猫侯佩 2008-09-19
  • 打赏
  • 举报
回复
动态局部变量放在stack中,全局变量和静态局部变量放在heap中。
笨鸟无敌 2008-09-19
  • 打赏
  • 举报
回复
嗯,与我理解的基本一至.我感觉它们都是存放于由汇编程序可使用的内存单元组成的一小节内存,只不过是局部变量存放处的内存为汇编程序的指定栈空间吧.
2楼历害,给出了具体局部变量使用的方法呵.
如果没理解错的话,意思就是函数中封闭当前栈顶指针,以其为分界点,分配栈堆外最近的相应空闲栈空间给局部变量使用.剩余部分分配给函数栈操作使用.而原栈堆内的数据做为在函数体外注入的参数.(如下图呵.)
个人认为这种方法需要注意:
1.函数体中,在MOV BP,SP后,应保持BP值不变.以便能准确复位SP.
2.为配合栈操作特点,建议NN取值最好使用偶数.





□    函数体内栈堆

□    ------┘
□SP-NN ------┐

□ 函数体内
□ 局部变量使用栈空

□ ------┘
□SP ------┐

□ 函数体外栈堆
cnzdgs 2008-09-19
  • 打赏
  • 举报
回复
补充一下,全局变量是分配在数据区里面,用直接寻址(变量地址)的方式访问。

To 3楼:
mov sp, bp是在函数返回前执行的,目的是恢复栈指针,此时已经不会再使用变量了。

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧