下面是我的代码:
C代码
// this function might look weird, just for demo purpose
void func4(int x, int y, int z) {
int t = z - y;
int k = t >> 31;
t = (t + k) >> 1;
k = t + y;
if(k <= x) {
t = 0;
if(k >= 1) {
return;
}else {
y = k + 1;
func4(x, y, z);
}
}else {
z = k - 1;
func4(x, y, z);
}
}
汇编代码:
// only show relevant code
func4:
subq $8, %rsp // decrement %rsp by 8, but why?
movl %edx, %eax
subl %esi, %eax
... // all operations on registers
addq $8, %rsp
ret
因此,既然每个操作都可以通过寄存器完成,则不会将任何内容推送到堆栈,也不涉及指针,那么为什么 %rsp
首先要递减 8?是为了对齐/偏移吗?
最佳答案
func4
进行传出函数调用(对其自身也同样如此),因此必须遵守函数调用的 ABI,这要求 %rsp
在调用时间(由于返回地址被推送,因此在输入时错位 8)。
关于c - 当一切都可以通过寄存器完成时,为什么要减少 %rsp 呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63065494/