1.格式
偽操作:它們不是ARM處理器實際的指令(如MOV, ADD等),而是寫給匯編器看的命令,用于指導匯編器如何工作
area reset, code, readonlycode32entry內容 end
- area:?這是最重要的一個偽操作,用于定義一個段。程序、數據、堆棧等都需要被組織在不同的段中。
- reset:?這是你為這個段起的名字。名字?reset?具有很強的暗示性,通常用于表示復位向量段,即CPU上電或復位后首先執行的第一段代碼所在的位置。
- code:?指定該段的屬性為代碼,意味著這個段包含可執行的指令。
- readonly:?指定該段的屬性為只讀。對于代碼段來說,這通常是默認且必須的。
- code32:?表示后續指令使用?32位的?ARM?指令集。
- thumb:?表示后續指令使用?16位的?Thumb?指令集
2.指令
2.1 mov
MOV{S}<c>?<Rd>,?#<const>
MOV{S}<c>?<Rd>,?<Rm>
mov r0, #0x8 //r0賦值為0x8 mov r1, r0 //r1賦值為r0即0x8 mov r3, #31 //r3賦值為31mov r0 #1 mov r6, r0, lsl #31 //將r0左移31位然后賦值給r6 mov r7, r0, lsl r3
2.2 add(加法)
立即數作為第二操作數: ADD{S}<c>?<Rd>,?<Rn>,?#<const>
寄存器作為第二操作數寄存器: ADD{S}<c>?<Rd>,?<Rn>,?<Rm>{,?<shift>}
寄存器作為第二操作數移位量: ADD{S}<c>?<Rd>,?<Rn>,?<Rm>,?<type>?<Rs>add r6, r0, #0xF0 //r6 = r0 + 0xf0 add r7, r0, r1 //r7 = r0 + r1 add r7, r0, r1, lsl #1 // r7 = r0 + (r1 << 1) add r8, r0, r1, lsl r2
注意
- {,?<shift>}?其中{}代表可選擇,“,”表示在使用時需要在Rm后添加“,” ,shift?移位量(立即數)
- add?r0,?#3,?#2?:為什么沒有這種形式,C語言int?a?=?1?+?2;?編譯階段計算,?不需要在機器指令中體現?
2.3 sub(減法)
用法同加法
2.4 ldr(加載)
LDR<c>?<Rt>,?<label>
ldr r0, =0xfff0
2.5 mvn(按位取反)
MVN{S}<c>?<Rd>,?#<const>
MVN{S}<c>?<Rd>,?<Rm>{,?<shift>}
MVN{S}<c>?<Rd>,?<Rm>,?<type>?<Rs>示例: mvn r0 , #0xffffffff // r0 = 0x0
2.6 bic(指定位置清0)
BIC{S}<c>?<Rd>,?<Rn>,?#<const>
BIC{S}<c>?<Rd>,?<Rn>,?<Rm>{,?<shift>}
BIC{S}<c>?<Rd>,?<Rn>,?<Rm>,?<type>?<Rs>示例: bic r0, #(1 << 2) //第二位清0 bic r0, #4 //0x0100 ,即第四位清0
orr:指定位置一
用法同bic
2.7 條件判斷標志NZCV
CPSR寄存器中條件判斷標志位
- N:?符號標志位:上條指令執行結果最高位bit31為1,則?N?=?1,?當結果作為有符號解釋時為負值;
- Z:?零值標志位:上條指令執行結果為0(即bit0?-?bit31?均為0),則?Z?=?1;
- C:?進位標志位:進行無符號解讀,如果在加法過程中進位或者減法時沒有借位,則為?C?=?1,否則?C?=?0
- V:?溢出標志位:進行有符號解讀,是否發生溢出?-2^31?-?2^31-1(兩個正數加得負數,兩個負數加得正數)
條件碼:eq?ge?gt?le?lt?al(無條件執行)
equal:等于
not?equal:不等于
2.8 cmp(比較指令)
CMP<c>?<Rn>,?#<const>
CMP<c>?<Rn>,?<Rm>{,?<shift>}
CMP<c>?<Rn>,?<Rm>,?<type>?<Rs>等價:cmp?r0,?r1?<==>?subs?r0,?r1
3.循環
循環三要素
- 循環結束條件
- 推動循環趨向終結的語句
- 循環的循環體
3.1 b指令(跳轉)
示例 ldr r0, =0x0fffmov r1, #0xf00mov r2, #0xf000cmp r0, r1bge greater //r0大于r1,執行greaterblt lessgreatermovge r3, r0b finish lessmovlt r3, r1
3.2 循環
示例:從1加到100的和mov r0, #0mov r1, #0 loopadd r1, r1, r0add r0, r0, #1cmp r0, #100ble loop //r0小于等于100, 就執行loop