我正在尝试测试在 64 位 Linux 上将浮点值从程序集传递给 C 函数。包含我的 C 函数的 C 文件如下所示:
#include <stdio.h>
extern void printer(double k){
printf("%fn",k);
}
它的预期行为是简单地打印传递给它的浮点数。我正在尝试从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
和/或使用寄存器将其传递给函数。有人可以解释我应该如何将值传递给函数吗?
您已在数据部分中定义了 main,这使得它不可执行。在 main 之前添加一个 .text 指令。