溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

ARM體系結構與常用匯編指令是什么

發布時間:2021-11-20 17:14:03 來源:億速云 閱讀:126 作者:小新 欄目:系統運維

這篇文章給大家分享的是有關ARM體系結構與常用匯編指令是什么的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

一、ARM體系結構

?ARM(Advanced RISC Machines) ,既可以認為是一個公司的名字,也可以認為是對一類微處理器的通稱,還可以認為是一種技術的名字。ARM 處理器是一種低功耗高性能的 32 位RISC 處理器,基于 ARM 的處理器以其高速度、低功耗等諸多優異的性能而得到非常廣泛的應用。
?ARM公司在經典處理器ARM11以后的產品改用Cortex命名,并分成A、R和M三類,其分別應用于不同的領域。Cortex系列屬于ARMv7架構,其中“A”系列面向尖端的基于虛擬內存的操作系統和用戶應用;“R”系列針對實時系統;“M”系列對微控制器。在ARM11推出前,其處理器比較:


ARM7ARM9ARM10ARM11
流水線3級5級6級8級
典型頻率MHz80150260335
功耗mW/MHz0.060.19(+cache)0.5 (+cache)0.4  (+cache)
性能MIPS/MHz0.971.11.31.2
架構馮*諾伊曼哈佛哈佛哈佛

?馮諾伊曼結構與哈佛結構的區別:
ARM體系結構與常用匯編指令是什么

?在TQ2440開發板上使用的是S3C2440芯片。這是一款基于ARM920T核心的微處理器芯片,采用哈佛結構使用5級指令流水線包括:取指、譯碼、執行、存儲及寫入。各步驟作用分別為:
(1)取指令(fetch):從存儲器中取出指令,并將其放入指令流水線。
(2)譯碼(decode):指令被譯碼,從寄存器堆中讀取寄存器操作數。在寄存器堆中有3個操作數讀端口,因此,大多數ARM指令能在1個周期內讀取其操作數。
(3)執行(execute):將其中1個操作數移位,并在ALU中產生結果。如果指令是Load或Store指令,則在ALU中計算存儲器的地址。
(4)緩沖/數據(buffer/data):如果需要則訪問數據存儲器,否則ALU只是簡單地緩沖1個時鐘周期。
(5)回寫(write-back):將指令的結果回寫到寄存器堆,包括任何從寄存器讀出的數據。
1.1ARM基本數據類型
?ARM采用的是32位架構,基本數據類型有3種:Byte(字節), 8bit;Halfword(半字),16bit(半字必須2字節邊界對齊);Word(字), 32bit(字必須于4字節邊界對齊)。
?長度為1個字的數據項占用一組4字節的位置,該位置開始于4的倍數的地址(地址最末兩位為00)半字占有兩個字節的位置,該位置開始于偶數字節地址(地址最末一位為0)。
ARM體系結構與常用匯編指令是什么
1.2存儲器大/小端
?大端模式,是指數據的高字節保存在內存的低地址中,而數據的低字節保存在內存的高地址中。小端模式,是指數據的高字節保存在內存的高地址中,而數據的低字節保存在內存的低地址中。例如變量word a=0xf6734bcd,使用大/小端存儲格式完全不一樣。
ARM體系結構與常用匯編指令是什么??ARM體系結構與常用匯編指令是什么
1.3ARM編程模型
?要想了解ARM920T為內核芯片的主要可以從幾個方面入手:工作模式、ARM異常種類、寄存器組織、運行狀態。
?ARM920T是基于ARM V4T 架構,共有7種工作模式:

處理器描述
用戶模式(usr)ARM 處理器正常的程序執行狀態。
快速中斷模式(fiq)用于高速數據傳輸或通道處理。
外部中斷模式(irq)用于通常的中斷處理。
管理模式(svc)操作系統使用的保護模式。
數據訪問終止模式(abt)當數據或指令預取終止時進入該模式,可用于虛擬存儲及存儲保護。
系統模式(sys)運行具有特權的操作系統任務。
未定義指令中止模式(und)當未定義的指令執行時進入該模式,可用于支持硬件協處理器的軟件仿真。

?七種工作模式又可以從兩個方面劃分:特權模式與非特權模式;異常模式與非異常模式。

劃分方式說明
特權模式與非特權模式用戶模式外的其他6種處理器模式稱為特權模式(Privileged Modes)。在特權模式下,程序可以訪問所有的系統資源,也可以任意地進行處理器模式切換,而用戶模式不能直接切換到別的模式。
異常模式與非異常模式除去用戶模式和系統模式以外的 5 種又稱為異常模式(ExceptionModes),常用于處理中斷或異常,以及需要訪問受保護的系統資源等情況。

?在異常模式下,有著不同的異常,其對應關系為:

異常向量表模式
復位(Reset)0x00管理模式
未定義指令(Undefined Instruction)0x04未定義指令中止模式
軟中斷(Software Interrupt)0x08管理模式
指令預取異常(Prefetch Abrot)0x0C數據訪問終止模式
數據異常(Data Abort)0x10數據訪問終止模式
保留(Reserved)0x14/
中斷(IRQ)0x18數據訪問終止模式
快速中斷(FIQ)0x1C快速中斷模式

?ARM 處理器共有 37 個寄存器,被分為若干個組(BANK)。31 個通用寄存器,包括程序計數器(PC 指針),均為 32 位的寄存器;6 個狀態寄存器,1個CPSR(Current Program Status Register,當前程序狀態寄存器),5個SPSR(Saved Program Status Register,備份程序狀態寄存器),用以標識 CPU 的工作狀態及程序的運行狀態,均為 32 位。ARM有7種不同的處理器模式,在每一種處理器模式中有一組相應的寄存器組。
ARM體系結構與常用匯編指令是什么
? 在匯編語言中寄存器R0~R13為保存數據或地址值的通用寄存器。它們是完全通用的寄存器,不會被體系結構作為特殊用途,并且可用于任何使用通用寄存器的指令。這些通用寄存器根據其分組與否可分為以下2類。未分組寄存器(the Unbanked Register),包括R0~R7;分組寄存器(the Banked Register),包括R8~R14。
? 未分組寄存器沒有被系統用于特殊的用途,任何可采用通用寄存器的應用場合都可以使用未分組寄存器。但由于其通用性,在異常中斷所引起的處理器模式切換時,其使用的是相同的物理寄存器,所以也就很容易使寄存器中的數據被破壞。
? 分組寄存器根據處理器模式使用方法有所不同:

分組寄存器說明
R8~R12每個寄存器對應兩個不同的物理寄存器。一組用于除FIQ模式外的所有處理器模式,而另一組則專門用于FIQ模式。
R13和R14每個寄存器對應6個不同的物理寄存器。其中的一個是用戶模式和系統模式公用的,而另外5個分別用于5種異常模式。訪問時需要指定它們的模式。名字形式:R13<mode>、R14<mode>。<mode>可以是以下幾種模式之一:usr、svc、abt、und、irp及fiq。R13寄存器在ARM處理器中常用作堆棧指針,稱為SP ;寄存器R14又被稱為連接寄存器(Link Register,LR)。

? 程序計數器R15( PC),它指向正在取指的地址,在異常模式中,另外一個寄存器“ 程序狀態備份寄存器( SPSR) ” 可以被訪問。每種異常都有自己的SPSR,在進入異常時它保存CPSR的當前值,異常退出時可通過它恢復CPSR。該寄存器的位分配圖為:
ARM體系結構與常用匯編指令是什么

寄存器位作用
N位符號位。如果結果為負數,則N = 1;如果結果為正數或0,則 N = 0
Z位如果指令的結果為0,則置1(通常用來表示比較的結果為“相等”);否則置0
C位表示運算的進位、借位等
V位益出標志位
Q標志位在帶DSP指令擴展的ARM v5及更高版本中,bit[27]被指定用于指示增強的DAP指令是否發生了溢出,因此也就被稱為Q標志位。同樣,在SPSR中bit[27]也被稱為Q標志位,用于在異常中斷發生時保存和恢復CPSR中的Q標志位。在ARM v5以前的版本及ARM v5的非E系列處理器中,Q標志位沒有被定義,屬于待擴展的位。
I = 1IRQ被禁止
F = 1FIQ被禁止
T位處理器的狀態控制位。T = 0,處理器處于ARM狀態(即正在執行32位的ARM指令)。T = 1,處理器處于Thumb狀態(即正在執行16位的Thumb指令)。T位只有在T系列的ARM處理器上才有效,在非T系列的ARM版本中,T位將始終為0。
M[4∶0]作為位模式控制位,其具體控制模式可見下表。

ARM體系結構與常用匯編指令是什么
? ARM處理器的運行狀態可以分為ARM與Thumb兩種狀態。其中ARM狀態下PC值為字對齊(4字節),Thumb狀態下PC值為半字對齊(2字節)。

二、ARM的指令系統

? 在嵌入式開發中,匯編程序常常用于非常關鍵的地方,比如系統啟動時的初始化,進出中斷時的環境保存、恢復,對性能要求非??量痰暮瘮档?。ARM 微處理器的指令集主要有 6 大類:跳轉指令、數據處理指令、程序狀態寄存器(PSR)處理指令、加載/存儲指令、協處理器指令、異常產生指令。
2.1跳轉指令
?跳轉(B)和跳轉連接(BL)指令是改變指令執行順序的標準方式。ARM一般按照字地址順序執行指令,需要時使用條件執行跳過某段指令。只要程序必須偏離順序執行,就要使用控制流指令來修改程序計數器。主要有三條指令:

指令語法格式跳轉范圍
跳轉指令B及帶連接的跳轉指令BLB{L}{<cond>}  <target_address>PC+-32MB
BX帶狀態切換的跳轉指令BXBX{<cond>}  <Rm>絕對地址4G
BXL帶狀態切換的連接跳轉指令BLXBLX  <target_add>絕對地址4G

2.2數據處理指令
?在了解ARM的數據處理指令之前要知道ARM的尋址方式,數據處理指令尋址方式可以分為3種:立即數尋址方式;寄存器尋址方式;寄存器移位尋址方式。其語法格式為:
<opcode> {<cond>} {S} <Rd>,<Rn>,<shifter_operand>,其中,<shifter_operand>有11種形式 。
ARM體系結構與常用匯編指令是什么

數據指令尋址方式指令
立即數尋址指令中的立即數是由一個8bit常數移動4bit偶數位得到的。
ADD  R3,R3,#1     ;R3的值加1
CMP  R7,#1000     ;R7的值和1000比較
BIC  R9,R8,#0xFF00    ;將R8中8~15位清零,結果保存在R9中
寄存器尋址方式寄存器的值可以被直接用于數據操作指令,這種尋址方式是各類處理器經常采用的一種方式,也是一種執行效率較高的尋址方式。
ADD  R4,R3,R2     ;R2加R3,結果送R4
CMP  R7,R8        ;比較R7和R8的值
寄存器移位尋址方式寄存器的值在被送到ALU之前,可以事先經過桶形移位寄存器的處理。預處理和移位發生在同一周期內,所以有效地使用移位寄存器,可以增加代碼的執行效率。
MOV  R1,R0,LSL  #2
RSB  R9,R5,R5,LSL  #1

內存訪問指令尋址方式主要有以下幾種。

寄存器指令尋址方式含義
寄存器間接尋址指令中的地址碼給出的是一個通用寄存器編號,所需要的操作數保存在寄存器指定地址的存儲單元中,即寄存器為操作數的地址指針,操作數存放在存儲器中。
LDR R0,[R1] ; R0←[R1](將R1中的數值作為地址,取出此地址中的數據保存在R0中)
STR R0,[R1] ; [R1] ←R0
寄存器指令尋址方式含義
變址尋址將基址寄存器的內容與指令中給出的偏移量相加,形成操作數的有效地址,變址尋址用于訪問基址附近的存儲單元,常用于查表,數組操作,功能部件寄存器訪問等。
LDR R2,[R3,#4] ; R2←[R3 + 4](將R3中的數值加4作為地址,取出此地址的數值保存在R2 中)
STR R1,[R0,#-2] ; [R0-2] ← R1
多寄存器尋址含義
變址尋址采用多寄存器尋址方式,一條指令可以完成多個寄存器值的傳送,這種尋址方式用一條指令最多可以完成16個寄存器值的傳送。
LDMIA R0,{R1,R2,R3,R5} ; R1←[R0]
(IA表示是后遞增方式); R2←[R0 + 4]
(IB表示是先遞增方式) ; R3←[R0 + 8]
(DA和DB表示后遞減和先遞減) ; R5←[R0 + 12]
多寄存器尋址含義
堆棧尋址堆棧操作順序分為“后進先出”和“先進后出”,堆棧尋址時隱含的,它使用一個專門的寄存器(堆棧指針)指向一塊存儲區域(堆棧),指針所指向的存儲單元就是堆棧的棧頂。

向上生長:向高地址方向生長,稱為遞增堆棧;向下生長:向低地址方向生長,稱為遞減堆棧。
堆棧指針指向最后壓入的堆棧的有效數據項, 稱為滿堆棧(Full Stack);堆棧指針指向下一個要放入的空位置,稱為空堆棧(
Empty  Stack)。

堆棧工作方式說明
滿遞增堆棧堆棧指針指向最后壓入的數據,且由低地址向高地址生成。如指令LDMFA, STMFA 等。
滿遞減堆棧堆棧指針指向最后壓入的數據,且由高地址向低地址生成。如指令LDMFD, STMFD 等。
空遞增堆棧堆棧指針指向下一個將要放入數據的空位置,且由低地址向高地址生成。如指令LDMEA, STMEA 等。
空遞減堆棧堆棧指針指向下一個將要放入數據的空位置,且由高地址向低地址生成。如指令LDMED, STMED 等。

? 數據操作指令是指對存放在寄存器中的數據進行操作的指令。包括:數據傳送指令、 算術指令、 邏輯指令、 比較與測試指令及乘法指令。 如果在數據處理指令后使用S前綴,指令的執行結果將會影響CPSR中的標志位。
ARM體系結構與常用匯編指令是什么
? ARM乘法指令完成兩個數據的乘法。兩個32位二進制數相乘的結果是64位的積。

乘法指令說明
MUL指令MUL(Multiply)32位乘法指令將Rm和Rs中的值相乘,結果的最低32位保存到Rd中
MLA乘—累加指令MLA(Multiply Accumulate)32位乘—累加指令將Rm和Rs中的值相乘,再將乘積加上第3個操作數,結果的最低32位保存到Rd中。
UMULL指令UMULL(Unsigned Multiply Long)為64位無符號乘法指令。它將Rm和Rs中的值做無符號數相乘,結果的低32位保存到RsLo中,高32位保存到RdHi中。
UMLAL指令UMLAL(Unsigned Multiply Accumulate Long)為64位無符號長乘—累加指令。指令將Rm和Rs中的值做無符號數相乘,64位乘積與RdHi、RdLo相加,結果的低32位保存到RsLo中,高32位保存到RdHi中。
SMULL指令SMULL(Signed Multiply Long)為64位有符號長乘法指令。指令將Rm和Rs中的值做有符號數相乘,結果的低32位保存到RsLo中,高32位保存到RdHi中。
SMLAL指令SMLAL(Signed Multiply Accumulate Long)為64位有符號長乘—累加指令。指令將Rm和Rs中的值做有符號數相乘,64位乘積與RdHi、RdLo相加,結果的低32位保存到RsLo中,高32位保存到RdHi中。

ARM體系結構與常用匯編指令是什么
2.3加載/存儲指令
? Load/Store內存訪問指令在ARM寄存器和存儲器之間傳送數據。 ARM指令中有3種基本的數據傳送指令。單寄存器Load/Store指令( Single Register);’多寄存器Load/Store內存訪問指令;單寄存器交換指令( Single Register Swap)。

指令說明
單寄存器的Load/Store指令用于把單一的數據傳入或者傳出一個寄存器。支持的數據類型有字節( 8位)、半字( 16位)和字( 32位)。

ARM體系結構與常用匯編指令是什么

示例代碼:
LDR R2,[R5] ;將R5指向地址的字數據存入R2
STR R1,[R0,#0x04] ;將R1的數據存儲到R0+0x04地址
LDRB R3,[R2],#-1 ;將R2指向地址的字節數據存入R3, R2=R2-1
指令說明
多寄存器的Load/Store內存訪問指令多寄存器的Load/Store內存訪問指令也叫批量加載/存儲指令,它可以實現在一組寄存器和一塊連續的內存單元之間傳送數據。 LDM用于加載多個寄存器, STM用于存儲多個寄存器。

ARM體系結構與常用匯編指令是什么

示例代碼:
    LDR R0,=SrcData ;設置源數據地址
    LDR R1,=DstData ;設置目標地址
    LDMIA R0,{R2~R9} ;加載8字數據到寄存器R2~R9
    STMIA R1,{R2~R9} ;存儲寄存器R2~R9到目標地址
指令說明
單數據交換指令交換指令是Load/Store指令的一種特例,它把一個寄存器單元的內容與寄存器內容交換。

ARM體系結構與常用匯編指令是什么

2.4程序狀態寄存器(PSR)處理指令
?ARM指令集提供了兩條指令,可直接控制程序狀態寄存器。MRS指令用于把CPSR或SPSR的值傳送到一個寄存器;MSR與之相反,把一個寄存器的內容傳送到CPSR或SPSR。這兩條指令相結合,可用于對CPSR和SPSR進行讀/寫操作。
ARM體系結構與常用匯編指令是什么

( 1)MRS指令的語法格式: 
        MRS{cond} Rd, PSR;Rd為目標寄存器, Rd不允許為程序計數器( PC)。 PSR為CPSR或SPSR。
指令舉例:
        MRS R1,CPSR ;將CPSR狀態寄存器讀取,保存到R1中
        MRS R2,SPSR ;將SPSR狀態寄存器讀取,保存到R1中
(2)MSR指令的語法格式
    MSR{cond} PSR_field,#immed_8r 或MSR{cond} PSR_field,Rm
        <fields>設置狀態寄存器中需要操作的位。狀態寄存器的32位可以分為4個8位的域( field)。 
                    bits[31: 24]為條件標志位域,用f表示; 
                    bits[23:16]為狀態位域,用s表示; 
                    bits[15: 8]為擴展位域,用x表示; 
                    bits[7: 0]為控制位域,用c表示; 
                    immed_8r為要傳送到狀態寄存器指定域的立即數, 8位; 
                    Rm為要傳送到狀態寄存器指定域的數據源寄存器。
指令舉例:
        MSR CPSR_c,#0xD3 ;CPSR[7:0]=0xD3,切換到管理模式
        MSR CPSR_cxsf,R3 ;CPSR=R3

2.5協處理器指令
?ARM協處理器指令可分為3類:協處理器數據操作, CDP;協處理器數據傳送指令,包括LDC和STC;協處理器寄存器傳送指令,包括MCR和MRC。
ARM體系結構與常用匯編指令是什么

2.6異常產生指令
?ARM指令集中提供了兩條產生異常的指令,通過這兩條指令可以用軟件的方法實現異常。
ARM體系結構與常用匯編指令是什么

三、ARM-THUMB 子程序調用規則 ATPCS

?為了使 C 語言程序和匯編程序之間能夠互相調用,必須為子程序間的調用制定規則,在ARM 處理器中,這個規則被稱為 ATPCS: ARM 程序和 Thumb 程序中子程序調用的規則。 基本的ATPCS 規則包括寄存器使用規則、數據棧使用規則、參數傳遞規則。
3.1、寄存器使用規則
ARM 處理器中有 r0~r15 共 16 個寄存器, 它們的用途有一些約定的習慣,并依具這些用途定義了別名,如下表所示:

寄存器別名使用規則
TextTextText
r15pc程序計數器
r14lr連接寄存器
r13sp數據棧指針
r12ip子程序內部調用的 scratch 寄存器
r11v8ARM 狀態局部變量寄存器 8
r10v7、 s1ARM 狀態局部變量寄存器 7、在支持數據棧檢查的 ATPCS 中為數據棧限制指針
r9v6、 sbARM 狀態局部變量寄存器 6、在支持 RWPI 的 ATPCS 中為靜態基址寄存器
r8v5ARM 狀態局部變量寄存器 5
r7v4、 wrARM 狀態局部變量寄存器 4、 Thumb 狀態工作寄存器
r6v3ARM 狀態局部變量寄存器 3
r5v2ARM 狀態局部變量寄存器 2
r4v1ARM 狀態局部變量寄存器 1
r3a4參數/結果/scratch 寄存器 4
r2a3參數/結果/scratch 寄存器 3
r1a2參數/結果/scratch 寄存器 2
r0a1參數/結果/scratch 寄存器 1

3.2、 數據棧使用規則
?數據棧有兩個增長方向:向內存地址減小的方向增長時,稱為 DESCENDING 棧;向內地址增加的方向增長時,稱為 ASCENDING 棧。
?所謂數據棧的增長就是移動棧指針。當棧指針指向棧頂元素(最后一個入棧的數據)時,稱為 FULL 棧;當棧指針指向棧頂元素(最后一個入棧的數據)相鄰的一個空的數據單元時,稱為 EMPTY 棧。
?綜合這兩個特點, 數據??梢苑譃橐韵?4 種:① FD Full Descending,滿遞減;② ED Empty Descending,空遞減;③ FA Full Ascending,滿遞增;④ EA Empty Ascending,空遞增。
?ATPCS 規定數據棧為 FD 類型,并且對數據棧的操作是 8 字節對齊的。 使用 stmdb/ldmia批量內存訪問指令來操作 FD 數據棧。
3.3、 參數傳遞規則
?一般來說,當參數個數不超過 4 個時,使用 r0~r3 這 4 個寄存器來傳遞參數;如果參數個數超過 4 個,剩余的參數通過數據棧來傳遞。對于一般的返回結果, 通常使用 a0~a3 來傳遞。

感謝各位的閱讀!關于“ARM體系結構與常用匯編指令是什么”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

arm
AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女