日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ARM-汇编指令集

發布時間:2023/12/20 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ARM-汇编指令集 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

ARM 指令集

ARM 指令集分為 6 類:

  • 跳轉指令
  • 數據處理指令
  • 程序狀態寄存器(PSR)轉移指令
  • Load/Store 指令
  • 協處理器指令
  • 異常中斷產生指令

指令的一般格式

ARM 指令的一般編碼格式

<opcode> {<cond>}{S} <Rd>,<Rn>,<shifter_operand>

opcode:是指令助記符,如 ADD 表示算數加法操作指令

cond:表示指令執行的條件

S:決定指令的操作是否影響 CPSR 的值

Rd:表示目標寄存器

Rn:表示包含第 1 個操作數的寄存器

shifter_operand:表示第 2 個操作數

跳轉指令

  • B 跳轉指令
    • 僅僅執行跳轉操作
  • BL 帶返回的跳轉指令
    • 執行跳轉操作的同時還將 PC 寄存器的值保存在 LR 寄存器中,BL 指令用于實現子程序調用,子程序的返回可以通過將 LR 寄存器的值復制到 PC 寄存器中來實現
  • BX 帶狀態切換的跳轉指令
    • BX 指令跳轉到指令中指定的目標地址,目標地址處的指令可以是 ARM 指令,也可以是 Thumb 指令
  • BLX 帶返回和狀態切換的跳轉指令
    • 從 ARM 指令跳轉到指令中指定的目標地址,目標地址可以是 ARM 指令,也可以是 Thumb 指令

數據處理指令

數據處理指令又分為三類

數據傳送指令:如 MOV

算數邏輯運算指令:如 ADD

比較指令:如 TST

  • MOV:數據傳送指令
  • MVN:數據求反傳送指令
  • CMP:比較指令
  • CMN:基于相反數的比較指令
  • TST:位測試指令
  • TEQ:相等測試指令
  • ADD:加法指令
  • SUB:減法指令
  • RSB:逆向加法指令
  • ADC:帶位加法指令
  • SBC:帶位減法指令
  • RSC:帶位逆向減法指令
  • AND:邏輯與操作指令
  • BIC:位清除指令
  • EOR:邏輯異或操作指令
  • ORR:邏輯或操作指令

MOV 傳送指令

MOV 指令將 <shifter_operand> 表示的數據傳送到目標寄存器 中,并根據操作的結果更新 CPSR 相應的條件標志位

指令的語法格式:

MOV {<cond>}{S} <Rd>,<shifter_operand>

cond:為指令執行的條件碼

S:決定指令的操作是否影響 CPSR 中條件標志位的值

Rd:寄存器為目標寄存器

shifter_operand:為向目標寄存器傳送的數據

MOV 指令完成的功能:

  • 將數據從一個寄存器傳送到另一個寄存器
  • 將一個常數傳送到一個寄存器中
  • 實現單純的移位操作。左移操作可以實現將操作數乘以 2 n 次方
  • 當 PC 寄存器作為目標寄存器是可以程序跳轉。這種跳轉可以實現子程序調用以及從子程序中返回
  • 當 PC 寄存器作為目標寄存器且指令中 S 位被設置時,指令在執行跳轉操作的同時,將當前處理器模式的 SPSR 寄存器內容復制到 CPSR 中。這樣 MOVS PC,LR 可以實現從某些異常中斷中返回。

MVN 傳送指令

MVN 指令將 <shifter_operand> 表示的數據的反碼傳送到目標寄存器 中,并根據操作的結果更新 CPSR 相應的條件標志位

指令的語法格式:

MVN {<cond>}{S} <Rd>,<shifter_operand>

其中各參數的用法與 MOV 傳送指令相同

MVN 指令有以下用途

  • 向寄存器中傳送一個負數
  • 生成位掩碼
  • 求一個數的反碼

ADD 加法指令

ADD 指令將 <shifter_operand> 表示的數據與寄存器 中的值相加,并把結果保存在目標寄存器 中,同時根據操作的結果更新 CPSR 中相應的標志位

ADD 指令實現兩個操作數相加

指令的語法格式

ADD {<cond>}{S} <Rd>,<Rn>,<shifter_operand>

cond:為指令執行的條件碼

S:決定指令的操作是否影響 CPSR 中條件標志位的值

Rd:寄存器為目標寄存器

Rn:寄存器為第 1 個源操作數所在的寄存器

shifter_operand:為向目標寄存器傳送的數據

示例:

ADD Rx, Rx,#1 ;Rx=Rx+1 ADD Rd, Rx, Rx, LSL, #n ;Rd=Rx+Rx*(2*n) ADD Rs, PC, #offset ;生成基于 PC 的跳轉指針

ADC 帶位加法指令

ADC 指令將 <shifter_operand> 表示的數據與寄存器 中的值相加,再加上 CPSR 中 C 條件標志位的值,并把結果保存在目標寄存器 中,同時根據操作的結果更新 CPSR 中相應的標志位

指令的語法格式

ADC {<cond>}{S} <Rd>,<Rn>,<shifter_operand>

cond:為指令執行的條件碼

S:決定指令的操作是否影響 CPSR 中條件標志位的值

Rd:寄存器為目標寄存器

Rn:寄存器為第 1 個源操作數所在的寄存器

shifter_operand:為向目標寄存器傳送的數據

ADC 指令和 ADD 指令聯合使用可以實現兩個 64 位的操作數相加。

如果寄存器 R0 和 R1 中放置一個 64 位的源操作數,其中 R0 中放置低 32 位數值,R1 中放置高 32 位數據,

如果寄存器 R2 和 R3 中放置另一個 64 位的源操作數,其中 R2 中放置低 32 位數值,R3 中放置高 32 位數據,

下面的指令序列實現了兩個 64 位操作數的加法操作

ADDS R4,R0,R2 ADC R5,R1,R3

若將 ADC R5,R1,R3 指令改為 ADCS R5,R1,R3,操作結果將影響到 CPSR 寄存器中相應的條件標志位的值

SUB 減法指令

SUB 指令從寄存器 中減去 <shifter_operand> 表示的數值,并把結果保存到目標寄存器 中,同時根據操作的結果更新 CPSR 中相應的條件標志位。

指令的語法格式

SUB {<cond>}{S} <Rd>,<Rn>,<shifter_operand>

cond:為指令執行的條件碼

S:決定指令的操作是否影響 CPSR 中條件標志位的值

Rd:寄存器為目標寄存器

Rn:寄存器為第 1 個源操作數所在的寄存器

shifter_operand:為向目標寄存器傳送的數據

SUB 指令實現兩個操作數相減

示例:

SUB Rx,RX,#1 ;Rx=Rx-1

SBC 帶位減法指令

SBC 指令從寄存器 中減去 <shifter_operand> 表示的數值,再減去 CPSR 中 C 條件標志位的反碼,并把結果保存到目標寄存器 中,同時根據操作的結果更新 CPSR 中相應的條件標志位。

指令的語法格式

SBC {<cond>}{S} <Rd>,<Rn>,<shifter_operand>

cond:為指令執行的條件碼

S:決定指令的操作是否影響 CPSR 中條件標志位的值

Rd:寄存器為目標寄存器

Rn:寄存器為第 1 個源操作數所在的寄存器

shifter_operand:為向目標寄存器傳送的數據

RSB 逆向減法指令

RSB 指令從 <shifter_operand> 表示的數值中減去寄存器 值,并把結果保存到目標寄存器 中,同時根據操作的結果更新 CPSR 中相應的條件標志位。

指令的語法格式

RSB {<cond>}{S} <Rd>,<Rn>,<shifter_operand>

cond:為指令執行的條件碼

S:決定指令的操作是否影響 CPSR 中條件標志位的值

Rd:寄存器為目標寄存器

Rn:寄存器為第 1 個源操作數所在的寄存器

shifter_operand:為向目標寄存器傳送的數據

示例:

RSB Rd, Rx, #0; Rd=-Rx

RSC 帶位逆向減法指令

RSC 指令從 <shifter_operand> 表示的數值中減去寄存器 值,再減去寄存器 CPSR 中 C 條件標志位的反碼,并把結果保存到目標寄存器 中,同時根據操作的結果更新 CPSR 中相應的條件標志位。

指令的語法格式

RSC {<cond>}{S} <Rd>,<Rn>,<shifter_operand>

cond:為指令執行的條件碼

S:決定指令的操作是否影響 CPSR 中條件標志位的值

Rd:寄存器為目標寄存器

Rn:寄存器為第 1 個源操作數所在的寄存器

shifter_operand:為向目標寄存器傳送的數據

AND 邏輯與操作指令

AND 指令將 <shifter_operand> 表示的數值中與寄存器 的值按位做邏輯與操作,,并把結果保存到目標寄存器 中,同時根據操作的結果更新 CPSR 中相應的條件標志位。

指令的語法格式

AND {<cond>}{S} <Rd>,<Rn>,<shifter_operand>

cond:為指令執行的條件碼

S:決定指令的操作是否影響 CPSR 中條件標志位的值

Rd:寄存器為目標寄存器

Rn:寄存器為第 1 個源操作數所在的寄存器

shifter_operand:為向目標寄存器傳送的數據

ORR 邏輯或操作指令

ORR 指令將 <shifter_operand> 表示的數值中與寄存器 的值按位做邏輯或操作,,并把結果保存到目標寄存器 中,同時根據操作的結果更新 CPSR 中相應的條件標志位。

指令的語法格式

ORR {<cond>}{S} <Rd>,<Rn>,<shifter_operand>

cond:為指令執行的條件碼

S:決定指令的操作是否影響 CPSR 中條件標志位的值

Rd:寄存器為目標寄存器

Rn:寄存器為第 1 個源操作數所在的寄存器

shifter_operand:為向目標寄存器傳送的數據

EOR 邏輯或操作指令

EOR 指令將 <shifter_operand> 表示的數值中與寄存器 的值按位做邏輯異或操作,,并把結果保存到目標寄存器 中,同時根據操作的結果更新 CPSR 中相應的條件標志位。

指令的語法格式

EOR {<cond>}{S} <Rd>,<Rn>,<shifter_operand>

cond:為指令執行的條件碼

S:決定指令的操作是否影響 CPSR 中條件標志位的值

Rd:寄存器為目標寄存器

Rn:寄存器為第 1 個源操作數所在的寄存器

shifter_operand:為向目標寄存器傳送的數據

BIC 位清除指令

BIC 指令將 <shifter_operand> 表示的數值中與寄存器 的值的反碼按位做邏輯與操作,,并把結果保存到目標寄存器 中,同時根據操作的結果更新 CPSR 中相應的條件標志位。

指令的語法格式

BIC {<cond>}{S} <Rd>,<Rn>,<shifter_operand>

cond:為指令執行的條件碼

S:決定指令的操作是否影響 CPSR 中條件標志位的值

Rd:寄存器為目標寄存器

Rn:寄存器為第 1 個源操作數所在的寄存器

shifter_operand:為向目標寄存器傳送的數據

CMP 比較指令

CMP 指令從寄存器 中減去 <shifter_operand> 表示的數值,根據操作的結果更新 CPSR 中相應的條件標志位,后面的指令就可以根據 CPSR 中相應的條件標志位來判斷是否執行。

指令的語法格式

CMP {<cond>}<Rn>,<shifter_operand>

cond:為指令執行的條件碼

Rn:寄存器為第 1 個源操作數所在的寄存器

shifter_operand:為向目標寄存器傳送的數據

CMN 基于相反數的比較指令

CMN 指令從寄存器 中加上 <shifter_operand> 表示的數值,根據操作的結果更新 CPSR 中相應的條件標志位,后面的指令就可以根據 CPSR 中相應的條件標志位來判斷是否執行。

指令的語法格式

CMN {<cond>}<Rn>,<shifter_operand>

cond:為指令執行的條件碼

Rn:寄存器為第 1 個源操作數所在的寄存器

shifter_operand:為向目標寄存器傳送的數據

TST 位測試指令

TST 指令將 <shifter_operand> 表示的數值中與寄存器 的值按位做邏輯與操作,根據操作的結果更新 CPSR 中相應的條件標志位

指令的語法格式

TST {<cond>}<Rn>,<shifter_operand>

cond:為指令執行的條件碼

Rn:寄存器為第 1 個源操作數所在的寄存器

shifter_operand:為向目標寄存器傳送的數據

TEQ 相等測試指令

TEQ 指令將 <shifter_operand> 表示的數值中與寄存器 的值按位做邏輯異或操作,根據操作的結果更新 CPSR 中相應的條件標志位

指令的語法格式

TST {<cond>}<Rn>,<shifter_operand>

cond:為指令執行的條件碼

Rn:寄存器為第 1 個源操作數所在的寄存器

shifter_operand:為向目標寄存器傳送的數據

總結

以上是生活随笔為你收集整理的ARM-汇编指令集的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。