c - 将 128 位寄存器从汇编传递给 C 函数

标签 c assembly x86-64 calling-convention att

<分区>

我正在尝试测试将浮点值从 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 和/或使用寄存器将其传递给函数。有人可以解释我应该如何将值传递给函数吗?

最佳答案

您在数据部分定义了 main,这使得它不可执行。在 main 之前添加一个 .text 指令。

关于c - 将 128 位寄存器从汇编传递给 C 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48527892/

相关文章:

linux - float 显示十六进制 x86-64 nasm linux

c++ - MySQL 与二进制文件速度

c - 获取安装在 solaris 11.2 机器上的卷列表

汇编快速除以2

linux - 没有 gcc 的 gdb

linux - 如何在 Linux 中使用 NASM 汇编获取系统时间而不使用从 C 导出的函数?

c - 如何只包含来自不同 C 文件的一个函数

C: 无法在文件上写入数据

optimization - 利用 64 位寄存器的最酷的多操作技巧? (无 SIMD/SSE/AVX)

c - 如何创建并行堆栈并在其上运行协程?