为什么gcc在读取时保留被调用方保存寄存器?
简单函数(x86-64,-O2): 此函数的汇编程序输出:为什么gcc在读取时保留被调用方保存寄存器?,c,gcc,x86-64,C,Gcc,X86 64,简单函数(x86-64,-O2): 此函数的汇编程序输出: push r15 mov eax, [r15] pop r15 retn 为什么要插入不需要的pop/PUSH指令?这是一个很好的问题,我一点也不知道,但编译器可能只从您的声明中看到您将要使用r15,将其保存在函数条目中,并在函数退出之前将其还原。编译器没有看到您只是在读取寄存器 编译器需要使用逻辑进行扩展,以跟踪是否写入寄存器,从而决定是否必须保存寄存器,这一逻辑并不简单,只需确保两条指
push r15
mov eax, [r15]
pop r15
retn
为什么要插入不需要的pop/PUSH指令?这是一个很好的问题,我一点也不知道,但编译器可能只从您的声明中看到您将要使用
r15
,将其保存在函数条目中,并在函数退出之前将其还原。编译器没有看到您只是在读取寄存器
编译器需要使用逻辑进行扩展,以跟踪是否写入寄存器,从而决定是否必须保存寄存器,这一逻辑并不简单,只需确保两条指令的安全。请注意,您在这里所做的是。此外,这也是内联asm不好的原因之一。
push r15
mov eax, [r15]
pop r15
retn