绝想首页

关于LDR的几个问题(转载)

冰淇淋晋晋 [其他] 2013-03-02 21:30:04 星期六 晴天 查看:233 回复:0 发消息给作者

  由于受C语言编程的影响,总是想当然认为字符即代表值的大小,今天弄清楚了个概念,其实字母一般是代表地址,如程序:
LDR R0,=str ; r0,0x0c00001c ; = #0x0c000010
LDR R1,str
B loop
str DCD "123456789"
  其中LDR R0,=str 经disassmbly以后为(ldr r0,0x0c00001c ; = 0x0c000010),则可以说明字符str代表地址0x0c000010,而这个地址是存放在地址0x0c00001c处的,这里的LDR是伪指令,执行完指令后R0=0x0c000010。后面的LDR R1,str 经disassmbly以后为(ldr r1,str ; = #str),很明显R1即为0x0c000010中的内容。
再举个复杂点的例子,在我做UCOS移植的时候遇到,开始弄不清楚其中的关系,现在终于搞清楚了。(摘自OSStartHighRdy代码中的部分)
;Get current task TCB address
① LDR r4, addr_OSTCBCur
; Get highest priority task TCB address
② LDR r5, addr_OSTCBHighRdy
③ LDR r5, [r5] ; get stack pointer
④ LDR sp, [r5] ; switch to the new stack
⑤ STR r5, [r4] ; set new current task TCB address
结合前面的代码:
addr_OSTCBCur DCD OSTCBCur
addr_OSTCBHighRdy DCD OSTCBHighRdy
OSTCBCur、OSTCBHighRdy是全局标号,指向一个结构体TCB。
①经disassmbly为(LDR r4,addr_OSTCBCur ; = #addr_OSTCBCur),#addr_OSTCBCur即是OSTCBCur,执行后R4=0x0c70040(OSTCBCur代表的地址)。
②同理,执行后R5=0x0c70048(OSTCBHighRdy的地址)。
③此时R5得到的是OSTCBHighRdy真正的值x0c702124,也就是指向TCB的指针。
④、⑤现在就好理解了。

顶一下(34 写日记 1165821 224738
上一篇:购书欲下一篇:五一回了趟家
分享排行

 

 

留住已经逝去的峥嵘岁月 记住曾经绽现的万种风情 在记忆即将淡漠的时候 来把这些重新回味

Copyright (C) 2008-2014 www.juexiang.com, All Rights Reserved.

京ICP备2023001011号-3   京公网安备11010802011908号

客服QQ 1017160561 违法和不良信息举报电话 13148464312 邮箱 1017160561@qq.com