【问题标题】:How to preserve the global variables in the stack in MIPS when calling a function?调用函数时如何在MIPS中保留堆栈中的全局变量?
【发布时间】:2018-01-22 22:41:42
【问题描述】:

我正在开发一个从混合 C++ 和 Javascript 到 MIPS 汇编的语言的编译器

在调用一个或多个函数(包括递归)时,将全局变量保留在堆栈中的最佳方法是什么?

在 main 函数中,全局变量和局部变量都在堆栈中,从 $fp 开始,并且该部分运行良好。 但是,当调用另一个函数时,我使用的方法会保存返回地址 $ra 并设置新的 $fp 和 $sp。 这意味着我无法再访问保存全局变量的旧 $fp 地址。 如何进行?

下图描述了我正在使用的过程。图片来自伯克利大学 Sen 教授的讲座

【问题讨论】:

  • 那为什么要把它们放在那里呢?如果你只是静态分配它们,你就不会有这个问题。
  • 你的意思是在.data区域分配?
  • 它们是全局变量是吗?为什么要尝试将它们与局部变量一起放入堆栈?
  • 对!现在,我只需要知道如何修改.text里面的.data内容,我的问题就解决了
  • 如果您的语言支持嵌套范围和闭包(如 javascript),那么使用 .data 实际上是更难的方法。更简单的实现是在运行时初始化期间创建一个外部激活记录来保存全局变量。然后全局变量成为整个运行程序的隐式无参数过程的“局部变量”。这节省了许多特殊情况代码,将全局变量与嵌套范围中的变量区别对待。性能差异可能很小。对于某些处理器,.text 中的直接寻址比 AR 中的寄存器偏移寻址慢。

标签: assembly compiler-construction mips code-generation


【解决方案1】:

我将全局变量放在 .data 段

这是我访问和修改其内容的方式

data
   globalVariable:  .word  10

.text

   #access
   lw $a0, globalVariable 

   #modify
   la $a0, globalVariable #get address
   li $a1, 11 #new value
   sw $a1 0($a0) #save new value

   lw $a2, globalVariable  #get new value

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-21
    • 2012-05-09
    • 2013-06-27
    • 2017-09-05
    • 2019-02-16
    • 1970-01-01
    • 2012-03-04
    • 2020-07-21
    相关资源
    最近更新 更多