arm體系中,資料從記憶體到cpu暫存器之間移動只能使用ldr/str(此處ldr不是偽指令),mov只用於暫存器之間移動資料或者把有限制的立即數賦給暫存器。例如下面的語句:
count equ 0x40003100
ldr r1,=count
mov r0,#0
str r0,[r1]
count是定義的變數;ldr源運算元前有=號則為偽指令,含義是把count值或乙個常值賦給r1。ldr指令的源運算元前如果沒有=號,則不是偽指令,類似指標操作,把count這個值所代表的位址即0x40003100位址中的值賦給r1。這麼說可能不太好理解,再舉個例子:
ldr r0,uartlcon0,意思是將uartlcon0暫存器的內容存入r1,類似c語言中的指標*uartlcon0,取位址uartlcon0指向的值;
ldr r0,=uartlcon0,意思是是將uartlcon0暫存器的位址存入r1,類似c語言中的指標本身值uartlcon0,即是乙個位址值;
mov語句只能把8bit連續有效位通過偶數次移位後的數賦給目的暫存器,如果想不受限制賦值,則推薦使用ldr,彙編器分析ldr偽指令語句根據=號後面的常值,如果常值能通過8bit常數加4bit移位數(乘2得迴圈移位數)獲取到,則轉換為mov語句,否則轉為ldr rn [pc,#offset],即先把常值存放到pc+offset位址處,再賦值(因為arm是32位指令系統,乙個32位指令不能即包括指令又包括乙個32位的數)。pc+offset位址位於ltorg偽操作宣告的文字緩衝池(literal pool)內,緩衝池以ltorg開始,以end結束,也可只有ltorg,代表只有乙個32bit空間。ltorg偽操作一般位於無條件跳轉指令之後,或者子程式返回指令之後,如果不宣告ltorg,系統把緩衝池放在所有程式之後(但是arm指令要求偏移值到當前pc小於4kb,thumb要求1kb),這樣處理器不會錯誤的將緩衝池中的資料當做指令來執行;
str語句是把r0的值存放到以r1中的值為位址的儲存單元中。
另外,ldr r0, [r1], #-4命令:讀取r1位址上的儲存器單元內容,然後r1=r1-4;strcc r0, [r1], #4命令:把r0暫存器內容儲存到位址為r1的儲存單元上,然後r1=r1+4。
Arm指令集 偽指令
目錄 arm指令集 跳轉指令 資料處理 程式狀態暫存器傳輸指令 load srote指令 協處理器指令 異常中斷產生指令 gnu arm偽指令 資料定義 彙編控制 其他指令 blx register string abcd efgh hello asciz qwer sun world ascii ...
ARM彙編偽指令
global,local,set,equ global 使得符號對聯結器可見,變為對整個工程可用的全域性變數,通俗講就是定義全域性變數 eg global symbol local set 給乙個全域性變數或區域性變數賦值,和.equ的功能一樣 eg set symbol expr set star...
ARM彙編偽指令
資料定義偽指令 彙編控制偽操作 雜項.global,local,set,equ 使得符號對聯結器可見,變為對整個工程可用的全域性變數,通俗講就是定義全域性變數 eg global symbol 給乙個全域性變數或區域性變數賦值,和.equ的功能一樣 eg set symbol expr set st...