-
bl 指令 跳轉(zhuǎn)到標號出執(zhí)行
- b.le :判斷上面cmp的值是小于等于 執(zhí)行標號,否則直接往下走
- b.ge 大于等于 執(zhí)行地址 否則往下
- b.lt 判斷上面camp的值是 小于 執(zhí)行后面的地址中的方法 否則直接往下走
- b.gt 大于 執(zhí)行地址 否則往下
- b.eq 等于 執(zhí)行地址 否則往下
- B.HI 比較結(jié)果是無符號大于,執(zhí)行地址中的方法,否則不跳轉(zhuǎn)
- ret 返回
- mov x0,#0x10 x0 = 0x10
- str w10 ,[sp] 將w10寄存器的值存到 sp棧空間內(nèi)存
- stp x0,x1,[sp.#0x10] x0、x1 的值存入 sp + 0x10
- orr x0,wzr,#0x1 x0 = wzr | 0x1
- stur w10 ,[sp] 將w10寄存器的值存到 sp棧空間內(nèi)存
- ldr w10 ,[sp] w10 = sp棧內(nèi)存中的值
- ldp x0,x1,[sp] x0、x1 = sp棧內(nèi)存中的值
- adrp 通過基地址 + 偏移 獲得一個字符串(全局變量)
- 將1的值,左移12位 1 0000 0000 0000 == 0x1000
- 將PC寄存器的低12位清零
- 將1 和 2 的結(jié)果相加
adrp 是計算指定的數(shù)據(jù)地址 到當前PC值的相對偏移
由于得到的結(jié)果是低12bit為0
10 1024
12 == 4KB總結(jié)
adrp找到的是一個目標數(shù)據(jù)偏移的相對地址,他是一個不準確的地址,偏移的誤差有4KB
為什么偏移的誤差是4KB吶? 在地址總線上面,10條地址總線的尋址能力是1024,12條地址總線的能力是4*1024 4KB
- cmp:
ZF=1則AX=BX
ZF=0則AX!=BX
CF=1則AX<BX
CF=0則AX>=BX
CF=0并ZF=0則AX>BX
CF=1或ZF=1則AX<=BX
16位數(shù)據(jù)操作指令
名字 功能
ADC 帶進位加法(ADD with Carry)
ADD 加法
AND 按位與。這里的按位與和C的”&”功能相同
ASR 算術(shù)右移(Arithmetic Shift Right)
BIC 按位清零(把一個數(shù)跟另一個無符號數(shù)的反碼按位與)
CMN 負向比較(把一個數(shù)跟另一個數(shù)據(jù)的二進制補碼相比較)
CMP 比較(Compare,比較兩個數(shù)并且更新標志)
cmp(Compare)比較指令
CMP 把一個寄存器的內(nèi)容和另一個寄存器的內(nèi)容或立即數(shù)進行比較。但不存儲結(jié)果,只是正確的更改標志。
一般CMP做完判斷后會進行跳轉(zhuǎn),后面通常會跟上B指令!
CPY 把一個寄存器的值拷貝(COPY)到另一個寄存器中
EOR 近位異或
LSL 邏輯左移(Logic Shift Left)
LSR 邏輯右移(Logic Shift Right)
MOV 寄存器加載數(shù)據(jù),既能用于寄存器間的傳輸,也能用于加載立即數(shù)
MUL 乘法(Multiplication)
MVN 加載一個數(shù)的 NOT值(取到邏輯反的值)
NEG 取二進制補碼
ORR 按位或
ROR 循環(huán)右移
SBC 帶借位的減法
SUB 減法(Subtraction)
TST 測試(Test,執(zhí)行按位與操作,并且根據(jù)結(jié)果更新Z)
REV 在一個32位寄存器中反轉(zhuǎn)(Reverse)字節(jié)序
REVH 把一個32位寄存器分成兩個(Half)16位數(shù),在每個16位數(shù)中反轉(zhuǎn)字節(jié)序
REVSH 把一個32位寄存器的低16位半字進行字節(jié)反轉(zhuǎn),然后帶符號擴展到32位
SXTB 帶符號(Signed)擴展一個字節(jié)(Byte)到 32位
SXTH 帶符號(Signed)擴展一個半字(Half)到 32位
UXTB 無符號(Unsigned)擴展一個字節(jié)(Byte)到 32位
UXTH 無符號(Unsigned)擴展一個半字(Half)到 32位
16位轉(zhuǎn)移指令
名字 功能
B 無條件轉(zhuǎn)移(Branch)
B<cond> 有條件(Condition)轉(zhuǎn)移
BL 轉(zhuǎn)移并連接(Link)。用于呼叫一個子程序,返回地址被存儲在LR中
CBZ 比較(Compare),如果結(jié)果為零(Zero)就轉(zhuǎn)移(只能跳到后面的指令)
CBNZ 比較,如果結(jié)果非零(Non Zero)就轉(zhuǎn)移(只能跳到后面的指令)
IT If-Then
16位存儲器數(shù)據(jù)傳送指令
名字 功能
LDR 從存儲器中加載(Load)字到一個寄存器(Register)中
LDRH 從存儲器中加載半(Half)字到一個寄存器中
LDRB 從存儲器中加載字節(jié)(Byte)到一個寄存器中
LDRSH 從存儲器中加載半字,再經(jīng)過帶符號擴展后存儲一個寄存器中
LDRSB 從存儲器中加載字節(jié),再經(jīng)過帶符號擴展后存儲一個寄存器中
STR 把一個寄存器按字存儲(Store)到存儲器中
STRH 把一個寄存器存器的低半字存儲到存儲器中
STRB 把一個寄存器的低字節(jié)存儲到存儲器中
LDMIA 加載多個字,并且在加載后自增基址寄存器
STMIA 存儲多個字,并且在存儲后自增基址寄存器
PUSH 壓入多個寄存器到棧中
POP 從棧中彈出多個值到寄存器中
其它16位指令
名字 功能
SVC 系統(tǒng)服務調(diào)用(Service Call)
BKPT 斷點(Break Point)指令。如果調(diào)試被使能,則進入調(diào)試狀態(tài)(停機)。
NOP 無操作(No Operation)
CPSIE 使能 PRIMASK(CPSIE i)/FAULTMASK(CPSIE f)——清零相應的位
CPSID 除能 PRIMASK(CPSID i)/FAULTMASK(CPSID f)——置位相應的位
32位數(shù)據(jù)操作指令
名字 功能
ADC 帶進位加法
ADD 加法
ADDW 寬加法(可以加 12 位立即數(shù))
AND 按位與(原文是邏輯與,有誤——譯注)
ASR 算術(shù)右移
BIC 位清零(把一個數(shù)按位取反后,與另一個數(shù)邏輯與)
BFC 位段清零
BFI 位段插入
CMN 負向比較(把一個數(shù)和另一個數(shù)的二進制補碼比較,并更新標志位)
CMP 比較兩個數(shù)并更新標志位
CLZ 計算前導零的數(shù)目
EOR 按位異或
LSL 邏輯左移
LSR 邏輯右移
MLA 乘加
MLS 乘減
MOVW 把 16 位立即數(shù)放到寄存器的底16位,高16位清0
MOV 加載16位立即數(shù)到寄存器(其實匯編器會產(chǎn)生MOVW——譯注)
MOVT 把 16 位立即數(shù)放到寄存器的高16位,低 16位不影響
MVN 移動一個數(shù)的補碼
MUL 乘法
ORR 按位或(原文為邏輯或,有誤——譯注)
ORN 把源操作數(shù)按位取反后,再執(zhí)行按位或(原文為邏輯或,有誤——譯注)
RBIT 位反轉(zhuǎn)(把一個 32 位整數(shù)先用2 進制表達,再旋轉(zhuǎn)180度——譯注)
REV 對一個32 位整數(shù)做按字節(jié)反轉(zhuǎn)
REVH/REV16 對一個32 位整數(shù)的高低半字都執(zhí)行字節(jié)反轉(zhuǎn)
REVSH 對一個32 位整數(shù)的低半字執(zhí)行字節(jié)反轉(zhuǎn),再帶符號擴展成32位數(shù)
ROR 圓圈右移
RRX 帶進位的邏輯右移一格(最高位用C 填充,且不影響C的值——譯注)
SFBX 從一個32 位整數(shù)中提取任意的位段,并且?guī)Х枖U展成 32 位整數(shù)
SDIV 帶符號除法
SMLAL 帶符號長乘加(兩個帶符號的 32 位整數(shù)相乘得到 64 位的帶符號積,再把積加到另一個帶符號 64位整數(shù)中)
SMULL 帶符號長乘法(兩個帶符號的 32 位整數(shù)相乘得到 64位的帶符號積)
SSAT 帶符號的飽和運算
SBC 帶借位的減法
SUB 減法
SUBW 寬減法,可以減 12 位立即數(shù)
SXTB 字節(jié)帶符號擴展到32位數(shù)
TEQ 測試是否相等(對兩個數(shù)執(zhí)行異或,更新標志但不存儲結(jié)果)
TST 測試(對兩個數(shù)執(zhí)行按位與,更新Z 標志但不存儲結(jié)果)
UBFX 無符號位段提取
UDIV 無符號除法
UMLAL 無符號長乘加(兩個無符號的 32 位整數(shù)相乘得到 64 位的無符號積,再把積加到另一個無符號 64位整數(shù)中)
UMULL 無符號長乘法(兩個無符號的 32 位整數(shù)相乘得到 64位的無符號積)
USAT 無符號飽和操作(但是源操作數(shù)是帶符號的——譯注)
UXTB 字節(jié)被無符號擴展到32 位(高24位清0——譯注)
UXTH 半字被無符號擴展到32 位(高16位清0——譯注)
32位存儲器數(shù)據(jù)傳送指令
名字 功能
LDR 加載字到寄存器
LDRB 加載字節(jié)到寄存器
LDRH 加載半字到寄存器
LDRSH 加載半字到寄存器,再帶符號擴展到 32位
LDM 從一片連續(xù)的地址空間中加載多個字到若干寄存器
LDRD 從連續(xù)的地址空間加載雙字(64 位整數(shù))到2 個寄存器
STR 存儲寄存器中的字
STRB 存儲寄存器中的低字節(jié)
STRH 存儲寄存器中的低半字
STM 存儲若干寄存器中的字到一片連續(xù)的地址空間中
STRD 存儲2 個寄存器組成的雙字到連續(xù)的地址空間中
PUSH 把若干寄存器的值壓入堆棧中
POP 從堆棧中彈出若干的寄存器的值
32位轉(zhuǎn)移指令
名字 功能
B 無條件轉(zhuǎn)移
BL 轉(zhuǎn)移并連接(呼叫子程序)
TBB 以字節(jié)為單位的查表轉(zhuǎn)移。從一個字節(jié)數(shù)組中選一個8位前向跳轉(zhuǎn)地址并轉(zhuǎn)移
TBH 以半字為單位的查表轉(zhuǎn)移。從一個半字數(shù)組中選一個16 位前向跳轉(zhuǎn)的地址并轉(zhuǎn)移
其它32位指令
LDREX 加載字到寄存器,并且在內(nèi)核中標明一段地址進入了互斥訪問狀態(tài)
LDREXH 加載半字到寄存器,并且在內(nèi)核中標明一段地址進入了互斥訪問狀態(tài)
LDREXB 加載字節(jié)到寄存器,并且在內(nèi)核中標明一段地址進入了互斥訪問狀態(tài)
STREX 檢查將要寫入的地址是否已進入了互斥訪問狀態(tài),如果是則存儲寄存器的字
STREXH 檢查將要寫入的地址是否已進入了互斥訪問狀態(tài),如果是則存儲寄存器的半字
STREXB 檢查將要寫入的地址是否已進入了互斥訪問狀態(tài),如果是則存儲寄存器的字節(jié)
CLREX 在本地的處理上清除互斥訪問狀態(tài)的標記(先前由 LDREX/LDREXH/LDREXB做的標記)
MRS 加載特殊功能寄存器的值到通用寄存器
MSR 存儲通用寄存器的值到特殊功能寄存器
NOP 無操作
SEV 發(fā)送事件
WFE 休眠并且在發(fā)生事件時被喚醒
WFI 休眠并且在發(fā)生中斷時被喚醒
ISB 指令同步隔離(與流水線和 MPU等有關(guān)——譯注)
DSB 數(shù)據(jù)同步隔離(與流水線、MPU 和cache等有關(guān)——譯注)
DMB 數(shù)據(jù)存儲隔離(與流水線、MPU 和cache等有關(guān)——譯注)