日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LDR 、ADR介绍

發布時間:2023/12/10 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LDR 、ADR介绍 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

請教:
(1)LDR R1,= 0x12345678 ;加載 32 位立即數
??????? ?LDR R1,0x12345678
有什么不相同啊?
一般在什么情況下用 LDR R1,= 0x12345678 ?
在什么情況下用 LDR R1,0x12345678 ?


(2)LDR R0,=LED_TAB ;加載標號地址
???????? LDR R0,LED_TAB
有什么不相同啊?
一般在什么情況下用 LDR R0,=LED_TAB ?
在什么情況下用 LDR R0,LED_TAB ?

====================================================

答:
1. 沒有“LDR R1,0x12345678 ”。
2. 以下兩條指令是一樣的,都被稱為“偽指令”,就是說編譯器會把這條指令替換成其他合適的指令。
LDR R1, =0x12345678
LDR R0, =LED_TAB
如果這些數值不太復雜,那么就會用mov指令代替,比如:
ldr r1, =0x00
在編譯時就會變成:
mov r1, #0x00

如果這些數值很復雜,那么編譯時,這個數值會被保存在某個地方,然后使用讀內存的指令進行讀取,比如:
LDR R1, =0x12345678
在編譯時變成:
ldr r1, [pc, xxxxx] // 這個xxx與pc相加,剛好就是some_locate的地址──編譯器會幫你做好這一切
some_locate: .word 0x12345678

3. 你說“LDR R0,=LED_TAB ;加載標號地址 ”,沒錯,
LED_TAB是個地址標號,就是一個數值而已,編譯器連接程序時會確定它的值,如果它很簡單,就會使用mov指令賦值;如果很復雜,就存在某個地址,然后用讀內存的指令讀出。

4. LDR R0,LED_TAB
沒有“=”號,它表示“讀內存”.
比如:
LDR R0,LED_TAB
LDR R1, =LED_TAB
LED_TAB: .work 0x12345678

R0的值是0x12345678,R1的值是LED_TAB標號值,就是0x12345678在內存中存放的地址

?

?

adr是將基于PC相對偏移的地址值或基于寄存器相對地址值讀取的為指令,而ldr用于加載32為立即數或一個地址到指定的寄存器中。到這兒就會看到其中的區別了。如果在程序中想加載某個函數或者某個在聯接時候指定的地址時請使用adr,例如在lds中需要重新定位的地址。當加載32為的立即數或外部地址時請用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
兩個片段的反匯編代碼
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相減的時候就不知道減到哪兒去了。

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的LDR 、ADR介绍的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。