匯編指令大全


以下都是作者在學習IMX6ULL開發板的時候用到的指令。

16位數據操作指令 
名字 功能
BIC  按位清零(把一個數跟另一個無符號數的反碼按位與)

CPS 直接修改CPSR寄存器的bit位。即在特權模式下(除了用戶模式,剩余的模式都是特權模式),可以通過CPS指令直接修改CPSR寄存器bit位,讓處理器進入不同的模式。
    例如:cps #0x13      就是把CPSR寄存器的bit4-0更改為0x13,讓處理器進入SVC模式。
       cps #0x12  就是把CPSR寄存器的bit4-0更改為0x12,讓處理器進入IRQ模式。

POP  從堆棧中彈出若干的寄存器的值,  出棧。舉個例子:

    如果我使用了pop ax指令后,返回到ax中的數據是5685H。
    這時在堆棧段里 5685 還存在嗎?堆棧里以前存放5685的地方還有數據嗎?有數據,數據還是5685嗎?

      答案是:5685被從棧中彈出,已不再棧中,原本存放5685的地方依然存在為5685,但他不再屬於棧,所以5685已不再棧中。

PUSH    進棧

SUB   減法(Subtraction)不帶借位的減法指令。——————
ADD  加法 

    add和sub指令同mov一樣,都有兩個操作對象,它們也可以有以下幾種形式:

      add 寄存器, 數據           add ax,9        把ax中的值加9放到ax中。
      add 寄存器, 寄存器         add ax,bx        類似
      add 寄存器,內存單元        add ax,[0]        類似
      add 內存單元,寄存器        add [0],ax        類似

      sub 寄存器, 數據          sub ax,9        把ax中的值減9放到ax中。
      sub 寄存器,寄存器
      sub 寄存器,內存單元
      sub 內存單元,寄存器

MUL  乘法(Multiplication)兩個數位數一樣,即都為8 | 16 | 32位。
  乘數和被乘數的大小必須保持一致,乘積的大小則是它們的一倍。這三種類型都可以使用寄存器和內存操作數,但不能使用立即數:由於目的操作數是被乘數和乘數大小的兩倍,因此不會發生溢岀。

DIV  除法
  


CMP  比較(Compare,比較兩個數並且更新標志) 
CPY  把一個寄存器的值拷貝(COPY)到另一個寄存器中 
EOR  近位異或 
LSL  邏輯左移(Logic Shift Left) 
LSR  邏輯右移(Logic Shift Right) 
MOV  寄存器加載數據,既能用於寄存器間的傳輸,也能用於加載立即數 
MVN  加載一個數的 NOT值(取到邏輯反的值)
NEG  取二進制補碼
ORR  按位或
ROR  循環右移
SBC  帶借位的減法
TST  測試(Test,執行按位與操作,並且根據結果更新Z)
REV  在一個32位寄存器中反轉(Reverse)字節序
REVH  把一個32位寄存器分成兩個(Half)16位數,在每個16位數中反轉字節序
REVSH  把一個32位寄存器的低16位半字進行字節反轉,然后帶符號擴展到32位
SXTB  帶符號(Signed)擴展一個字節(Byte)到 32位
SXTH  帶符號(Signed)擴展一個半字(Half)到 32位
UXTB  無符號(Unsigned)擴展一個字節(Byte)到 32位
UXTH  無符號(Unsigned)擴展一個半字(Half)到 32位

CMN  負向比較(把一個數跟另一個數據的二進制補碼相比較)

ADC  帶進位加法(ADD with Carry) 

AND  按位與。這里的按位與和C的”&”功能相同 
ASR  算術右移(Arithmetic Shift Right)

16位轉移指令 
名字 功能
B  無條件轉移(Branch)
B<cond>  有條件(Condition)轉移
BL  轉移並連接(Link)。用於呼叫一個子程序,返回地址被存儲在LR中
CBZ  比較(Compare),如果結果為零(Zero)就轉移(只能跳到后面的指令)
CBNZ  比較,如果結果非零(Non Zero)就轉移(只能跳到后面的指令)
IT  If-Then

16位存儲器數據傳送指令 
名字 功能
LDR  從存儲器中加載(Load)字到一個寄存器(Register)中————————————————————————/*已經了解*/
STR  存儲指令   把一個寄存器按字存儲(Store)到存儲器中    也就是把寄存器中的數據存儲到存儲器地址中去   格式:   str 源寄存器  <存儲器地址>

      str   r1,[r2]        ; 將r1中的值存到r2所指定的地址中

      str  r1,[r2,#4]   ;將r1中的值存到r2+4所指定的地址中

      str   r1,[r2],#4  ;將r1中的值存到r2所指定的地址中, 同時r2=r2+4

 

 

LDRH  從存儲器中加載半(Half)字到一個寄存器中
LDRB  從存儲器中加載字節(Byte)到一個寄存器中
LDRSH  從存儲器中加載半字,再經過帶符號擴展后存儲一個寄存器中
LDRSB  從存儲器中加載字節,再經過帶符號擴展后存儲一個寄存器中
STRH  把一個寄存器存器的低半字存儲到存儲器中
STRB  把一個寄存器的低字節存儲到存儲器中
LDMIA  加載多個字,並且在加載后自增基址寄存器
STMIA  存儲多個字,並且在存儲后自增基址寄存器
PUSH  壓入多個寄存器到棧中
POP  從棧中彈出多個值到寄存器中

其它16位指令 
名字 功能
SVC  系統服務調用(Service Call)
BKPT  斷點(Break Point)指令。如果調試被使能,則進入調試狀態(停機)。
NOP  無操作(No Operation)
CPSIE  使能 PRIMASK(CPSIE i)/FAULTMASK(CPSIE f)——清零相應的位
CPSID  除能 PRIMASK(CPSID i)/FAULTMASK(CPSID f)——置位相應的位

32位數據操作指令
名字 功能
ADC  帶進位加法
ADD  加法
ADDW  寬加法(可以加 12 位立即數)
AND  按位與(原文是邏輯與,有誤——譯注)
ASR  算術右移
BIC  位清零(把一個數按位取反后,與另一個數邏輯與)
BFC  位段清零
BFI  位段插入
CMN  負向比較(把一個數和另一個數的二進制補碼比較,並更新標志位)
CMP  比較兩個數並更新標志位
CLZ  計算前導零的數目
EOR  按位異或
LSL  邏輯左移
LSR  邏輯右移
MLA  乘加
MLS  乘減
MOVW  把 16 位立即數放到寄存器的底16位,高16位清0
MOV  加載16位立即數到寄存器(其實匯編器會產生MOVW——譯注)
MOVT  把 16 位立即數放到寄存器的高16位,低 16位不影響
MVN  移動一個數的補碼
MUL  乘法
ORR  按位或(原文為邏輯或,有誤——譯注)
ORN  把源操作數按位取反后,再執行按位或(原文為邏輯或,有誤——譯注)
RBIT  位反轉(把一個 32 位整數先用2 進制表達,再旋轉180度——譯注)
REV  對一個32 位整數做按字節反轉
REVH/REV16 對一個32 位整數的高低半字都執行字節反轉
REVSH  對一個32 位整數的低半字執行字節反轉,再帶符號擴展成32位數
ROR  圓圈右移
RRX  帶進位的邏輯右移一格(最高位用C 填充,且不影響C的值——譯注)
SFBX  從一個32 位整數中提取任意的位段,並且帶符號擴展成 32 位整數
SDIV  帶符號除法
SMLAL  帶符號長乘加(兩個帶符號的 32 位整數相乘得到 64 位的帶符號積,再把積加到另一個帶符號 64位整數中)
SMULL  帶符號長乘法(兩個帶符號的 32 位整數相乘得到 64位的帶符號積)
SSAT  帶符號的飽和運算
SBC  帶借位的減法
SUB  減法
SUBW  寬減法,可以減 12 位立即數
SXTB  字節帶符號擴展到32位數
TEQ  測試是否相等(對兩個數執行異或,更新標志但不存儲結果)
TST  測試(對兩個數執行按位與,更新Z 標志但不存儲結果)
UBFX  無符號位段提取
UDIV  無符號除法
UMLAL  無符號長乘加(兩個無符號的 32 位整數相乘得到 64 位的無符號積,再把積加到另一個無符號 64位整數中)
UMULL  無符號長乘法(兩個無符號的 32 位整數相乘得到 64位的無符號積)
USAT  無符號飽和操作(但是源操作數是帶符號的——譯注)
UXTB  字節被無符號擴展到32 位(高24位清0——譯注)
UXTH  半字被無符號擴展到32 位(高16位清0——譯注)

32位存儲器數據傳送指令 
名字 功能
LDR  加載字到寄存器
LDRB  加載字節到寄存器
LDRH  加載半字到寄存器
LDRSH  加載半字到寄存器,再帶符號擴展到 32位
LDM  從一片連續的地址空間中加載多個字到若干寄存器
LDRD  從連續的地址空間加載雙字(64 位整數)到2 個寄存器
STR  存儲寄存器中的字
STRB  存儲寄存器中的低字節
STRH  存儲寄存器中的低半字
STM  存儲若干寄存器中的字到一片連續的地址空間中
STRD  存儲2 個寄存器組成的雙字到連續的地址空間中
PUSH  把若干寄存器的值壓入堆棧中

32位轉移指令 
名字 功能
B  無條件轉移
BL  轉移並連接(呼叫子程序)
TBB  以字節為單位的查表轉移。從一個字節數組中選一個8位前向跳轉地址並轉移
TBH  以半字為單位的查表轉移。從一個半字數組中選一個16 位前向跳轉的地址並轉移

其它32位指令 
LDREX  加載字到寄存器,並且在內核中標明一段地址進入了互斥訪問狀態
LDREXH  加載半字到寄存器,並且在內核中標明一段地址進入了互斥訪問狀態
LDREXB  加載字節到寄存器,並且在內核中標明一段地址進入了互斥訪問狀態
STREX  檢查將要寫入的地址是否已進入了互斥訪問狀態,如果是則存儲寄存器的字
STREXH  檢查將要寫入的地址是否已進入了互斥訪問狀態,如果是則存儲寄存器的半字
STREXB  檢查將要寫入的地址是否已進入了互斥訪問狀態,如果是則存儲寄存器的字節
CLREX  在本地的處理上清除互斥訪問狀態的標記(先前由 LDREX/LDREXH/LDREXB做的標記)
MRS  加載特殊功能寄存器的值到通用寄存器
MSR  存儲通用寄存器的值到特殊功能寄存器
NOP  無操作
SEV  發送事件
WFE  休眠並且在發生事件時被喚醒
WFI  休眠並且在發生中斷時被喚醒
ISB  指令同步隔離(與流水線和 MPU等有關——它會清洗流水線,以保證所有它前面的指令都執行完畢之后,才執行它后面的指令
DSB  數據同步隔離(與流水線、MPU 和cache等有關———也就是 僅當所有在它前面的存儲器訪問操作都執行完畢后,才執行在它后面的指令(亦即任
何指令都要等待存儲器訪問操作。)
DMB  數據存儲隔離(與流水線、MPU 和cache等有關———DMB 指令保證僅當所有在它前面的存儲器訪問操作都執行完畢后,才提交(commit)在它后面的存儲
器訪問操作。)
/**********************************************************************************************************************************/
以上數據是在某位博客園網友的基礎上加上自己的一個理解之后對具體內容的修改,僅僅屬於自己的一個隨筆記錄,如有侵犯請聯系我刪除,無意侵犯。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM