汇编有局部变量???

natrium11 2001-08-01 06:13:17
加精
“addr可以处理局部变量而 offset 则不能。局部变量只是在运行时在堆栈中分配内存空间。而 offset 则是在编译时由编译器解释,这显然不能用offset 在运行时来分配内存空间。编译器对 addr 的处理是先检查处理的是全局还是局部变量,若是全局变量则把其地址放到目标文件中,这一点和 offset 相同,若是局部变量,就在执行 invoke 语句前产生如下指令序列:
lea eax, LocalVar
push eax
因为lea指令能够在运行时决定标号的有效地址,所以有了上述指令序列,就可以保证 invoke 的正确执行了。”

请问这句话中的“局部变量”是什么意思?用GlobalAlloc分配的吗?可那时指针是标号地址的内容,直接用标号就可以了啊!
难道可以“声明”“局部变量”?

另外一个相关的问题,用汇编怎样实现递归?在栈中分配活动记录吗?那用系统栈还是自定义栈?
自定义的话如何确定大小?
...全文
340 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
roy_hu 2001-09-12
  • 打赏
  • 举报
回复
什么叫系统栈和自定义栈?
azuo_lee 2001-08-02
  • 打赏
  • 举报
回复
1。局部变量是分配在栈上的,在某个函数中一般例行的工作是:
push ebp ;保存ebp
mov ebp, esp ;取到栈指针
sub esp, 20 ;为局部变量分配栈空间,这里为五个4字节局部变量(如32位整型量)
...
mov eax, [ebp-4] ;存取第一个局部变量
...
mov ebx, [ebp+8] ;存取最后压入堆栈的函数实参(如果是c或stdcall调用规则,此处即是
;函数参数表中的第一个参数,pascal调用则是最后一个)
... ;ebp-4处是第一个局部变量,ebp+0是保存的ebp值,ebp+4是返回地址,
;ebp+8开始是压入堆栈的实参。
add esp, 20 ;或者是mov esp, ebp,释放局部变量,恢复栈指针
pop ebp ;恢复ebp
ret xx ;对stdcall或pascal调用,需要清理掉xx个函数参数;对于c调用,直接
;ret即可
高档的CPU支持ENTER与LEAVE指令完成局部变量空间的分配与释放工作。汇编器一般也提供了宏或关键字来完成这些工作(MASM中是local var_name:var_type?记不清了)。

2。递归调用使用系统栈与自定义栈均可。使用系统栈编程容易一些。无论使用哪种栈,都必须考虑栈的大小,避免栈溢出。至于到底要多大的栈,这要根据你的递归深度和递归函数使用的局部变量空间大小来决定。
natrium11 2001-08-01
  • 打赏
  • 举报
回复
如何分配?语法?(比如说如何“声明”局部变量LocalVar?)
Areslee 2001-08-01
  • 打赏
  • 举报
回复
汇编中的局部变量跟C中的一样是从栈中分配的。

21,459

社区成员

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

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