linux net 伪指令码,1.2.2. ldr pWTCON
偽指令,就是“偽”的指令,是針對“真”的指令而言的。
真的指令就是那些常見的指令,比如上面說的arm的ldr,bic,msr等等指令,是arm體系架構中真正存在的指令,你在arm匯編指令集中找得到對應的含義。
而偽指令是寫出來給匯編程序看的,匯編程序能看的偽指令具體表示的是啥意思,然后將其翻譯成真正的指令或者進行相應的處理。
偽指令ldr語法和含義:
另外還有一個就是ldr偽指令,雖然ldr偽指令和ARM的ldr指令很像,但是作用不太一樣。ldr偽指令可以在立即數前加上=,以表示把一個地址寫到某寄存器中,比如:
ldr r0, =0x12345678
這樣,就把0x12345678這個地址寫到r0中了。所以,ldr偽指令和mov是比較相似的。
只不過mov指令后面的立即數是有限制的,這個立即數,能夠必須由一個8位的二進制數,即屬于0x00-0xFF內的某個值,經過偶數次右移后得到,這樣才是合法數據,而ldr偽指令沒有這個限制。
那為何ldr偽指令的操作數沒有限制呢,那是因為其是偽指令,寫出來的偽指令,最終會被編譯器解釋成為真正的,合法的指令的,一般都是對應的mov指令。
這樣的話,寫匯編程序的時候,使用MOV指令是比較麻煩的,因為有些簡單的數據比較容易看出來,有些數據即不容易看出來是否是合法數據。所以,對此,ldr偽指令的出現,就是為了解決這個問題的,你只管放心用ldr偽指令,不用關心操作數,而寫出的ldr偽指令,編譯器會幫你翻譯成對應的真正的匯編指令的。
而關于編譯器是如何將這些ldr偽指令翻譯成為真正的匯編指令的,我的理解是,其自動會去算出來對應的操作數,是否是合法的mov 的操作數,如果是,就將該ldr偽指令翻譯成mov指令,否則就用別的方式處理,我所觀察到的,其中一種方式就是,單獨申請一個4字節的空間用于存放操作數,然后用ldr指令實現。
在uboot中,最后make完畢之后,會生產u-boot,
通過:arm-linux-objdump –d u-boot > dump_u-boot.txt
就可以把對應的匯編代碼輸出到該txt文件了,其中就能找到偽指令:ldr r0, =0x53000000
所對應的,真正的匯編代碼:33d00068:e3a00453 movr0, #1392508928; 0x53000000
所以被翻譯成了mov指令。
而經過我的嘗試,故意將0x53000000改為0x53000010,對應的生產的匯編代碼為:33d00068:e59f0408 ldrr0, [pc, #1032]; 33d00478
......
33d00478:53000010 .word0x53000010
其中可以看到,由于0x53000010不是有效的mov的操作數,沒法找到合適的0x00-0Xff去通過偶數次循環右移而得到,所以只能換成此處這種方式,即在另外申請一個word的空間用于存放這個值:33d00478:53000010 .word0x53000010
然后通過計算出相對當前PC的偏移,得到的地址,用ldr指令去除該地址中的值,即0x53000010,送給r0,比起mov指令,要復雜的多,也多消耗了一個word的空間。
對應地,其他的方式,個人理解,好像也可以通過MVN指令來實現,具體細節,有待進一步探索。
總結
以上是生活随笔為你收集整理的linux net 伪指令码,1.2.2. ldr pWTCON的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: samba安装_Centos安装Samb
- 下一篇: linux 其他常用命令