gpt4 book ai didi

c - MIPS 子例程与 C 函数

转载 作者:太空宇宙 更新时间:2023-11-04 03:51:51 25 4
gpt4 key购买 nike

假设我有以下 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 也会是吗?如果不是,print 在 C 语言中是否有等价物?

最佳答案

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

是的,您可以跳转或分支到由main:printArray:(或print:)标记的内存地址。所以在那种情况下,它有点像在高级语言中调用函数。

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

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

关于c - MIPS 子例程与 C 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20083689/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com