将 128 位寄存器从程序集传递到 C 函数



我正在尝试测试在 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 指令。

相关内容

  • 没有找到相关文章