|
|||||||||||
| 技術交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術 | 電源技術 | 測控之家 | EMC技術 | ARM技術 | EDA技術 | PCB技術 | 嵌入式系統(tǒng) 驅動編程 | 集成電路 | 器件替換 | 模擬技術 | 新手園地 | 單 片 機 | DSP技術 | MCU技術 | IC 設計 | IC 產業(yè) | CAN-bus/DeviceNe |
再請教一下zlei |
| 作者:qiuyang957 欄目:ARM技術 |
;**************************************************** ;* Set MEMORY CONTROL registers * ;**************************************************** adr r0, ResetHandler ldr r1, =ResetHandler sub r0, r1, r0 ldr r1, =SMRDATA sub r0, r1, r0 ldmia r0, {r1-r13} ldr r0, =0x01c80000 stmia r0, {r1-r13} 第一句adr r0, ResetHandler是什么意思啊?還有兩個減運算語句的用意是什么呢? |
| 2樓: | >>參與討論 |
| 作者: zlei 于 2005/4/4 19:50:00 發(fā)布:
adr r0, ResetHandler ADR : 裝載地址 (load Address) ADR{后綴} <寄存器>, <標號> 它把參照的地址裝載到給定寄存器中: 00008FE4 OPT l% 00008FE4 E28F0004 ADR R0, text 00008FE8 EF000002 SWI "OS_Write0" 00008FEC E1A0F00E MOV PC, R14 00008FF0 .text 00008FF0 EQUS "Hello!" + CHR$13 + CHR$10 + CHR$0 00008FFC ALIGN 下列代碼有完全相同的效果: 00008FE4 OPT l% 00008FE4 E28F0004 ADD R0, R15, #4 00008FE8 EF000002 SWI "OS_Write0" 00008FEC E1A0F00E MOV PC, R14 00008FF0 .text 00008FF0 EQUS "Hello!" + CHR$13 + CHR$10 + CHR$0 00008FFC ALIGN 實際上,它們的反匯編將顯示: *MemoryI 8FE4 +18 00008FE4 : E28F0004 : ..忊 : ADR R0,&00008FF0 00008FE8 : EF000002 : ...? : SWI "OS_Write0" 00008FEC : E1A0F00E : .馉? : MOV PC,R14 00008FF0 : 6C6C6548 : Hell : STCVSTL CP5,C6,[R12],#-&120 ; =288 00008FF4 : 0A0D216F : o!.. : BEQ &003515B8 00008FF8 : 00000000 : .... : DCD &00000000 ADR 是一個很有用的指令,你不需要關心相對 R15 的偏移量(例如,我們?yōu)槭裁粗患?4?),也不需要在一塊代碼上計算偏移量。可以簡單的使用 ADR Rx, label 而匯編器將設法為你使用 ADD、SUB、MOV 或 MVN 中最恰當?shù)哪莻指令。限制因素是你的引用范圍只能是在 4096 字節(jié)中(不完全是真的,它典型的對 ADD 或 SUB 使用被循環(huán)右移的立即值,但是為了參數(shù)的一致性,我們假定范圍是 4K)。 |
|
| 3樓: | >>參與討論 |
| 作者: zlei 于 2005/4/4 20:11:00 發(fā)布:
可以這樣理解 adr r0, ResetHandler ;[r0]=ResetHandler地址 ldr r1, =ResetHandler ;[r1]=ResetHandler地址 sub r0, r1, r0 ;[r0]=r1-r0=0 這幾句話最終把r0清零了。 ldr r1, =SMRDATA ;[r1]=SMRDATA地址 sub r0, r1, r0 ;;[r0]=r1-r0=SMRDATA地址 這些話等同于一句:ldr r0,=SMRDATA 不知道為什么要這樣寫。 |
|
| 4樓: | >>參與討論 |
| 作者: qiuyang957 于 2005/4/4 20:25:00 發(fā)布:
還有一點疑惑 zlei:感覺你真是個高手。非常感謝您的耐心解答! adr r0, ResetHandler ldr r1, =ResetHandler 感覺這兩句好象沒什么本質的區(qū)別呀,不都是把標號ResetHandler的地址給寄存器呀 |
|
| 5樓: | >>參與討論 |
| 作者: cxzeng 于 2005/4/7 22:59:00 發(fā)布:
我來回答你吧 兩條都是偽指令 ADR 翻譯成真實指令一般是相對于當前PC 的尋址,如: ADR r0,Table1 => MOV r0,[pc+n] LDR R0,=Table1,可能產生相對PC的尋址,也可能產生lital pool |
|
| 6樓: | >>參與討論 |
| 作者: php139 于 2005/4/7 23:40:00 發(fā)布:
我來插嘴說兩句 zlei say 可以這樣理解 adr r0, ResetHandler ;[r0]=ResetHandler地址 ldr r1, =ResetHandler ;[r1]=ResetHandler地址 sub r0, r1, r0 ;[r0]=r1-r0=0 這幾句話最終把r0清零了。 ldr r1, =SMRDATA ;[r1]=SMRDATA地址 sub r0, r1, r0 ;;[r0]=r1-r0=SMRDATA地址 這些話等同于一句:ldr r0,=SMRDATA 不知道為什么要這樣寫。 sub r0, r1, r0 是否為了判斷 PC 是否真的jump 到 ResetHandler 處 因為 adr 是有范圍限制的 |
|
|
|
| 免費注冊為維庫電子開發(fā)網會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |