首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ARM程序集- stmfd sp!,[lr]

ARM程序集- stmfd sp!,[lr]
EN

Stack Overflow用户
提问于 2021-08-26 20:35:18
回答 1查看 471关注 0票数 0

我正在学习装配,尤其是ARM处理器。

这是我非常简单的汇编代码:

代码语言:javascript
复制
            .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

我所犯的错误是:

代码语言:javascript
复制
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,但什么也找不到。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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)。

代码语言:javascript
复制
.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,我们就可以

代码语言:javascript
复制
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,默认是哑的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68945020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档