为什么不试试呢?
unsigned int foo ( unsigned int a, unsigned int b, unsigned int c,
unsigned int d, unsigned int e, unsigned int f )
{
return(a+b+c+d+e-f);
}
使用当前的 gcc 提供
00000000 <foo>:
0: e0810000 add r0, r1, r0
4: e080c002 add ip, r0, r2
8: e08c1003 add r1, ip, r3
c: e59d3000 ldr r3, [sp]
10: e59d2004 ldr r2, [sp, #4]
14: e0810003 add r0, r1, r3
18: e0620000 rsb r0, r2, r0
1c: e12fff1e bx lr
llvm 给出:
00000000 <foo>:
0: e0810000 add r0, r1, r0
4: e59d1000 ldr r1, [sp]
8: e0800002 add r0, r0, r2
c: e59d2004 ldr r2, [sp, #4]
10: e0800003 add r0, r0, r3
14: e0800001 add r0, r0, r1
18: e0400002 sub r0, r0, r2
1c: e1a0f00e mov pc, lr
由于这是作业,我将由您决定是否可以使用带有多个寄存器的单个 stm/push 指令(如其他答案中所述,您不能使用多个寄存器控制堆栈上的顺序)或多个 stm/push 指令,每个指令一个寄存器。 (或弄清楚如何制作一个显示答案的测试程序)
了解约定是好的,但是您可以在不完整阅读约定的情况下回答此类问题,使用遵循约定的一两个编译器。基本上不要假设你从一些反汇编中了解有关约定的一切,例如你没有告诉我们 a,b,c,d,e,f 是否是 64 位整数、双浮点数、字节、半字、字等。多少堆栈上的东西肯定会受到影响,但是,以什么顺序以及是否可以使用带有多个寄存器的 stm/push 指令来获得它,可能会是一致的。
编辑:
是的,该网页是正确的,您需要获取并阅读 ARM ARM(现在每个系列都有单独的 ARM ARM(ARM 架构参考手册))。这些具有用伪代码等定义的指令。在这种情况下:
The registers are stored in sequence, the lowest-numbered register to the lowest
memory address (start_address), through to the highest-numbered register to the
highest memory address (end_address).