ARM 程序集“延迟”功能不适用于统一/thumb-2 语法

Cra*_*aig 1 assembly arm cortex-m3 delay

我正在使用以下代码为 ARM 执行简单的基于计数器的延迟/等待:

.thumb_func
dowait:
   ldr r7,=0x200000
dowaitloop:
   sub r7,#1
   bne dowaitloop
   bx lr        
Run Code Online (Sandbox Code Playgroud)

我从 dwelch 的blinker01 mbed_samples获得了这个函数,它在其他 LED 闪烁类型的示例程序中运行良好。但是,我目前正在处理的程序需要.syntax unified位于顶部,因为我使用的是 Thumb-2 指令(例如 ITTEE)。

我怀疑“.syntax统一”是问题所在,因为我采用了已知工作的blinker01示例并添加了.syntax unified它,当我上传到我的电路板时它不再工作。

虽然我还没有弄清楚所有的gdb 东西来证明它,但该函数似乎没有计算/延迟。

是否有不同的方法来重新编写这个“延迟”函数以使用统一的/Thumb-2 语法?

Tur*_*o J 5

SUBS当您希望指令更​​新标志时,您需要使用。

.syntax unified
.thumb_func
dowait:
   ldr r0,=0x200000
dowaitloop:
   subs r0,#1
   bne dowaitloop
   bx lr   
Run Code Online (Sandbox Code Playgroud)

另一个注意事项:R7 不是一个 clobber 寄存器,因此如果您使用“C”代码中的 dowait 函数,则会出现错误,因为编译器不希望 R7 被修改。这就是我将其更改为 R0 的原因。

  • 当您不使用统一语法时,gas 不喜欢 subs,因此我在该代码中没有它的原因。thumb sub 指令总是计算标志,其中 arm sub 它是一个选项,通过将 s 放在那里 sub => thumb, 计算标志,arm 不计算标志来指定。subs => arm 计算标志。从那里你必须看看统一汇编器允许想要什么,它似乎想要子。 (2认同)