GAS aarch64 语法获取 .ascii 字符串长度
GAS aarch64 syntax to get .ascii string length
我正在尝试翻译这个 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
然而,当我尝试 assemble 上面的程序时,我得到了这个错误:
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
,我希望 assembler 能够确定 assemble 时间的长度,就像在x86_64
版本。你能帮我弄清楚如何在程序的 aarch64
版本中设置 MSG_LEN
而不必显式硬编码值吗?
其他详细信息:我正在编译 运行 这些程序在 docker 容器中,该容器是从这个 Dockerfile 构建的:
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-as
和 clang
来告诉它直接使用 GNU 汇编器而不是它自己的 built-in 集成汇编器(这是 假设 成为 GAS 的 drop-in 替代品,但显然不是)。我使用以下更新的命令编译 运行 我的 aarch64
程序没有问题:
clang -nostdlib -fno-integrated-as -target aarch64-linux-gnu -s hello_world.s -o hello_world.out && ./hello_world.out
感谢@Jester 和@Nate Eldredge 在评论中帮助我调试。
我正在尝试翻译这个 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
然而,当我尝试 assemble 上面的程序时,我得到了这个错误:
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
,我希望 assembler 能够确定 assemble 时间的长度,就像在x86_64
版本。你能帮我弄清楚如何在程序的 aarch64
版本中设置 MSG_LEN
而不必显式硬编码值吗?
其他详细信息:我正在编译 运行 这些程序在 docker 容器中,该容器是从这个 Dockerfile 构建的:
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-as
和 clang
来告诉它直接使用 GNU 汇编器而不是它自己的 built-in 集成汇编器(这是 假设 成为 GAS 的 drop-in 替代品,但显然不是)。我使用以下更新的命令编译 运行 我的 aarch64
程序没有问题:
clang -nostdlib -fno-integrated-as -target aarch64-linux-gnu -s hello_world.s -o hello_world.out && ./hello_world.out
感谢@Jester 和@Nate Eldredge 在评论中帮助我调试。