天天看點

嵌入式之ARM彙編

文章目錄

    • 彙編語言長什麼的樣子呢?
    • ARM彙編
      • 指令條件和狀态Status碼
      • ARM彙編尋址方式
      • 資料操作(ALU操作)
      • 邏輯操作(與,或,非,異或)
      • 比較操作
      • 記憶體操作
      • 跳轉,狀态操作
      • 狀态寄存器操作
      • 異常産生指令
      • ARM僞指令
        • 彙編語言程式中常用的符号
        • 寄存器操作
        • 資料定義僞彙編
        • 控制僞指令

彙編語言長什麼的樣子呢?

  • 舉例:向寄存器中一個值添加100

    x86:add eax,#100

    68K:ADD #100,D0

    ARM:add r0,r0,#100

  • 舉例:從一個寄存器指針加載到寄存器

    x86:mov eax,DWORD PTR[ebx]

    68K:MOVE L (A0),D0

    ARM:ldr r0,[r1]

  • 舉例:ARM起始代碼結構
    嵌入式之ARM彙編
  • ARM彙編指令格式:

    Operation[cond]{status} Rd,Rn, Operand2

ARM彙編

指令條件和狀态Status碼

  • 條件碼(cond)
    嵌入式之ARM彙編
  • 狀态碼(Status)
嵌入式之ARM彙編

ARM彙編尋址方式

  • 立即數尋址:

    ADD R0,R0,#0x3F

  • 寄存器尋址:

    ADD R0,R1,R2

  • 寄存器間接尋址

    LDR R0,[R1]

    STR R0,[R1]

  • 寄存器移位尋址

    ADD R3,R2,R1,LSL #2 (R1 左移兩位再加上R1,然後指派給R3)

  • 基址位址尋址

    LDR R0,[R1,#4] (把R1位址加上4所指向的值指派給R0)

    LDR R0,[R1],#4(把R1位址取出的值加上4指派給R0)

    LDR R0,[R1,R2]

  • 多寄存器尋址

    LDMIA R0,{R1,R2,R3,R4}

  • 相對尋址

    BL NEXT (跳轉到NEXT)

    MOV PC,LR

資料操作(ALU操作)

嵌入式之ARM彙編
嵌入式之ARM彙編

邏輯操作(與,或,非,異或)

嵌入式之ARM彙編

比較操作

嵌入式之ARM彙編

記憶體操作

單寄存器讀寫指令

嵌入式之ARM彙編

多寄存器讀寫指令

嵌入式之ARM彙編
  • 位址模式

    (1)資料塊模式:IA(傳輸後位址加4),IB(傳輸前位址加4),DA(傳輸後位址減4),DB(傳輸前位址減4)

    (2)堆棧模式:滿底層堆棧,EA(空遞減堆棧),FD(滿遞減堆棧),ED(空遞增堆棧),FA(滿遞增堆棧)

資料交換指令

嵌入式之ARM彙編

跳轉,狀态操作

Opcode Operands Description Function
B 跳轉指令 pc<-label
BL 帶傳回的連接配接跳轉 pc->-label
BX 跳轉并切換狀态Thumb
BLX 帶傳回的跳轉并切換狀态Thumb

狀态寄存器操作

狀态寄存器操作:把32位指令分為四個域:[7:0]控制位域c,[15:8]擴充位域x,[23:16]狀态位域s,[31:24]條件标志位域f

Opcode Operands Description Function
MRS 把程式狀态寄存器的值傳送到通用寄存器
MSR CPSR R0 ;SPSR,R0;CPSR_c R0 通用寄存器到程式狀态寄存器

異常産生指令

Opcode Operands Description Function
SWI SWI 0x02 軟中斷指令
BKPT BKPT 斷點中斷指令

ARM僞指令

在ARM彙編語言程式裡,有一些特殊指令助記符,這些助記符與指令系統的助記符不同,沒有相對應的操作碼,通常稱這些特殊指令助記符為僞指令,他們所完成的操作稱為僞操作。僞指令在源程式中的作用是為完成彙程式設計式作各種準備工作的,這些僞指令僅在彙編過程中起作用,一旦彙編結束,僞指令的使命就完成。

  • 基本常用僞指令
    嵌入式之ARM彙編
    嵌入式之ARM彙編
    嵌入式之ARM彙編

彙編語言程式中常用的符号

  • 符号命名約定:

    (1)符号區分大小寫,同名的大小寫符号會被編譯器認為是兩個不同的符号。

    (2)符号在其作用範圍内必須唯一。

    (3)自定義的符号不能與系統的保留字相同。

    (4)符号名不應與指令或僞指令同名

  • 符号,變量

    ARM(Thumb)彙程式設計式所支援的變量有數字變量,邏輯變量和字元串變量

    嵌入式之ARM彙編
  • 常量

    (1)數字常量一般是32位的整數,當作為無符号數時,其取值範圍為0 ~ 232-1,當作為有符号數時,其取值範圍為-231 ~ 231-1

    (2)邏輯常量隻有兩種取值情況:真或假

    (3)字元串常量為一個固定的字元串,一般用于程式運作時的資訊提示

  • 變量代換符

    程式中的變量可通過代換操作取得一個常量。代換操作符為:“”$“”

    Sample:

LCLS S1
LCL S2
S1 SETS "Test!"
S2 SETS "This is a  $S1"   ;字元串變量S2的值為    This is a Test!
           
  • 表達式和運算符
    嵌入式之ARM彙編

寄存器操作

寄存器操作

嵌入式之ARM彙編

資料定義僞彙編

資料定義僞彙編

嵌入式之ARM彙編
嵌入式之ARM彙編

控制僞指令

嵌入式之ARM彙編

Sample:

GBLL Test ;聲明一個全局的邏輯變量,變量名為Test
……
IF Test = TRUE
指令序列1
ELSE
指令序列2
ENDIF


GBLA Counter ;聲明一個全局的數學變量,變量名為Counter 
Counter SETA 3 ;由變量Counter控制循環次數 
…… 
WHILE Counter < 10 
指令序列 
WEND


MACRO
$OP hello world $param1,$param2
MOV R3,#0x02
MEXIT
MEND