说我有以下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代码中,main
和printArray
是global
,相当于C函数,对吧?但打印也会是?如果没有,print
在C中是否具有等价物?
答案 0 :(得分:1)
变量和函数范围在Assembly中并不是真正的“东西”。 .globl
是汇编程序的指令,但它所引用的目标仍然只是内存位置的标签。所以当你说,“[{main
和printArray
]是否等同于C函数?”,答案是肯定的,不是。
是的,您可以跳转或转移到main:
或printArray:
(或print:
)标记的内存地址。所以就这样,它有点像用高级语言调用函数。
不,它与C函数不是“等价”,因为它没有对参数和返回值进行任何自动处理。您必须在寄存器中传递参数,并且必须在寄存器中返回值 - 您甚至必须使用寄存器($ra
)来返回调用函数。并且没有任何自动保存调用者的寄存器 - 你必须将它们推入堆栈并弹出它们,否则调用函数将丢失它放入它们的任何内容。
很抱歉,如果这比你需要的更基本 - 希望它有所帮助!