【发布时间】:2025-11-22 20:35:01
【问题描述】:
我注意到在 ARM 汇编中,有 3 种类型(据我所知,可能还有更多)加载/存储命令。到目前为止,我已经看到:
STR R0, [R1, #4]
STR R0, [R1], #4
LDR R0, R1, #4
这些只是我见过的命令的示例。注意最后一个命令是如何加载而不是存储的,那是因为我还没有看到 STR R0、R1、#4,所以我不知道这样写会不会编译。
我知道#4 表示将 R1 增加 4(可能),但与上述命令中的 [] 有什么区别?
【问题讨论】:
-
从任何基本的 ARM 汇编指南开始或搜索“ARM 寻址模式”或类似内容;已经有 30 年的参考资料了。任何合理的汇编程序都会将第三行视为无效语法而拒绝(因为它是)。
-
Tyvm,将开始搜索。不知道从哪里开始。问题是,我使用了我们大学制造的“自定义”汇编器,我的一位同事写了第三种类型的命令,所以我认为它可以在这个汇编器中编译,但最好不要使用它,因为它会成为一个坏习惯。
-
方括号基本上是语法糖。加载和存储指令是唯一具有内存操作数的指令,并且它们始终采用内存操作数,因此如果汇编语言没有它们就不会产生歧义。我猜你的汇编程序走捷径,只是忽略了方括号。但是,是的,利用这个“功能”并不是一个好主意。
-
@Ross “如果汇编语言没有它们,就不会有歧义” - 无括号
ldr预索引或后索引, 然后? ;) -
@Notlikethat 是的,如果没有方括号,偏移寻址和索引后寻址之间会有歧义。预索引寻址具有
!字符,可以消除歧义。
标签: assembly arm addressing-mode