c - 当一切都可以通过寄存器完成时,为什么要减少 %rsp 呢?

标签 c assembly gcc x86-64 instruction-set

下面是我的代码:

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/

相关文章:

c - 文件读写、C 中的字符比较

c - 重新编码 memset 时出现“段错误”

c - gcc 函数参数在堆栈帧上的对齐方式

c - 从 128 位 SSE vector 加载和提取 32 位整数值的最有效方法是什么?

c++ - 为什么指针类型在 C++ 中不受限制?

c - 这两行代码在程序中的工作

c - 在 if 语句的 bool 表达式中使用指针

gcc - llvm-gcc 汇编器 : LDR syntax

algorithm - Mips 汇编程序中的快速排序

c++ - 结构中的可变长度字符串和导致时间旅行的未定义行为