C语言 为什么printf会导致分割错误?



我有一个不能工作的汇编程序:

.data
.LC0:
.string "%f%f"
b:
.long 1085066445
a:
.long 1078774989
.text
.globl  main
main:
pxor  %xmm0, %xmm0
pxor  %xmm1, %xmm1
movl  $.LC0, %edi
movl  $2, %eax           # %eax magic
cvtss2sd  a(%rip), %xmm0
cvtss2sd  b(%rip), %xmm1
call  printf
xorl  %eax, %eax
ret

问题在打印。实际上,当我注释掉这一行时,程序正常结束。然后,我检查了用C编写的同一个程序的汇编输出,我看到编译器首先在rsp上减去8,然后在printf之后,又加上8。发生了什么事?这是相应的C程序

float a = 3.2, b = 5.4;
int main() { printf("%f%f", a, b); }

SSE指令要求堆栈为16字节对齐。这就是为什么这段代码只有在打印浮点数而不是整数时才会失败。看到https://patchwork.kernel.org/project/linux-crypto/patch/20170110143340.GA3787@gondor.apana.org.au

最新更新