Globals 很好,它们在嵌入式产品中占有一席之地,尤其是在资源极为紧张的微控制器等嵌入式产品中。 Globals 可以让您轻松管理您的资源,而当地人非常活跃,充其量也很难不惹上麻烦。
但是...就汇编而言,没有规则,没有真正意义上的本地与全局概念,严格来说是更高级别的语言。现在可能存在允许/强制执行此类操作的汇编语言的实现,请了解 C 是一种跨平台的标准(与其他标准一样),并不特定于某个平台。但是组装不仅没有标准,而且是特定于处理器的。汇编语言由汇编器(解析它并将其转换为机器代码的程序)定义。任何人和他们的兄弟都可以拼凑出一个汇编程序,并组成他们想要的任何语言或规则。
一般来说,如果您试图在汇编中手动实现 C 代码,而不是让编译器来做(或者不是让编译器来做,至少看看它做了什么)。除非优化,否则您的全局变量将在 ram 中找到一个家。局部变量可能会或可能不会取决于优化在堆栈上获得一个位置,它们可能只是暂时存在于寄存器中,取决于可用寄存器的处理器数量 保留包含其他内容的寄存器与保留本地内容以支持保留寄存器中的其他内容。
你应该只使用一些简单的函数(不一定是完整的程序),看看编译器做了什么。
如果你想用纯汇编编写并且没有转换 C 的概念,你仍然会面临同样的困境,我是否将某些东西长期保存在寄存器中,我是否将它放在堆栈中的持续时间这段代码还是我给它分配一个永远存在的地址。
我建议你思想开放,试着去理解为什么和为什么不,很多这样的规则,没有全局变量,小函数等等,不是因为事实,而是因为信仰,我信任的人告诉过我,所以我也宣扬它,并非总是如此,但有时你可以深入挖掘并发现恐惧是真实的或恐惧不是真实的,或者它可能在 30 年前适用,但现在不再适用,等等。例如,全局变量的替代方法是在 main() 或顶层的局部变量,您在嵌套时不断向下传递,这基本上意味着从资源角度来看它是全局变量。事实上,取决于编译器(特别是一个非常流行的编译器),一个主要级别的本地被传递下来,实际上在每个嵌套级别消耗资源,消耗的内存数量明显高于它刚刚被声明为全局的情况。另一方面,如果不是低效的内存消耗而是访问,谁可以弄乱该变量而谁不能弄乱,本地人使这变得很容易,相当多的懒惰,您可能会变得一团糟。必须注意全局变量,以免弄乱它们。请注意,从资源的角度来看,静态局部变量也是全局变量,它们在程序运行期间位于相同的 .data 空间中。
C 不能死是有原因的,有很多原因。没有任何东西可以取代它。它基本上是每个新处理器/指令集的第一个编译器是有原因的。
写一些简单的函数,编译,反汇编,看看产生了什么。为这些平台获取一些嵌入式/裸机应用程序,反汇编,看看编译器做了什么。无法优化的全局变量和静态局部变量在 .data 中获得地址。有时部分或全部传入参数获取堆栈位置,有时部分或全部局部变量也会消耗堆栈,如果您选择优化,则与编译器和优化有关。还取决于架构,可以执行内存和寄存器或内存到内存操作的 CISC 不必一直将内容移入和移出寄存器 RISC 通常必须专门使用寄存器或经常使用寄存器,但通常也有很多更多可用。所以编译器知道这一点并因此管理变量的主页。
每个人都会将全局变量和静态局部变量放入 ram 中(除非他们可以优化出来)。无论如何,传统的 x86 都会将参数放入堆栈中,并且也会将本地参数放在那里并在那里访问它们。 mips 或 arm 将尝试最小化使用的 ram 数量,并依靠寄存器,尝试将某些变量独占保留在寄存器中而不消耗堆栈。
汇编程序员,预编译器,使用了很多等效的全局变量,为每个变量选择一个地址。现在发布编译器,您可以选择以这种方式设置所有变量并且除了从调用返回之外几乎不使用堆栈,或者您可以像编译器一样编程并制定一些规则或简单地遵循编译器约定和保留一些一次性寄存器和其他寄存器,并靠在堆栈上进行保存和功能项的本地化。
在一天结束时,尽管汇编没有全局与本地的概念,但它没有带符号与无符号与指针与数组的概念,或者任何类似高级语言的概念。