我有一个带有函数声明的C 64位程序,其外观如下:
#include <stdio.h>
extern double wartosc (double a, double b, double x, int n);
int main() {
printf("%f", wartosc(4, 3, 2, -2));
}
该功能在汇编器中实现,代码:
section .text
global _wartosc
_wartosc:
cmp rdi, 0
jl finish
xorpd xmm0, xmm0
finish:
ret
为什么printf函数输出0?与rdi寄存器的参数比较似乎无效
如果我正确理解参数a,b,x传递给xmm0,xmm1和xmm2寄存器,而最后一个参数位于rdi中,则结果由xmm0寄存器返回。
答案 0 :(得分:4)
您将参数声明为int
,这是一种32位类型。它不会符号扩展来填充rdi
,而仅填充edi
。
RDI的上半部分是呼叫者留在此处的任何随机垃圾。在许多情况下,零是由于写入32位寄存器后隐式符号扩展引起的。
查看编译器为调用者生成的代码,并查看调试器中的寄存器值。