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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

ARM指令集介绍

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

ARM指令介紹

ARM 指令集是針對ARM體系架構設計的指令。在BootLoader引導的第一階段以及內核的第一階段都會有一個使用匯編語言編寫的文件,在不跑操作系統的裸板中也有一段用來初始化開發板環境的匯編代碼。所以無論是開發帶操作系統的板子,還是裸板開發,匯編語言都很有必要學習一番,最少要了解一些常用的匯編指令。要想設計出性能超強的系統,ARM的工作原理是必須掌握的。

ARM指令集可以分為以下六種

  • 跳轉指令
  • 數據處理指令
  • 程序狀態寄存器傳輸指令
  • Load/Store指令
  • 協處理器指令
  • 異常中斷指令

典型的arm指令語法是:< opcode > {< cond >} {s} < Rd >, < Rn >,< shifter_operand >

  • < opcode >:指令助記符,如ADD、SUB等指令。
  • {< cond >}:表示條件執行1
  • {S}:決定指令的操作是否影響CPSR的值。
  • < Rd >:目標寄存器。
  • < Rn >:表示包含第一個操作數的寄存器。
  • < shifter_operand >:表示第二個操作數。

ARM指令的尋址方式

ARM指令尋址指的是尋找操作數的地址。尋址方式可以分為:

  • 數據處理指令操作數的尋址方式。
  • Load/Store指令的尋址方式。

數據處理指令的操作數尋址

這些指令的操作數有3種格式:立即數2、寄存器方式(操作數即為寄存器的數值)、寄存器移位方式(操作數為寄存器中的值做相應的移位)。寄存器移位方式3中有:ASR(算術右移)、LSL(邏輯左移)、LSR(邏輯右移)、ROR(循環右移)、RRX(帶擴展的循環右移),移位的位數可以使用立即數也可以使用寄存器方式表示。 所以數據處理指令尋址方式有11種。

  • #< immediate >
  • < Rm >
  • < Rm >,LSL,#<shirt_imm>
  • < Rm >,LSL,#< Rs>
  • < Rm >,LSR,#< shirt_imm>
  • < Rm >,LSR,#< Rs>
  • < Rm >,ASR,#< shirt_imm>
  • < Rm >,ASR,#< Rs>
  • < Rm >,ROR,#< shirt_imm>
  • < Rm >,ROR,#< Rs>
  • < Rm >,RRX

load/store操作數尋址

字及無符號字節的load/store指令尋址

load/store指令的尋址方式由兩部分組成。一部分為一個基址寄存器,另一部分為一個地址偏移量。地址偏移量有3種格式:立即數、寄存器、寄存器移位。同樣尋址方式的地址計算方法有3種:普通的偏移量、事先更新方法、事后更新方法。

  • 普通的偏移量方法就是基址寄存器中的數值直接和偏移量做加減運算,表示為[ < Rn >,地址偏移量 ]。
  • 事先更新方法:先更新再使用,表示為[ < Rn >, 地址偏移量]!使用!表示事先更新方法。
  • 事后更新方法:使用基址寄存器中的值后再更新,表示為[ < Rn >], 地址偏移量,在[ ],后面跟地址偏移量表示事后更新。
    所以可以組合出9種尋址方式:
  • [ < Rn >,#+/-< offset_12>]
  • [ < Rn>,+/-< Rm>]
  • [< Rn>,+/-< Rm>,< shift>#< shift_imm>]
  • [ < Rn >,#+/-< offset_12>]!
  • [ < Rn>,+/-< Rm>]!
  • [< Rn>,+/-< Rm>,< shift>#< shift_imm>]!
  • [ < Rn >],#+/-< offset_12>
  • [ < Rn>],+/-< Rm>
  • [< Rn>],+/-< Rm>,< shift>#< shift_imm>
    事先更新法和事后更新法指的是操作過程中是先把基址寄存器中的值和偏移值處理后,再使用。還是使用基址寄存器中的值后在更新基址寄存器。類似于C語言中的++val和val++。

批量load/store尋址方式

在需要加載或者是存儲大量數據的時候,可以使用批量load/Store指令操作。一條批量指令可以實現在一組寄存器和一塊連續的內存單元之間傳輸數據。一次最多傳輸16個內存單元數據。指令中寄存器和內存單元的對應關系是,編號低的寄存器對應于內存中低地址單元。
格式為:LDM|STM{< cond >} < addressing_mode> < Rn >{!}, < registers >{^} < addressing_code>表示地址的變化方式,有以下四種:

  • IA(increment After):事后遞增方式。第一個寄存器對應的是內存單元為基址寄存器< Rn >所指的單元內存。隨后依次加4個字節
  • IB(Increment Before):事先遞增方式。第一個寄存器對應的是內存單元為基址寄存器< Rn > + 4所指的單元內存。隨后依次加4個字節
  • DA(Decrement After):事后遞減方式。第一個寄存器對應的是內存單元為基址寄存器< Rn >- 4*(寄存器總個數-1)所指的單元內存。隨后依次加4個字節
  • DB(Decrement Before):事先遞減方式。第一個寄存器對應的是內存單元為基址寄存器< Rn >-4*(寄存器總個數)所指的單元內存。隨后依次加4個字節

對于通常的數據傳輸來說,由于load指令和store指令可以采用相同的尋址方式。但是對于數據棧的操作,數據寫入內存和從內存讀出的順序不同,所以使用的尋址方式也不一樣。棧尋址方式有:FD、ED、FA、EA4

雜類load/store指令尋址方式

雜類指令包括操作數為半字、帶符號字節、雙字節的load/store指令。語法格式為:
LDR|STR{< cond >}H |SH|SB|D < Rd>,< addressing_mode>

  • H:半字訪問。
  • S:有符數據。
  • B:字節數據訪問。
  • W:雙字訪問。
    這個尋址方式只有6種:尋址方法有普通偏移量、事先更新方法、事后更新方法。偏移量的格式有:立即數、寄存器。所以組合6種尋址方式:
  • [< Rn >,#+/-< offset_8>]
  • [< Rn >,+/-< Rm >]
  • [< Rn >,#+/-< offset_8>]!
  • [< Rn >,+/-< Rm >]!
  • [< Rn >],#+/-< offset_8>
  • [< Rn >],+/-< Rm >

ARM指令集

跳轉指令

ARM中有兩種方式可以實現程序的跳轉:使用跳轉指令直接向PC中寫入目標地址值。兩種的區別是直接操作PC寄存器,可以實現在4GB的地址空間任意跳轉(長跳轉)。ARM的跳轉指令可以從當前指令向前或向后32MB的地址空間跳轉。指令有B、BL、BLX、BX L將PC的值保存到LR寄存器中,X帶狀態切換的跳轉(可以切換到thumb指令集,目標地址處的指令類型有目標地址的bit[0]決定)。

數據處理指令

數據處理指令可以分為3類:數據傳送指令、算術邏輯運算指令、比較指令。操作數的計算方法參考上述數據處理指令尋址方式部分。其中算術邏輯指令會將結果存入目標寄存器,同時更新CPSR中的調價標志位。而比較指令不保存運算結果,只更新CPSR中相應的條件標志位。

  • 數據傳輸指令有:MOV MVN
    MOV|MVN {< cond >} {s} < Rd >, < shifter-operand >
    MOV(MVN)指令是將< shifter_operand >表示的數據(的反碼)傳送到目標寄存器< Rd>中。
    note:MOVS PC,LR指令可以實現從某些異常中斷中返回。PC為目標寄存器并且S位被設置,指令執行時會將當前處理器模式對應的SPSR的值復制到CPSR中。

  • 比較指令有:CMP CMN TST TEQ
    < opcode > { < cond >} < Rn > ,< shifter_operand >
    CMP指令是將< Rn >中的數值-< shifet_operand >的值,根據操作結果更新CPSR中相應的條件標志位。
    CMN指令是將< Rn >中的數值+< shifet_operand >的值,根據操作結果更新CPSR中相應的條件標志位。
    TST指令是將< Rn >中的數值與< shifet_operand >的值做按位與操作,根據操作結果更新CPSR中相應的條件標志位。
    TEQ指令是將< Rn >中的數值與< shifet_operand >的值按位做異或操作,根據操作結果更新CPSR中相應的條件標志位。

  • 算術邏輯指令有ADD SUB RSB ADC SBC RSC AND BIC EOR ORR
    < opcode > {< cond >} {s} < Rd >, < Rn >, < shifter_operand >

ADD將操作數與寄存器< Rn >中的值相加,并把結果保存到目標寄存器。
ADC帶位加法指令,在ADD的基礎上再加上CPSR中的C條件標志位的值。
eg:64位操作數相加。R0和R1中放置一個64位的源操作數,R0中放置低33位,R2和R3中也是一個64位的源操作數,R2中存放低32位
ADDS R4,R0,R2
ADC R5 , R1,R3 ==>R5R4就是計算出來的結果
SUB、SUC減法指令和帶位減法指令。SUC在SUB的基礎上再減去CPSR中C條件標志位的反碼。這兩個指令聯合使用同樣也可以進行64位數的減法操作。
SUBS R4,R0,R2
SUC R5,R1,R3
RSB、RSC逆向減法指令以及帶位逆向減法指令。 < Rd> = < shifter_operand> - < Rn >

乘法指令:(這個使用的不多)

  • MUL:32位乘法指令。
  • MLA:32位帶加數的乘法指令。
  • SMULL:64位有符號數乘法指令。
  • SMLAL:64位帶加數的有符號數乘法指令。
  • UMULL:64位無符號數乘法指令。
  • UMLAL: 64位帶加數的無符號數乘法指令。

CLZ {< cond >} < Rd >, < Rm >。指令用于計算寄存器中操作數最高端0的個數。
ARM指令集中的除法運算是通過協處理器來實現的,所以沒有除法算術的指令。

AND、ORR、EOR、BIC分別是按位邏輯與、或、異或、清除操作。

程序狀態寄存器傳輸指令

ARM中有兩條指令用于在狀態寄存器和通用寄存器之間傳送數據。程序不能通過直接修改CPSR中的T控制位直接將程序狀態切換到thumb狀態,必須通過BX等指令完成程序狀態的切換。通常程序狀態寄存器修改是通過“讀->改->寫”的方式來實現的。

  • MSR 通用寄存器到狀態寄存器的傳送指令。即寫入。
  • MRS 狀態寄存器到通用寄存器的傳送指令。即讀取。

Load/Store指令

load指令用于從內存中讀取數據放入到寄存器中,store指令用于將寄存器中的數據保存到內存中。

對于大量搬移數據,ARM還提供了批量Load/Store內存訪問指令。批量load指令可以一次性從連續的內存單元中讀取數據,傳送到寄存器中。而批量store指令則是異性性將寄存器列表中的多個寄存器值寫入到內存中。

LDM|STM {< cond >} < addressing_mode > Rn{!} , < registers >{^}
命令中的**!**指令執行操作后會將操作數的內存地址寫入基址寄存器< Rn >中,即更新基地址。
^ 表示指令執行時將當前處理器模式下的SPSR值復制到CPSR中。寄存器中不包含PC時,作用指示指令中所用的寄存器為用戶模式下的寄存器。

在數據傳送指令中有一條比較特殊的指令。對于信號量的操作要求是一個原子操作(不能被中斷,即只有一條指令)。SWP指令完成讀取和修改寄存器的時,所以用于信號量的操作。
swp {< cond >} < Rd > ,< Rm >, [< Rn >] 執行的結果是把Rn的內容讀取到Rd中,同時將Rm寄存器的內容寫入到Rn中。

協處理器指令

ARM協處理器指令包括以下3類:

  • 用于ARM處理器初始化ARM協處理器的數據處理操作。CDP
  • 用于ARM處理器的寄存器和ARM協處理器的寄存器間的數據傳送操作。MCR、MRC
  • 用于在ARM協處理器的寄存器和內存單元之間傳送數據。LDC、STC

CDP協處理器操作指令。CDP指令讓ARM處理器能夠通知ARM協處理器執行特定的操作,該操作由協處理器完成。

LDC指令從連續的內存單元將數據讀取到協處理器的寄存器中。而STC指令將協處理器的寄存器中的數據寫入到一系列的內存單元中。
格式:
LDC { < cond >} {L} < coproc > , < CRd > ,< addressing_mode >
LDC2 { L } < coproc >, < CRd >, < addressing_mode >

STC {< cond >} {L} < coproc > , < CRd > ,< addressing_mode >
STC2 { L } < coproc >, < CRd >, < addressing_mode >

MCR指令將ARM處理器的寄存器中的數據傳送到協處理器的寄存器中,而MRC則是將協處理器寄存器中的數值傳送到ARM處理器的寄存器中。
MCR {< cond >} < coproc > ,< opcode_1>, < Rd >, < CRn > , < CRm > {,< opcode2 >}
MCR2 < coproc > ,< opcode_1>, < Rd >, < CRn > , < CRm > {,< opcode2 >}

MRC {< cond >} < coproc > ,< opcode_1>, < Rd >, < CRn > , < CRm > {,< opcode2 >}
MRC2 < coproc > ,< opcode_1>, < Rd >, < CRn > , < CRm > {,< opcode2 >}

< Rd >:為ARM寄存器,其值將被傳送到協助利器的寄存器中或者是從協助處理寄存器中讀取數值。
< CRn >:為協助處理器寄存器
< CRm >:為附加的目標寄存器或者源操作數寄存器。

異常中斷產生指令

在ARM概述中,咱們知道ARM有7種模式,可以分為用戶模式和特權模式。在特權模式中可以訪問系統的所有資源以及任意切換到別的模式。但是在用戶模式中,權限就沒有這么大,那么用戶模式下要訪問系統的資源怎么辦呢?ARM提供了異常中斷指令SWI,通過軟中斷實現在用戶模式中對操作系統中特權模式的程序的調用。
SWI {< cond >} < immed_24 > 操作系統通過24位的立即數來區分用戶程序請求的服務類型。


  • ARM中的指令執行條件碼如下:
    ??

  • 立即數是32bit,但是并不是所有的操作數都是立即數。立即數=8位數據>>偶數陪(最多是移位30位,有些地方說是32位,右移32位其實就是沒有移位),立即數的構成是使用移位最少的那個方式,所以數據寬度超多了8bit肯定就不是立即數了。在ARM指令集中立即數使用#標記。 ??

  • 算術右移是帶有符號位,即最高位的值保留;邏輯右移是用0填充左邊被移走的位;循環右移是用右邊移出的位填充左邊的位;帶拓展的循環右移是使用CPSR中的C位填充最高位。 ??

  • F(full)、E(empty):棧指針指向棧頂元素(最后一個入棧的數據)時稱為full棧,棧指針指向與棧頂元素相鄰的一個可用數據單元時稱為empty棧。D(descending):數據棧向內存地址減少的方向增長,A(ascending)數據棧向內存地址增加的方向增長。 ??

  • 總結

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

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