gpt4 book ai didi

assembly - 为什么 x86 和 ARM 之间的 GNU 语法不同?

转载 作者:行者123 更新时间:2023-12-02 19:33:09 25 4
gpt4 key购买 nike

我刚刚开始学习 ARM 汇编,我不明白为什么 GNU as 语法与 x86* 不同。

由于指令是相同的,除了指令本身之外,我希望一切都像 x86* 一样,但相反,我正在努力加载字符串的地址等。我从头开始阅读一些在线 PDF、man 2 syscall 和反编译基本示例,因为我不确定我可以在网上找到的各种 Hello World 的值(value)。

我的问题:

  • 寄存器不需要 % 印记
  • 整数常量可以有 #$ 符号。事实上,如果我编译 mov r0, $0objdump -D 会返回一个 mov r0, #1

一切都组装成相同的mov r0, #1:

        mov %r0, $1
10080: e3a00001 mov r0, #1
mov r0, $1
10084: e3a00001 mov r0, #1
mov %r0, #1
10088: e3a00001 mov r0, #1
mov r0, #1
1008c: e3a00001 mov r0, #1
  • 我无法直接使用标签的地址来加载字符串地址,因此我需要使用一个变量。 mov r1, $helloldr r1, $hello 不起作用。在 x86_64 中,我会编写 mov $hello, %rsi。所以我正在做 gcc 所做的事情,我正在使用另一个标签的地址创建一个单词。

  • 我无法放入常量.rodata,或者收到错误:internal_relocation(类型:OFFSET_IMM)未修复,但将所有内容放入.text 有效(这部分与语法无关)

<小时/>
.section .text
hello:
.asciz "Hello World\n"
.set hello_len, .-hello

hello_addr:
.word hello

.align 4
.global _start
_start:
mov r0, $1
ldr r1, hello_addr
mov r2, $hello_len
mov r7, $4
swi $0

mov r0, $0
mov r7, $1
swi $0

最佳答案

GNU 汇编器 (GAS) 使用 AT&T 语法进行 x86 汇编的原因是为了与 AT&T 的 x86 汇编器兼容。 AT&T 没有使用基于 Intel 官方 x86 汇编语法的语法,而是选择基于其早期的 68000 和 PDP-11 汇编器创建新语法。当 GNU 编译器 (GCC) 添加 x86 支持时,它会生成 AT&T 语法汇编,因为那是他们使用的汇编器。在此之后的某个时间创建 GAS 时,GNU 汇编器必须使用该语法。

但是,没有适用于 ARM CPU 的 AT&T 汇编器版本。当 GNU 项目开始将 GCC 和 GAS 移植到 ARM 目标时,没有理由为 ARM 汇编创建自己的新且不兼容的语法。相反,他们基于 ARM 官方语法使用的语法。这意味着您可以在 ARM 官方文档中查找 ARM 指令,并使用您在 GNU 汇编器中看到的语法和操作数顺序。当使用 AT&T 语法编写 x86 程序集时,您只需要了解规则和异常(exception),这些规则和异常(exception)在任何地方都没有正式记录。

无法将地址直接加载到 ARM 汇编中的寄存器中的原因不是语法问题。 ARM CPU 根本没有可以做到这一点的指令。所有 ARM 指令的大小均相同,均为 32 位,没有空间将 32 位地址编码为立即数操作数。然而 ARM 汇编器确实提供了 pseudo-instruction form of LDR可以自动加载 32 位地址和常量:ldr r1, =hello。这将导致汇编器将 32 位常量存储在文字表中,并使用 PC 相关 LDR 指令将其加载到内存中。如果正在加载的常量恰好足够小,可以直接使用 MOV 或 MVN 加载,则会生成该指令。

不能将常量放入 .rodata 的原因是因为距离太远,无法使用 PC 相关 LDR 指令进行寻址(它需要在 +/-4KB 内,因为这样最大位移大于单个 32 位 ARM 指令所能容纳的位移)或者您使用的对象格式不支持 PC 相对寻址到不同的部分。 (您的 ldr r1, hello_addr 指令使用 PC 相对寻址,因为无法在 ARM 指令中编码 32 位地址。)

关于assembly - 为什么 x86 和 ARM 之间的 GNU 语法不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43574163/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com