MIPS子程序与C函数



假设我有以下C代码:

int array[10] = {10, 5, 2, 20, 20, -5, 3, 19, 9, 1};
void main(void)
{
      printArray(0, 9);
}
void printArray(int startIndex, int endIndex)
{
      // prints out the numbers in the order starting from startIndex
      // and ending at endIndex
}

我会把这个C代码翻译成MIPS,如下所示:

    .text
    .globl main
main:
   # ...
    .text
    .globl printArray
printArray:
    # play with registers
print:
# used to loop

我很困惑。在MIPS代码中,mainprintArray,如果是global,将等效于C函数,对吧?但印刷品也会是吗?如果没有,print在C中是否有等价物?

变量和函数作用域在Assembly中并不是一个真正的"东西"。.globl是汇编程序的指令,但它所指的目标仍然只是内存位置的标签。因此,当你说"[mainprintArray]等同于C函数吗?"时,答案是肯定和否定的。

可以,您可以跳转或分支到由main:printArray:(或print:)标记的内存地址。这样一来,就有点像在高级语言中调用函数。

不,它实际上并不"等价"于C函数,因为它没有任何参数和返回值的自动处理。您必须在寄存器中传递参数,并在寄存器中返回值——您甚至必须使用寄存器($ra)才能返回调用函数。调用方的寄存器没有任何自动保存功能——你必须把它们推到堆栈上,然后把它们弹出,否则调用函数就会丢失它放在寄存器中的任何东西。

很抱歉,如果这比你需要的更基本——希望它能有所帮助!

最新更新