assembly - GAS aarch64 语法获取 .ascii 字符串长度

标签 assembly clang x86-64 arm64 gnu-assembler

我正在尝试翻译这个 x86_64 程序:

# hello_world.s
# GNU Assembly, x86_64 Linux

.global _start

.data

.equ SYS_EXIT, 60
.equ SYS_WRITE, 1
.equ STDOUT, 1
.equ SUCCESS, 0

MSG:
    .ascii "Hello world!\n"

.equ MSG_LEN, . - MSG

.text

_start:
    # write(STDOUT, MSG, MSG_LEN)
    mov $SYS_WRITE, %rax
    mov $STDOUT, %rdi
    mov $MSG, %rsi
    mov $MSG_LEN, %rdx
    syscall

    # exit(SUCCESS)
    mov $SYS_EXIT, %rax
    mov $SUCCESS, %rdi
    syscall

进入aarch64程序:

// hello_world.s
// GNU Assembly, aarch64 Linux

.data

.equ SYS_EXIT, 93
.equ SYS_WRITE, 64
.equ STDOUT, 1
.equ SUCCESS, 0

MSG:
    .ascii "Hello world!\n"

.equ MSG_LEN, . - MSG

.text

.global _start

_start:
    // write(STDOUT, MSG, MSG_LEN)
    mov x8, #SYS_WRITE
    mov x0, #STDOUT
    adr x1, MSG
    mov x2, #MSG_LEN
    svc #0

    // exit(SUCCESS)
    mov x8, #SYS_EXIT
    mov x0, #SUCCESS
    svc #0

然而,当我尝试汇编上面的程序时,我得到了这个错误:

hello_world.s:27:13: error: expected compatible register or logical immediate
    mov x2, #MSG_LEN
            ^

我认为这有点转移注意力,因为如果我改变这一行:

.equ MSG_LEN, . - MSG

进入这个:

.equ MSG_LEN, 13

然后它工作正常。但是我对这个解决方案不满意,因为我不想对 MSG_LEN 进行硬编码,我希望汇编程序能够像在 x86_64版本。你能帮我弄清楚如何在程序的 aarch64 版本中设置 MSG_LEN 而不必显式硬编码值吗?

其他详细信息:我正在从这个 Dockerfile 构建的 docker 容器中编译和运行这些程序:

FROM ubuntu:20.04

RUN apt-get update
RUN apt-get -y install clang qemu qemu-system gcc-aarch64-linux-gnu

我正在编译和运行 x86_64 程序:

clang -nostdlib -target x86_64-linux-gnu -s hello_world.s -o hello_world.out && ./hello_world.out

我正在编译和运行 aarch64 程序:

clang -nostdlib -target aarch64-linux-gnu -s hello_world.s -o hello_world.out && ./hello_world.out

最佳答案

解决方案:我需要使用 -fno-integrated-asclang 来告诉它直接使用 GNU 汇编器而不是它自己的内置集成汇编器(它假设 是 GAS 的直接替代品,但显然不是)。我使用以下更新的命令编译和运行我的 aarch64 程序没有问题:

clang -nostdlib -fno-integrated-as -target aarch64-linux-gnu -s hello_world.s -o hello_world.out && ./hello_world.out

感谢@Jester 和@Nate Eldredge 在评论中帮助我调试。

关于assembly - GAS aarch64 语法获取 .ascii 字符串长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64187905/

相关文章:

performance - 对于ARM,为什么单条STM指令一般比多条STR指令快?

c++ - 我怎样才能将 NASM 用作图书馆?

function - vim脚本(clang_complete)如何完成功能、模板?

linux - Perf 启动开销 : Why does a simple static executable which performs MOV + SYS_exit have so many stalled cycles (and instructions)?

c - GCC:为什么 const 数据填充在我的函数内部而不是开头?

assembly - 零/符号扩展是空操作,那么为什么要对每种尺寸类型进行说明呢?

c++ - 当 noexcept 函数尝试在 gcc 或 clang 中调用非 noexcept 函数时启用警告

c++ - 关于静态模板化 constexpr 的 Clang 警告(未定义内联函数)

algorithm - 这个求平方根算法的名称是什么?

x86-64 - 预取写入是否会影响单核性能?