对于我的汇编语言课程,我被要求填写图1 MIPS汇编代码中的汇编代码表,如图2所示。
在这段代码中,我的讲师试图实现一个递归函数调用来完成一个数字的阶乘。使用图2中的参数,到目前为止我已经填写了以下内容。
参数和进度
我知道初始堆栈指针从位置100开始,然后在函数continue中的第一条指令减少12。帧指针在位置96更新为112,返回地址将在位置92更新,n将在位置88更新为2.这将重复直到n达到1.
我对一些事情感到困惑。我的第一个问题是关于寄回地址。在更新返回地址的位置(92,80和68),每次返回地址是5000还是自动更新为其他地址?我很困惑如何更新返回地址,因为它没有像循环的每次迭代中的帧指针那样显式更新。
我的第二个问题是关于代码行之后的下一条指令:
jal fact # recursive call to fact(n-1)
完成此操作后,列出以下说明
lw $4, 0 ($29) # restore n
这会发生在60号位置吗?
mult $2, $4 # fact (n-1) * n
这会发生在56号位置吗?
我的最后一个问题是恢复每个寄存器。在代码行中:
lw $4, 0 ($29) # restore n
lw $31, 4 ($29) # restore return address
lw $30, 8 ($29) # restore frame pointer
确切地说,n,返回地址和帧指针的值是否恢复到?它们是否会分别加载到88,92和96的原始值?
这是我第一次使用汇编语言的经历,如果我说的话没有意义或展示适当的研究,我会道歉。我的导师没有提供任何类似的例子,所以这是我在做了一些研究后发现的。