我有一个不能工作的汇编程序:
.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