ARM(CM3)的彙編指令

2021-06-18 07:42:11 字數 4599 閱讀 4250

16位資料操作指令

名字 功能

adc  帶進製加法(add with carry)

add  加法

and  按位與。這裡的按位與和c的」&」功能相同

asr  算術右移(arithmetic shift right)

bic  按位清零(把乙個數跟另乙個無符號數的反碼按位與)

cmn  負向比較(把乙個數跟另乙個資料的二進位制補碼相比較)

cmp  比較(compare,比較兩個數並且更新標誌)

cpy  把乙個暫存器的值拷貝(copy)到另乙個暫存器中

eor  近位異或

lsl  邏輯左移(logic shift left)

lsr  邏輯右移(logic shift right)

mov  暫存器載入資料,既能用於暫存器間的傳輸,也能用於載入立即數

mul  乘法(multiplication)

mvn  載入乙個數的 not值(取到邏輯反的值)

neg  取二進位制補碼

orr  按位或

ror  迴圈右移

sbc  帶借位的減法

sub  減法(subtraction)

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位

16位轉移指令

名字 功能

b  無條件轉移(branch)

b有條件(condition)轉移

bl  轉移並連線(link)。用於呼叫乙個子程式,返回位址被儲存在lr中

cbz  比較(compare),如果結果為零(zero)就轉移(只能跳到後面的指令)

cbnz  比較,如果結果非零(non zero)就轉移(只能跳到後面的指令)

it  if-then

16位儲存器資料傳送指令

名字 功能

ldr  從儲存器中載入(load)字到乙個暫存器(register)中

ldrh  從儲存器中載入半(half)字到乙個暫存器中

ldrb  從儲存器中載入位元組(byte)到乙個暫存器中

ldrsh  從儲存器中載入半字,再經過帶符號擴充套件後儲存乙個暫存器中

ldrsb  從儲存器中載入位元組,再經過帶符號擴充套件後儲存乙個暫存器中

str  把乙個暫存器按字儲存(store)到儲存器中

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  把若干暫存器的值壓入堆疊中

pop  從堆疊中彈出若干的暫存器的值

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等有關——譯註)

ARMCM3彙編指令

16位資料操作指令 名字 功能 adc 帶進製加法 add with carry add 加法 and 按位與。這裡的按位與和c的 功能相同 asr 算術右移 arithmetic shift right bic 按位清零 把乙個數跟另乙個無符號數的反碼按位與 cmn 負向比較 把乙個數跟另乙個資料...

彙編中的指令

跳轉指令用於實現程式流程的跳轉,在 arm 程式中有兩種方法可以實現程式流程的跳 1 使用專門的跳轉指令。2 直接向程式計數器 pc 寫入跳轉位址值。通過向程式計數器 pc 寫入跳轉位址值,可以實現在 4gb 的位址空間中的任意跳轉,在跳轉之前結合使用 mov lr pc 等類似指令,可以儲存下一條...

彙編的各種指令

不怎麼用就忘記了,以後每學到乙個新的指令就記錄下來 如何在64位win10系統搭載彙編環境 1 什麼是debug?debug是dos,windows都提供的實模式,程式的除錯工具,使用他,可以檢視cpu各種暫存器中的內容,記憶體中的情況和在機器碼級跟蹤程式的執行。2 我們用到的debug功能 r命令...