如何将 float 或 double 参数传递给 AArch64 汇编中的 C 函数

问题描述 投票:0回答:1

我试图制作一个从0.0加到1的计数器,我首先通过fadd实现计数器,然后我在打印浮点数时遇到麻烦。

平台:Alpine Linux Aarch64 (3.20.2)、GNU Binutils (2.42)(从我的 M2 Mac 上的虚拟机运行)

.global _start
.extern printf

.data
    string: .asciz "Hello World! %f\n" // Store String
    f: .float 1.132 // Store the float 1.132

.text

_start:

loop:
    ldr x0, =string // Load String into x0
    ldr d1, =f // Load float into d1 (A float reg)

    bl printf // Call printf in glibc
    b exit // Branch to exit label

exit:
    mov x8, #93 // Exit SYSCALL
    mov x0, #0 // Exit code
    svc 0 // Syscall

build.sh

as main.s -o main.o
ld -lc --dynamic-linker /lib/ld-musl-aarch64.so.1 main.o -o main

输出

Hello World! 0.00000
assembly floating-point numbers glibc arm64
1个回答
0
投票

作者:我也将其发布在 sub reddit r/Assembly_language 中,请有人帮忙。

所以基本上,我需要将ADDR加载到X寄存器中,然后我需要将值加载到S寄存器中,最后我可以使用fcvt(浮点转换精度(标量))将值传输到D寄存器中,由 Glibc printf 函数使用。

代码:

.global _start
.extern printf

.data
    format: .asciz "%f\n"
    f:  .float 1.123

.text
_start:
    ldr x0, =format
    ldr x2, =f
    ldr s0, [x2]
    fcvt d0, s0
    mov x1, #0
    
    bl printf

    mov x8, #93
    mov x0, #0
    svc 0
© www.soinside.com 2019 - 2024. All rights reserved.