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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

ARM中LDR伪指令与LDR加载指令

發(fā)布時間:2024/4/18 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ARM中LDR伪指令与LDR加载指令 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

ARM指令集中,LDR通常都是作加載指令的,但是它也可以作偽指令。

LDR偽指令的形式是“LDR Rn,=expr”。下面舉一個例子來說明它的用法。

COUNT EQU?????? 0x40003100

……

LDR?????? R1,=COUNT

MOV????? R0,#0

STR?????? R0,[R1]

COUNT是我們定義的一個變量,地址為0x40003100。這中定義方法在匯編語言中是很常見的,如果使用過單片機的話,應(yīng)該都熟悉這種用法。

LDR?????? R1,=COUNT是將COUNT這個變量的地址,也就是0x40003100放到R1中。

MOV????? R0,#0是將立即數(shù)0放到R0中。最后一句STR????? R0,[R1]是一個典型的存儲指令,將R0中的值放到以R1中的值為地址的存儲單元去。實際就是將0放到地址為0x40003100的存儲單元中去。可 見這三條指令是為了完成對變量COUNT賦值。用三條指令來完成對一個變量的賦值,看起來有點不太舒服。這可能跟ARM的采用RISC有關(guān)。

下面還有一個例子

;將COUNT的值賦給R0

LDR?????? R1,=COUNT

LDR?????? R0,[R1]

LDR?????? R1,=COUNT這條偽指令,是怎樣完成將COUNT的地址賦給R1,有興趣的可以看它編譯后的結(jié)果。這條指令實際上會編譯成一條LDR指令和一條DCD偽指令。

LDR 的兩種用法 1)LDR pc, =MyHandleIRQ 表示將MyHandleIRQ符號放入pc寄存器中 2)LDR PC,MyHandleIRQ 表示將讀取存儲器中MyHandleIRQ符號所表示的地址中的值,及需要多讀一次存儲器。 ? 在代碼中: start:
??????? ldr pc,=MyHandleReset?? @jump to HandleReset
??????? ldr pc,=MyHandleUndef?? @jump to HandleUndef
??????? ldr pc,=MyHandleSWI???? @jump to HandleSWI
??????? ldr pc,=MyHandleIabort? @jump to HandleIabort
??????? ldr pc,=MyHandleDabort? @jump to HandleDabort
??????? nop
??????? ldr pc,=MyHandleIRQ???? @jump to HandleIRQ?????????????<=之前出錯的一行
??????? ldr pc,=MyHandleFIQ???? @jump to HandleFIQ
? @MyHandleIRQ:?? .word OS_CPU_IRQ_ISR
MyHandleIRQ:
??????? sub lr, lr, #4????????? @ to calculate the return address???????
??????? stmdb sp!, {r0-r12,lr}
??????? ldr lr, =int_return???? @ restore the return address
??????? ldr pc, =int_handle???? @ call for the interrupt handler
在“之前出錯的一行”處,如果改成“l(fā)dr pc,MyHandleIRQ”當中斷來臨時,無法進行中斷處理。 ? 另一種情況是正確的,注意體會: start:
??????? ldr pc,=MyHandleReset?? @jump to HandleReset
??????? ldr pc,=MyHandleUndef?? @jump to HandleUndef
??????? ldr pc,=MyHandleSWI???? @jump to HandleSWI
??????? ldr pc,=MyHandleIabort? @jump to HandleIabort
??????? ldr pc,=MyHandleDabort? @jump to HandleDabort
??????? nop
??????? ldr pc,MyHandleIRQ???? @jump to HandleIRQ?????????????<=之前出錯的一行
??????? ldr pc,=MyHandleFIQ???? @jump to HandleFIQ
? MyHandleIRQ:?? .word OS_CPU_IRQ_ISR
@MyHandleIRQ:
@??????? sub lr, lr, #4????????? @ to calculate the return address???????
@??????? stmdb sp!, {r0-r12,lr}
@??????? ldr lr, =int_return???? @ restore the return address
@??????? ldr pc, =int_handle???? @ call for the interrupt handler
因為當中斷來臨時,還需要去MyHandleIRQ處把OS_CPU_IRQ_ISR取出,即多取一次存儲器。

總結(jié)

以上是生活随笔為你收集整理的ARM中LDR伪指令与LDR加载指令的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。