Ben*_*Tut 4 assembly arm gnu-assembler
GNU GAS 文档似乎无法正确定义 ARM 目标的某些语法功能,因此我在编写简单的汇编时都遇到困难。
\n\n两个这样的例子:
\n\nARM编译器迁移和兼容性指南 6.02 版指出,在 GNU 语法下,以及多行注释:
\n\n\n\n\n该
\n\n//标记将一行的剩余部分标识为注释:\n
MOV R0,#16 // Load R0 with 16
这似乎与使用指南相冲突,其中指出:
\n\n\n行中任意位置出现 \xe2\x80\x98@\xe2\x80\x99 表示注释的开始,并延伸到该行的末尾。
\n
指令中隐式转换的问题仅在 Arm 文档中得到解决,并且仅给出失败的情况:
\n\n\n\n\nGNU 语法汇编期望立即值以编码形式呈现。该指令
\nMOVK x1, #0x40000会产生以下消息:error: immediate must be an integer in range [0, 65535].
“编码”到底是什么意思?我是否可以假设LSLGNU 下同样支持该语法?GAS 文档中似乎没有解决这个问题。
有没有地方可以找到 GAS + ARM 目标的具体且完整的语法定义?\n提前致谢。
\n即使不使用 C 预处理器来处理 C/C++ 风格的注释,GAS 也支持//注释和注释本身。@
(用foo.S大写的 S 调用您的文件,并gcc -c foo.S首先通过 CPP 运行它,这样您就可以使用#defineand#if 0等类似的东西。)
“编码”意味着可以用机器代码表示。例如,MOVK x1, #0x40000不是语法错误,而是比解析更晚的错误,因为无法使用该操作码在机器代码中表示特定数字。但这很好,因为汇编器可以为-immediate 和 .mov x1, #0x40000选择一个位范围编码。请注意,这是 AArch64,它使用与 ARM 不同的机器代码。orrxzr
GAS ARM语法与ARM官方手册文档相同。 指令与 Keil 的 ARMasm 不同,但指令行的语法(大部分?)相同。mrc@old_timer 表示与和语法存在或曾经有一些差异mcr,但在大多数情况下,GAS 的目标是与标准 ARM 语法兼容。
请参阅 GAS 手册的“ARM 相关功能”一章,其中包括有关语法的部分。
(请注意,ARM 有几种不同的语法模式,“统一”模式与旧模式对 ARM 与 Thumb 模式使用不同的语法。通常您需要.syntax unified)
您始终可以查看 GCC C 编译器输出的示例(例如,在https://godbolt.org/z/Tk_jrD上),尽管对于特定情况,您必须编写一个 C 函数,其中 GCC 将使用指令或寻址模式你感兴趣的。GCC 使用 GAS 指令。
| 归档时间: |
|
| 查看次数: |
444 次 |
| 最近记录: |