匯編基礎(chǔ) 匯編指令

  • bl 指令 跳轉(zhuǎn)到標(biāo)號(hào)出執(zhí)行
    • b.le :判斷上面cmp的值是小于等于 執(zhí)行標(biāo)號(hào),否則直接往下走
    • b.ge 大于等于 執(zhí)行地址 否則往下
    • b.lt 判斷上面camp的值是 小于 執(zhí)行后面的地址中的方法 否則直接往下走
    • b.gt 大于 執(zhí)行地址 否則往下
    • b.eq 等于 執(zhí)行地址 否則往下
    • B.HI 比較結(jié)果是無(wú)符號(hào)大于,執(zhí)行地址中的方法,否則不跳轉(zhuǎn)
  • ret 返回
  • mov x0,#0x10 x0 = 0x10
  • str w10 ,[sp] 將w10寄存器的值存到 sp??臻g內(nèi)存
  • stp x0,x1,[sp.#0x10] x0、x1 的值存入 sp + 0x10
  • orr x0,wzr,#0x1 x0 = wzr | 0x1
  • stur w10 ,[sp] 將w10寄存器的值存到 sp??臻g內(nèi)存
  • ldr w10 ,[sp] w10 = sp棧內(nèi)存中的值
  • ldp x0,x1,[sp] x0、x1 = sp棧內(nèi)存中的值
  • adrp 通過(guò)基地址 + 偏移 獲得一個(gè)字符串(全局變量)
  1. 將1的值,左移12位 1 0000 0000 0000 == 0x1000
  2. 將PC寄存器的低12位清零
  3. 將1 和 2 的結(jié)果相加
    adrp 是計(jì)算指定的數(shù)據(jù)地址 到當(dāng)前PC值的相對(duì)偏移
    由于得到的結(jié)果是低12bit為0
    10 1024
    12 == 4KB

總結(jié)
adrp找到的是一個(gè)目標(biāo)數(shù)據(jù)偏移的相對(duì)地址,他是一個(gè)不準(zhǔn)確的地址,偏移的誤差有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 帶進(jìn)位加法(ADD with Carry)
ADD 加法
AND 按位與。這里的按位與和C的”&”功能相同
ASR 算術(shù)右移(Arithmetic Shift Right)
BIC 按位清零(把一個(gè)數(shù)跟另一個(gè)無(wú)符號(hào)數(shù)的反碼按位與)
CMN 負(fù)向比較(把一個(gè)數(shù)跟另一個(gè)數(shù)據(jù)的二進(jìn)制補(bǔ)碼相比較)
CMP 比較(Compare,比較兩個(gè)數(shù)并且更新標(biāo)志)

cmp(Compare)比較指令

CMP 把一個(gè)寄存器的內(nèi)容和另一個(gè)寄存器的內(nèi)容或立即數(shù)進(jìn)行比較。但不存儲(chǔ)結(jié)果,只是正確的更改標(biāo)志。
一般CMP做完判斷后會(huì)進(jìn)行跳轉(zhuǎn),后面通常會(huì)跟上B指令!
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 測(cè)試(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 無(wú)符號(hào)(Unsigned)擴(kuò)展一個(gè)字節(jié)(Byte)到 32位
UXTH 無(wú)符號(hào)(Unsigned)擴(kuò)展一個(gè)半字(Half)到 32位

16位轉(zhuǎn)移指令
名字 功能
B 無(wú)條件轉(zhuǎn)移(Branch)
B<cond> 有條件(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)過(guò)帶符號(hào)擴(kuò)展后存儲(chǔ)一個(gè)寄存器中
LDRSB 從存儲(chǔ)器中加載字節(jié),再經(jīng)過(guò)帶符號(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 無(wú)操作(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 對(duì)一個(gè)32 位整數(shù)做按字節(jié)反轉(zhuǎn)
REVH/REV16 對(duì)一個(gè)32 位整數(shù)的高低半字都執(zhí)行字節(jié)反轉(zhuǎn)
REVSH 對(duì)一個(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)長(zhǎng)乘加(兩個(gè)帶符號(hào)的 32 位整數(shù)相乘得到 64 位的帶符號(hào)積,再把積加到另一個(gè)帶符號(hào) 64位整數(shù)中)
SMULL 帶符號(hào)長(zhǎng)乘法(兩個(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 測(cè)試是否相等(對(duì)兩個(gè)數(shù)執(zhí)行異或,更新標(biāo)志但不存儲(chǔ)結(jié)果)
TST 測(cè)試(對(duì)兩個(gè)數(shù)執(zhí)行按位與,更新Z 標(biāo)志但不存儲(chǔ)結(jié)果)
UBFX 無(wú)符號(hào)位段提取
UDIV 無(wú)符號(hào)除法
UMLAL 無(wú)符號(hào)長(zhǎng)乘加(兩個(gè)無(wú)符號(hào)的 32 位整數(shù)相乘得到 64 位的無(wú)符號(hào)積,再把積加到另一個(gè)無(wú)符號(hào) 64位整數(shù)中)
UMULL 無(wú)符號(hào)長(zhǎng)乘法(兩個(gè)無(wú)符號(hào)的 32 位整數(shù)相乘得到 64位的無(wú)符號(hào)積)
USAT 無(wú)符號(hào)飽和操作(但是源操作數(shù)是帶符號(hào)的——譯注)
UXTB 字節(jié)被無(wú)符號(hào)擴(kuò)展到32 位(高24位清0——譯注)
UXTH 半字被無(wú)符號(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 無(wú)條件轉(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)入了互斥訪問(wèn)狀態(tài)
LDREXH 加載半字到寄存器,并且在內(nèi)核中標(biāo)明一段地址進(jìn)入了互斥訪問(wèn)狀態(tài)
LDREXB 加載字節(jié)到寄存器,并且在內(nèi)核中標(biāo)明一段地址進(jìn)入了互斥訪問(wèn)狀態(tài)
STREX 檢查將要寫(xiě)入的地址是否已進(jìn)入了互斥訪問(wèn)狀態(tài),如果是則存儲(chǔ)寄存器的字
STREXH 檢查將要寫(xiě)入的地址是否已進(jìn)入了互斥訪問(wèn)狀態(tài),如果是則存儲(chǔ)寄存器的半字
STREXB 檢查將要寫(xiě)入的地址是否已進(jìn)入了互斥訪問(wèn)狀態(tài),如果是則存儲(chǔ)寄存器的字節(jié)
CLREX 在本地的處理上清除互斥訪問(wèn)狀態(tài)的標(biāo)記(先前由 LDREX/LDREXH/LDREXB做的標(biāo)記)
MRS 加載特殊功能寄存器的值到通用寄存器
MSR 存儲(chǔ)通用寄存器的值到特殊功能寄存器
NOP 無(wú)操作
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)——譯注)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 計(jì)算機(jī)通過(guò)執(zhí)行指令序列來(lái)使機(jī)器得以工作,所以對(duì)于每一系列的計(jì)算機(jī)都有指定的一組指令集供計(jì)算機(jī)使用,這組指令...
    未來(lái)科技工作室閱讀 8,336評(píng)論 1 10
  • 5-Level Paging and 5-Level EPT white paper原文 修訂版本1.1 2017...
    公子小水閱讀 4,266評(píng)論 0 3
  • 王爽匯編全書(shū)知識(shí)點(diǎn)大綱 第一章 基礎(chǔ)知識(shí) 機(jī)器語(yǔ)言 匯編語(yǔ)言的產(chǎn)生 匯編語(yǔ)言的組成 存儲(chǔ)器 cpu對(duì)存儲(chǔ)器的讀寫(xiě) ...
    2c3ba901516f閱讀 2,667評(píng)論 0 1
  • 匯編語(yǔ)言的一些注意點(diǎn) 匯編語(yǔ)言是直接在硬件之上工作的編程語(yǔ)言。 CPU(Central Processing Un...
    BackSpace8閱讀 1,849評(píng)論 0 1
  • 一.認(rèn)識(shí)匯編語(yǔ)言 要認(rèn)識(shí)匯編語(yǔ)言,還得從編程語(yǔ)言的發(fā)展說(shuō)起,語(yǔ)言有以下幾種分類,其發(fā)展都是為了讓我們更容易去操縱計(jì)...
    WellsCai閱讀 1,200評(píng)論 0 1

友情鏈接更多精彩內(nèi)容