改动跑马灯程序,将LED0=0程序用汇编写,然后主程序调用!样例程序在单步执行时LED0=0这条语句的反汇编如图,可知GPIOB的输出寄存器地址是0x42210189(驱动二极管的那个管脚),最终赋了个0值进去!然后我将这段汇编语句重新封装,再在主程序中调用,单步执行到所写汇编语句处,发现并没有找到0x42210189这个地址,最终是跳转到void BusFault_Handler(void)出不来了!所以哪位大神知道这个地址偏移是如何计算的???
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
其实原来这里就是ldr r1, = 0x42210189
编译器把 0x42210189 放到后面文字池里,然后吧这里改成个偏移值,你写就直接写数据就好啦。 下面那个改成str r0, [r1] 。 你那样写把个不知道什么数据放到R1然后还往里写数据,不出错误才怪。。
研究这些有什么用啊? 还有这个0x42210189地址算的对么,怎么后面是个9。。。 这个PUSH感觉也没用吧,你放到堆栈又不用。其他的看不懂,不熟悉这个风格的,我都是写GNU ARM 汇编
[mw_shl_code=applescript,true] AREA LED,CODE,READONLY
PRESERVE8
THUMB
LEDB PROC
EXPORT LEDB [WEAK]
PUSH { LR}
MOVS r0,#0x00
LDR r1,[pc,#1232]
STR r0,[r1,#0x194]
BX LR
ENDP
END
[/mw_shl_code]
你说的对,是42218194,地址都是四字节对齐的,我说错了,不好意思啊,这个偏移地址我知道是怎么算的了。我刚接触汇编,低级简单的问题各种各样,望见谅啊!若有不会,望大神不吝指教
一周热门 更多>