ARMCM3汇编指令
16位數(shù)據(jù)操作指令
名字 功能
ADC 帶進(jìn)位加法(ADD with Carry)
ADD 加法
AND 按位與。這里的按位與和C的”&”功能相同
ASR 算術(shù)右移(Arithmetic Shift Right)
BIC 按位清零(把一個(gè)數(shù)跟另一個(gè)無符號(hào)數(shù)的反碼按位與)
CMN 負(fù)向比較(把一個(gè)數(shù)跟另一個(gè)數(shù)據(jù)的二進(jìn)制補(bǔ)碼相比較)
CMP 比較(Compare,比較兩個(gè)數(shù)并且更新標(biāo)志)
CPY 把一個(gè)寄存器的值拷貝(COPY)到另一個(gè)寄存器中
EOR 近位異或
LSL 邏輯左移(Logic Shift Left)
LSR 邏輯右移(Logic Shift Right)
MOV 寄存器加載數(shù)據(jù),既能用于寄存器間的傳輸,也能用于加載立即數(shù)
MUL 乘法(Multiplication)
MVN 加載一個(gè)數(shù)的 NOT值(取到邏輯反的值)
NEG 取二進(jìn)制補(bǔ)碼
ORR 按位或
ROR 循環(huán)右移
SBC 帶借位的減法
SUB 減法(Subtraction)
TST 測試(Test,執(zhí)行按位與操作,并且根據(jù)結(jié)果更新Z)
REV 在一個(gè)32位寄存器中反轉(zhuǎn)(Reverse)字節(jié)序
REVH 把一個(gè)32位寄存器分成兩個(gè)(Half)16位數(shù),在每個(gè)16位數(shù)中反轉(zhuǎn)字節(jié)序
REVSH 把一個(gè)32位寄存器的低16位半字進(jìn)行字節(jié)反轉(zhuǎn),然后帶符號(hào)擴(kuò)展到32位
SXTB 帶符號(hào)(Signed)擴(kuò)展一個(gè)字節(jié)(Byte)到 32位
SXTH 帶符號(hào)(Signed)擴(kuò)展一個(gè)半字(Half)到 32位
UXTB 無符號(hào)(Unsigned)擴(kuò)展一個(gè)字節(jié)(Byte)到 32位
UXTH 無符號(hào)(Unsigned)擴(kuò)展一個(gè)半字(Half)到 32位
16位轉(zhuǎn)移指令
名字 功能
B 無條件轉(zhuǎn)移(Branch)
B 有條件(Condition)轉(zhuǎn)移
BL 轉(zhuǎn)移并連接(Link)。用于呼叫一個(gè)子程序,返回地址被存儲(chǔ)在LR中
CBZ 比較(Compare),如果結(jié)果為零(Zero)就轉(zhuǎn)移(只能跳到后面的指令)
CBNZ 比較,如果結(jié)果非零(Non Zero)就轉(zhuǎn)移(只能跳到后面的指令)
IT If-Then
16位存儲(chǔ)器數(shù)據(jù)傳送指令
名字 功能
LDR 從存儲(chǔ)器中加載(Load)字到一個(gè)寄存器(Register)中
LDRH 從存儲(chǔ)器中加載半(Half)字到一個(gè)寄存器中
LDRB 從存儲(chǔ)器中加載字節(jié)(Byte)到一個(gè)寄存器中
LDRSH 從存儲(chǔ)器中加載半字,再經(jīng)過帶符號(hào)擴(kuò)展后存儲(chǔ)一個(gè)寄存器中
LDRSB 從存儲(chǔ)器中加載字節(jié),再經(jīng)過帶符號(hào)擴(kuò)展后存儲(chǔ)一個(gè)寄存器中
STR 把一個(gè)寄存器按字存儲(chǔ)(Store)到存儲(chǔ)器中
STRH 把一個(gè)寄存器存器的低半字存儲(chǔ)到存儲(chǔ)器中
STRB 把一個(gè)寄存器的低字節(jié)存儲(chǔ)到存儲(chǔ)器中
LDMIA 加載多個(gè)字,并且在加載后自增基址寄存器
STMIA 存儲(chǔ)多個(gè)字,并且在存儲(chǔ)后自增基址寄存器
PUSH 壓入多個(gè)寄存器到棧中
POP 從棧中彈出多個(gè)值到寄存器中
其它16位指令
名字 功能
SVC 系統(tǒng)服務(wù)調(diào)用(Service Call)
BKPT 斷點(diǎn)(Break Point)指令。如果調(diào)試被使能,則進(jìn)入調(diào)試狀態(tài)(停機(jī))。
NOP 無操作(No Operation)
CPSIE 使能 PRIMASK(CPSIE i)/FAULTMASK(CPSIE f)——清零相應(yīng)的位
CPSID 除能 PRIMASK(CPSID i)/FAULTMASK(CPSID f)——置位相應(yīng)的位
32位數(shù)據(jù)操作指令
名字 功能
ADC 帶進(jìn)位加法
ADD 加法
ADDW 寬加法(可以加 12 位立即數(shù))
AND 按位與(原文是邏輯與,有誤——譯注)
ASR 算術(shù)右移
BIC 位清零(把一個(gè)數(shù)按位取反后,與另一個(gè)數(shù)邏輯與)
BFC 位段清零
BFI 位段插入
CMN 負(fù)向比較(把一個(gè)數(shù)和另一個(gè)數(shù)的二進(jìn)制補(bǔ)碼比較,并更新標(biāo)志位)
CMP 比較兩個(gè)數(shù)并更新標(biāo)志位
CLZ 計(jì)算前導(dǎo)零的數(shù)目
EOR 按位異或
LSL 邏輯左移
LSR 邏輯右移
MLA 乘加
MLS 乘減
MOVW 把 16 位立即數(shù)放到寄存器的底16位,高16位清0
MOV 加載16位立即數(shù)到寄存器(其實(shí)匯編器會(huì)產(chǎn)生MOVW——譯注)
MOVT 把 16 位立即數(shù)放到寄存器的高16位,低 16位不影響
MVN 移動(dòng)一個(gè)數(shù)的補(bǔ)碼
MUL 乘法
ORR 按位或(原文為邏輯或,有誤——譯注)
ORN 把源操作數(shù)按位取反后,再執(zhí)行按位或(原文為邏輯或,有誤——譯注)
RBIT 位反轉(zhuǎn)(把一個(gè) 32 位整數(shù)先用2 進(jìn)制表達(dá),再旋轉(zhuǎn)180度——譯注)
REV 對一個(gè)32 位整數(shù)做按字節(jié)反轉(zhuǎn)
REVH/REV16 對一個(gè)32 位整數(shù)的高低半字都執(zhí)行字節(jié)反轉(zhuǎn)
REVSH 對一個(gè)32 位整數(shù)的低半字執(zhí)行字節(jié)反轉(zhuǎn),再帶符號(hào)擴(kuò)展成32位數(shù)
ROR 圓圈右移
RRX 帶進(jìn)位的邏輯右移一格(最高位用C 填充,且不影響C的值——譯注)
SFBX 從一個(gè)32 位整數(shù)中提取任意的位段,并且?guī)Х?hào)擴(kuò)展成 32 位整數(shù)
SDIV 帶符號(hào)除法
SMLAL 帶符號(hào)長乘加(兩個(gè)帶符號(hào)的 32 位整數(shù)相乘得到 64 位的帶符號(hào)積,再把積加到另一個(gè)帶符號(hào) 64位整數(shù)中)
SMULL 帶符號(hào)長乘法(兩個(gè)帶符號(hào)的 32 位整數(shù)相乘得到 64位的帶符號(hào)積)
SSAT 帶符號(hào)的飽和運(yùn)算
SBC 帶借位的減法
SUB 減法
SUBW 寬減法,可以減 12 位立即數(shù)
SXTB 字節(jié)帶符號(hào)擴(kuò)展到32位數(shù)
TEQ 測試是否相等(對兩個(gè)數(shù)執(zhí)行異或,更新標(biāo)志但不存儲(chǔ)結(jié)果)
TST 測試(對兩個(gè)數(shù)執(zhí)行按位與,更新Z 標(biāo)志但不存儲(chǔ)結(jié)果)
UBFX 無符號(hào)位段提取
UDIV 無符號(hào)除法
UMLAL 無符號(hào)長乘加(兩個(gè)無符號(hào)的 32 位整數(shù)相乘得到 64 位的無符號(hào)積,再把積加到另一個(gè)無符號(hào) 64位整數(shù)中)
UMULL 無符號(hào)長乘法(兩個(gè)無符號(hào)的 32 位整數(shù)相乘得到 64位的無符號(hào)積)
USAT 無符號(hào)飽和操作(但是源操作數(shù)是帶符號(hào)的——譯注)
UXTB 字節(jié)被無符號(hào)擴(kuò)展到32 位(高24位清0——譯注)
UXTH 半字被無符號(hào)擴(kuò)展到32 位(高16位清0——譯注)
32位存儲(chǔ)器數(shù)據(jù)傳送指令
名字 功能
LDR 加載字到寄存器
LDRB 加載字節(jié)到寄存器
LDRH 加載半字到寄存器
LDRSH 加載半字到寄存器,再帶符號(hào)擴(kuò)展到 32位
LDM 從一片連續(xù)的地址空間中加載多個(gè)字到若干寄存器
LDRD 從連續(xù)的地址空間加載雙字(64 位整數(shù))到2 個(gè)寄存器
STR 存儲(chǔ)寄存器中的字
STRB 存儲(chǔ)寄存器中的低字節(jié)
STRH 存儲(chǔ)寄存器中的低半字
STM 存儲(chǔ)若干寄存器中的字到一片連續(xù)的地址空間中
STRD 存儲(chǔ)2 個(gè)寄存器組成的雙字到連續(xù)的地址空間中
PUSH 把若干寄存器的值壓入堆棧中
POP 從堆棧中彈出若干的寄存器的值
32位轉(zhuǎn)移指令
名字 功能
B 無條件轉(zhuǎn)移
BL 轉(zhuǎn)移并連接(呼叫子程序)
TBB 以字節(jié)為單位的查表轉(zhuǎn)移。從一個(gè)字節(jié)數(shù)組中選一個(gè)8位前向跳轉(zhuǎn)地址并轉(zhuǎn)移
TBH 以半字為單位的查表轉(zhuǎn)移。從一個(gè)半字?jǐn)?shù)組中選一個(gè)16 位前向跳轉(zhuǎn)的地址并轉(zhuǎn)移
其它32位指令
LDREX 加載字到寄存器,并且在內(nèi)核中標(biāo)明一段地址進(jìn)入了互斥訪問狀態(tài)
LDREXH 加載半字到寄存器,并且在內(nèi)核中標(biāo)明一段地址進(jìn)入了互斥訪問狀態(tài)
LDREXB 加載字節(jié)到寄存器,并且在內(nèi)核中標(biāo)明一段地址進(jìn)入了互斥訪問狀態(tài)
STREX 檢查將要寫入的地址是否已進(jìn)入了互斥訪問狀態(tài),如果是則存儲(chǔ)寄存器的字
STREXH 檢查將要寫入的地址是否已進(jìn)入了互斥訪問狀態(tài),如果是則存儲(chǔ)寄存器的半字
STREXB 檢查將要寫入的地址是否已進(jìn)入了互斥訪問狀態(tài),如果是則存儲(chǔ)寄存器的字節(jié)
CLREX 在本地的處理上清除互斥訪問狀態(tài)的標(biāo)記(先前由 LDREX/LDREXH/LDREXB做的標(biāo)記)
MRS 加載特殊功能寄存器的值到通用寄存器
MSR 存儲(chǔ)通用寄存器的值到特殊功能寄存器
NOP 無操作
SEV 發(fā)送事件
WFE 休眠并且在發(fā)生事件時(shí)被喚醒
WFI 休眠并且在發(fā)生中斷時(shí)被喚醒
ISB 指令同步隔離(與流水線和 MPU等有關(guān)——譯注)
DSB 數(shù)據(jù)同步隔離(與流水線、MPU 和cache等有關(guān)——譯注)
DMB 數(shù)據(jù)存儲(chǔ)隔離(與流水線、MPU 和cache等有關(guān)——譯注)
總結(jié)
以上是生活随笔為你收集整理的ARMCM3汇编指令的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一文读懂除法溢出-使用汇编重定向0号中端
- 下一篇: 作者:桑基韬(1985-),男,博士,中