Gcc ARM汇编-简单闪烁程序拒绝执行部分代码

Gcc ARM汇编-简单闪烁程序拒绝执行部分代码,gcc,assembly,arm,lpc,Gcc,Assembly,Arm,Lpc,我正在尝试闪烁LPC4088上的LED,并且我已经正确准备了外围寄存器。现在是闪烁LED的时候了,这是应该闪烁的循环: blink: @ In register SET1 (0x20098038) we set bits: @ bit 13 = 1 > sets pin P1_13 to high state ldr r0, =0x20098038 ldr r1, [r0] ldr r2, =0x2000 orr r1, r2

我正在尝试闪烁LPC4088上的LED,并且我已经正确准备了外围寄存器。现在是闪烁LED的时候了,这是应该闪烁的循环:

blink:

    @ In register SET1 (0x20098038) we set bits:
    @ bit 13 = 1    >   sets pin P1_13 to high state
    ldr r0, =0x20098038
    ldr r1, [r0]
    ldr r2, =0x2000
    orr r1, r2
    str r1, [r0]

    @ NO DELAY NEEDED FOR DEBUG

    @ In register CLR1 (0x2009803C) we set bits:
    @ bit 13 = 1    >   sets pin P1_13 to low state
    ldr r0, =0x2009803C
    ldr r1, [r0]
    ldr r2, =0x2000
    orr r1, r2
    str r1, [r0]

    @ NO DELAY NEEDED FOR DEBUG

    b blink
当我在调试器中检查代码的执行情况时,我注意到first@NO DELAY required FOR DEBUG之前的循环的第一部分执行得很好,并且在执行命令str r1、[r0]时LED正好打开

现在是循环的第二部分,在第一个@NO DELAY NEEDED FOR DEBUG之后,当我尝试执行ldr r0时,=0x2009803C LED不会熄灭。相反,我的程序直接跳到循环的第一部分,并在下一步执行ldr r0,=0x20098038。因此,请注意:

ldr r1, [r0]
ldr r2, =0x2000
orr r1, r2
str r1, [r0]
在循环的第二部分中,从不执行


这段代码在以前的C代码中工作得非常好。。。有人发现错误吗,因为我不能。我是否以某种方式覆盖了寄存器?可能是我的编译器以某种方式优化了代码吗

不允许读取地址为2009803c的寄存器CLR1,因为它是只写的,请参阅用户手册。因此,您会遇到一个错误,我不确定到底是哪一个,可能是MemManageFault,也可能是BusFault。通常它会跳转到错误处理程序,但从您看到的行为来看,它似乎重新启动了程序


解决方案不是读取SET或CLR寄存器,您应该只写入要设置或清除的位模式。

汇编程序不会优化。至少不是gnu。你启用gpio的时钟了吗?在没有循环的情况下只尝试其中一个,只需打开即可。然后制作一个刚关闭的版本。最好在没有调试器的情况下分别尝试每种方法。如果你不能强迫它继续,也不能强迫它继续,那么你就不能眨眼,你看到它的原因可能不是你想的。我发现了!评论搞乱了我的代码!我删除了他们,它现在可以工作了。。。什么删除或自我回答。b查看程序集转储的lst文件,看看您的好代码和坏代码是如何呈现的。您的反汇编在有注释和没有注释的情况下显示了什么?它是否至少在某种程度上与您的代码匹配ldr=0x。。。使用池数据导致mov或pc相对负载。