由于受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的指针。
④、⑤现在就好理解了。
关于LDR的几个问题(转载)

心情分类
推荐日记
分享排行