我正在学习装配,尤其是ARM处理器。
这是我非常简单的汇编代码:
.data
integer: .long 25
.text
.global main
main: stmfd sp!, [lr]
ldr r0, =integer
ldr r1, [r0]
add r1, #2
str r1, [r0]
ldmfd sp!, [lr]
mov pc, lr我所犯的错误是:
test.s: Assembler messages:
test.s:6: Error: expression too complex -- `stmfd sp!,[lr]'
test.s:11: Error: expression too complex -- `ldmfd sp!,[lr]'我不知道为什么我经常收到这个error..searched,但什么也找不到。
发布于 2021-08-26 21:18:57
STore多个/ LoaD多个指令接受一个寄存器列表,包含在{}而不是[]中。
在ARM模式下,stmfd sp!, {lr}组装得很好,然后反汇编到
e92d4000 stmfd sp!, {lr}与arm-none-eabi-objdump -d
在拇指模式下,push/pop是单独的指令,有它们自己的助记符和操作码。
例如b500 push {lr}。使用它是因为它更有效(当您的注册列表只包括r0..r7,lr中的寄存器时)。
显然,stmfd以拇指-2的形式存在,但是GAS只在.syntax unified模式下正确地处理它.没有这一点,stmfd sp!,{lr}就会给出一个Error: lo register required。
但是有了.syntax unified,我们就可以得到f84d ed04 str.w lr, [sp, #-4]!,并且结合其他寄存器,我们可以做一些事情,比如e929 4803 stmdb r9!, {r0, r1, fp, lr},它显然在寄存器列表和寄存器列表中都使用了非lo寄存器,并将其反汇编为stmdb助记符。(FD =完全下降与DB = Decrement之前,对于商店相同。)
我把这个放到foo.s中,这样我就可以在它上运行arm-none-eabi-gcc -c了。(gcc -mthumb似乎与组装无关,只编译C)。
.syntax unified
.cpu cortex-m3
.thumb_func
stmfd r3!, {r0, r1} @ different error message, but still only unified syntax
stmfd r9!, {r0, r1, r11, lr} @ only in unified
stmfd sp!, {lr} @ only in unified
push {lr}如果没有.syntax unified,我们就可以
foo.s: Assembler messages:
foo.s:5: Error: Thumb-2 instruction only valid in unified syntax -- `stmfd r3!,{r0,r1}'
foo.s:6: Error: lo register required -- `stmfd r9!,{r0,r1,r11,lr}'
foo.s:7: Error: lo register required -- `stmfd sp!,{lr}'第一个错误消息可能是GAS其他错误信息的奥秘的关键:拇指-2指令仅在统一语法中有效。
也许,在拆分解析模式下,GAS只需检查寄存器号是否为lo,然后才能验证助记符对该模式是否有效。,所以我们可能是基于将拇指1规则应用于只使用Thumb2的指令来获得错误消息的。
DR:始终使用.syntax unified,,默认是哑的。
https://stackoverflow.com/questions/68945020
复制相似问题