Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么gcc在读取时保留被调用方保存寄存器?_C_Gcc_X86 64 - Fatal编程技术网

为什么gcc在读取时保留被调用方保存寄存器?

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

简单函数(x86-64,-O2):

此函数的汇编程序输出:

push    r15    
mov     eax, [r15]    
pop     r15    
retn

为什么要插入不需要的pop/PUSH指令?

这是一个很好的问题,我一点也不知道,但编译器可能只从您的声明中看到您将要使用
r15
,将其保存在函数条目中,并在函数退出之前将其还原。编译器没有看到您只是在读取寄存器


编译器需要使用逻辑进行扩展,以跟踪是否写入寄存器,从而决定是否必须保存寄存器,这一逻辑并不简单,只需确保两条指令的安全。

请注意,您在这里所做的是。此外,这也是内联asm不好的原因之一。
push    r15    
mov     eax, [r15]    
pop     r15    
retn