ARM 常用匯編指令
ARM 匯編程序的框架結構
.section .data
<初始化的數據>
.section.bss
<未初始化的數據>
.section .text
.global _start
_start:
<匯編代碼>
註意: 一般是將上面結構進行簡化
.text
.global _start
_start:
<匯編代碼>
寄存器操作指令:
算術和邏輯指令:
MOV :用於將一個寄存器或被移位寄存器或一個立即數移動到目的寄存器
MOV r1 ,#8 (註意:#+數,表示一個十進制數,#+0b數,表示一個二進制數,
MVN :對源操作數取反再賦值給目的寄存器
MOV R1,#8
SUB : 將一個數減去另外一個數再存放如寄存器
SUB R1,#8,#6(8-6)
ADD:將一個數加上另外一個數後將其存放如寄存器中
ADD R1,R2,R3
AND :邏輯與
AND R1,R2,#0
BIC:位清除
BIC R1,R2,#0B1101
將R2中所與#b1101中1所對應的位清零後的結果保存在R1中
比較指令:
CMP:顧名思義,用於比較兩個數的大小,比較的結果不過會放在哪個通用寄存器中而是改在程序狀態寄存器中的一個標誌狀態位
CMP R1,#0B111010
TST:測試位,將兩個數按位與
TST R1,R2
分枝指令:
B:條件跳轉指令
B [條件] 標號 (註意 :中括號在編寫程序時不需要寫出)
BL :帶連接的返回(類似於C語言中的子函數調用,調用子函數後返回主函數)
移位指令:
LSL:算術左移位
MOV R1,R1,LSL#2(將R1中的數據左移兩位存入R1)
ROR:循環右移
MOV R1,R1,#ROR 2(將R1中的數據循環右移後存入R1中)
程序狀態字訪問指令:
上面所學指令都不能對計算機中的程序狀態字中的指令進行訪問和讀寫,所以需要專用計算機指令來將程序狀態字中的數據讀寫到通用寄存器中,在進行修改後寫入
MRS :將程序狀態字中的數據搬出來
MRS R0,CPRS
MSR:將數據搬回程序狀態字中
MSR CPRS, R0
存儲器操作指令:
LDR :將內存中的值導出到通用寄存器中
LDR R0 ,#0XFF ‘
STR:將同用寄存器中的數據寫回到內存中
STR R0 ,#0XFF
偽指令:
定義類偽指令:(1:編譯時起作用2:起作用但是轉化為其他機器指令)
.global 表明一個全局的符號 (註意GNU偽指令的特點在前面加上一個“.”)
.data 定義一個數據段
.ascii 定義字符串的數據
.byte 定義一個字節的數據
.word 定義一個字的數據
.data
.equ (類似於C語言中定義宏)
.align 用於字節對齊
操作類偽指令:
nop:空操作指令 \
具體實現:mov r0 ,r0
ldr:用於將一個大於八位的數據裝入寄存器
註意:ldr r0 ,=0x1ff
這裏後面是用的等號這裏和其他地方有些不一樣
協處理指令:(最重要是就是CP15)
作用:系統控制
mcr:
mrc:
mrc p15,0, r0 ,c0,c0,0
註意:藍色部分是由芯片手冊的cp15寄存器訪問列表給出的以訪問不同寄存器 。紅色部分是內核內部通用寄存器
ARM 常用匯編指令