<分区>
我正在尝试测试将浮点值从 64 位 Linux 上的程序集传递给 C 函数。包含我的 C 函数的 C 文件如下所示:
#include <stdio.h>
extern void printer(double k){
printf("%f\n",k);
}
它的预期行为是简单地打印传递给它的 float 。我正在尝试通过 AT&T 语法汇编文件来完成此操作。如果我没记错的话,在 64 位 linux 中,调用约定是在 XMM 寄存器上传递浮点参数。我的 .s 文件如下:
.extern printer
.data
var:
.double 120.1
.global main
main:
movups (var),%xmm0
call printer
mov $60,%rax
syscall
我希望它能做的是有一个值为 120.1 的变量 (var)。然后将其移至 xmm0
寄存器,我希望它是用于传递参数 k
的寄存器。这种对调用约定的理解也得到了从 C 文件生成的汇编代码的支持,其中的一部分如下:
printer:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $16, %rsp
movsd %xmm0, -8(%rbp)
movq -8(%rbp), %rax
movq %rax, -16(%rbp)
movsd -16(%rbp), %xmm0
movl $.LC0, %edi
movl $1, %eax
call printf
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
我的 .s 文件汇编成一个可执行文件,但运行它只会出现段错误,并且不会打印浮点值。我只能假设这是因为我没有正确地将值移动到 xmm0
和/或使用寄存器将其传递给函数。有人可以解释我应该如何将值传递给函数吗?