MIPS子程序与C函数

时间:2013-11-19 22:42:40

标签: c mips

说我有以下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代码中,mainprintArrayglobal,相当于C函数,对吧?但打印也会是?如果没有,print在C中是否具有等价物?

1 个答案:

答案 0 :(得分:1)

变量和函数范围在Assembly中并不是真正的“东西”。 .globl是汇编程序的指令,但它所引用的目标仍然只是内存位置的标签。所以当你说,“[{mainprintArray]是否等同于C函数?”,答案是肯定的,不是。

是的,您可以跳转或转移到main:printArray:(或print:)标记的内存地址。所以就这样,它有点像用高级语言调用函数。

不,它与C函数不是“等价”,因为它没有对参数和返回值进行任何自动处理。您必须在寄存器中传递参数,并且必须在寄存器中返回值 - 您甚至必须使用寄存器($ra)来返回调用函数。并且没有任何自动保存调用者的寄存器 - 你必须将它们推入堆栈并弹出它们,否则调用函数将丢失它放入它们的任何内容。

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