LDR 、ADR介绍
請教:
(1)LDR R1,= 0x12345678 ;加載 32 位立即數(shù)
??????? ?LDR R1,0x12345678
有什么不相同啊?
一般在什么情況下用 LDR R1,= 0x12345678 ?
在什么情況下用 LDR R1,0x12345678 ?
(2)LDR R0,=LED_TAB ;加載標(biāo)號地址
???????? LDR R0,LED_TAB
有什么不相同啊?
一般在什么情況下用 LDR R0,=LED_TAB ?
在什么情況下用 LDR R0,LED_TAB ?
====================================================
答:
1. 沒有“LDR R1,0x12345678 ”。
2. 以下兩條指令是一樣的,都被稱為“偽指令”,就是說編譯器會把這條指令替換成其他合適的指令。
LDR R1, =0x12345678
LDR R0, =LED_TAB
如果這些數(shù)值不太復(fù)雜,那么就會用mov指令代替,比如:
ldr r1, =0x00
在編譯時(shí)就會變成:
mov r1, #0x00
如果這些數(shù)值很復(fù)雜,那么編譯時(shí),這個(gè)數(shù)值會被保存在某個(gè)地方,然后使用讀內(nèi)存的指令進(jìn)行讀取,比如:
LDR R1, =0x12345678
在編譯時(shí)變成:
ldr r1, [pc, xxxxx] // 這個(gè)xxx與pc相加,剛好就是some_locate的地址──編譯器會幫你做好這一切
some_locate: .word 0x12345678
3. 你說“LDR R0,=LED_TAB ;加載標(biāo)號地址 ”,沒錯(cuò),
LED_TAB是個(gè)地址標(biāo)號,就是一個(gè)數(shù)值而已,編譯器連接程序時(shí)會確定它的值,如果它很簡單,就會使用mov指令賦值;如果很復(fù)雜,就存在某個(gè)地址,然后用讀內(nèi)存的指令讀出。
4. LDR R0,LED_TAB
沒有“=”號,它表示“讀內(nèi)存”.
比如:
LDR R0,LED_TAB
LDR R1, =LED_TAB
LED_TAB: .work 0x12345678
R0的值是0x12345678,R1的值是LED_TAB標(biāo)號值,就是0x12345678在內(nèi)存中存放的地址
?
?
adr是將基于PC相對偏移的地址值或基于寄存器相對地址值讀取的為指令,而ldr用于加載32為立即數(shù)或一個(gè)地址到指定的寄存器中。到這兒就會看到其中的區(qū)別了。如果在程序中想加載某個(gè)函數(shù)或者某個(gè)在聯(lián)接時(shí)候指定的地址時(shí)請使用adr,例如在lds中需要重新定位的地址。當(dāng)加載32為的立即數(shù)或外部地址時(shí)請用ldr。
下面是???
??? ldr r0,_start
??? ldr r1,_TEXT_BASE
??? ldr r2,_armboot_start
??? ldr r3,_bss_start
??? sub r2,r3,r2
??? add r2,r2,r0
和
??? adr r0,_start
??? ldr r1,_TEXT_BASE
??? adr r2,_armboot_start
??? adr r3,_bss_start
??? sub r2,r3,r2
??? add r2,r2,r0
兩個(gè)片段的反匯編代碼
80000068:??? e51f0070???? ldr??? r0, [pc, #ffffff90]??? ; 80000000 <_start>
8000006c:??? e51f1054???? ldr??? r1, [pc, #ffffffac]??? ; 80000020 <_TEXT_BASE>
80000070:??? e51f2054???? ldr??? r2, [pc, #ffffffac]??? ; 80000024 <_armboot_start>
80000074:??? e51f3054???? ldr??? r3, [pc, #ffffffac]??? ; 80000028 <_bss_start>
80000078:??? e0432002???? sub??? r2, r3, r2
8000007c:??? e0822000???? add??? r2, r2, r0
--------------------------------------------------------------------------
80000068:??? e24f0070???? sub??? r0, pc, #112??? ; 0x70
8000006c:??? e24f1054???? sub??? r1, pc, #84??? ; 0x54
80000070:??? e24f2054???? sub??? r2, pc, #84??? ; 0x54
80000074:??? e24f3054???? sub??? r3, pc, #84??? ; 0x54
80000078:??? e0432002???? sub??? r2, r3, r2
8000007c:??? e0822000???? add??? r2, r2, r0
由于ldr是讀取的32為地址,因此會自動用fffff來填充,可是用PC相減的時(shí)候就不知道減到哪兒去了。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的LDR 、ADR介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: socket 编程入门教程(一)TCP
- 下一篇: 亚马逊电子书退出国内市场 程序员开发Ki