假设我有以下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中是否有等价物?
变量和函数作用域在Assembly中并不是一个真正的"东西"。.globl
是汇编程序的指令,但它所指的目标仍然只是内存位置的标签。因此,当你说"[main
和printArray
]等同于C函数吗?"时,答案是肯定和否定的。
可以,您可以跳转或分支到由main:
或printArray:
(或print:
)标记的内存地址。这样一来,就有点像在高级语言中调用函数。
不,它实际上并不"等价"于C函数,因为它没有任何参数和返回值的自动处理。您必须在寄存器中传递参数,并在寄存器中返回值——您甚至必须使用寄存器($ra
)才能返回调用函数。调用方的寄存器没有任何自动保存功能——你必须把它们推到堆栈上,然后把它们弹出,否则调用函数就会丢失它放在寄存器中的任何东西。
很抱歉,如果这比你需要的更基本——希望它能有所帮助!