32 位 X86 中的局部变量和全局变量有啥区别?

Posted

技术标签:

【中文标题】32 位 X86 中的局部变量和全局变量有啥区别?【英文标题】:What's the difference between local and global variables in 32-bit X86?32 位 X86 中的局部变量和全局变量有什么区别? 【发布时间】:2014-11-18 02:40:24 【问题描述】:

我是 X86 汇编语言的初学者。有人可以举一个局部和全局变量的例子吗?特别是,它们是如何初始化的?它们存储在哪里?它们是如何访问的?

【问题讨论】:

全局变量参见here,本地变量参见here。 感谢@kirbyfan64sos。如果你能提供一个例子,那就太好了。我很难整理通过 Google 找到的所有相关信息。 【参考方案1】:

在 x86 汇编中,全局变量也称为静态数据区域。您可以找到一个很好的教程 here - 我从中粘贴了一些信息。下面是一个声明全局变量的例子:

.DATA           
var DB 64 ; Declare a byte, referred to as location var, containing the value 64.
var2 DB ? ; Declare an uninitialized byte, referred to as location var2.
DB 10 ; Declare a byte with no label, containing the value 10. Its location is var2 + 1.

然后可以从代码中的任何位置以任何方法访问全局变量,而无需将它们作为参数传递。

局部变量存储在堆栈空间中,一般通过将它们复制到寄存器、进行计算并将它们放回堆栈来进行处理。

假设您要调用一个函数。您传递给函数的参数将是该函数的局部变量。

push [var] ; Push last parameter first
push 216   ; Push the second parameter
push eax   ; Push first parameter last
call _myFunc ; Call the function (assume C naming)
add esp, 12 ; Just discard the locals

代码进入函数时,需要从栈中取出,使用pop:

pop eax ; get the value you passed as eax content
pop ebx ; get 216 in ebx
pop ecx ; get [var] in ecx

因此,在 eax、ebx、ecx 中,您有局部变量的值。修改它们后您可以随时将它们再次放入堆栈并根据需要将它们弹出

希望这会有所帮助。

【讨论】:

如果变量是全局变量,即它们只存在于 .data 段下,函数(方法)是否可以看到并使用该变量而不必将变量作为参数传递? 是的。他们能。我将其添加到响应中。谢谢。

以上是关于32 位 X86 中的局部变量和全局变量有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

静态存储变量STATIC有啥用举个例吧,好像和全局变量还有些联系啊

本地 和 实例 变量之间有啥区别

C++中的全局变量普通局部变量和静态局部变量的区别

使用 scanf 进入全局或局部变量(在堆栈上),32 位调用约定

Python中的全局变量与局部变量的区别

VC中public定义的变量与全局变量的区别??