您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關(guān)ARM體系結(jié)構(gòu)與常用匯編指令是什么的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。
?ARM(Advanced RISC Machines) ,既可以認(rèn)為是一個(gè)公司的名字,也可以認(rèn)為是對一類微處理器的通稱,還可以認(rèn)為是一種技術(shù)的名字。ARM 處理器是一種低功耗高性能的 32 位RISC 處理器,基于 ARM 的處理器以其高速度、低功耗等諸多優(yōu)異的性能而得到非常廣泛的應(yīng)用。
?ARM公司在經(jīng)典處理器ARM11以后的產(chǎn)品改用Cortex命名,并分成A、R和M三類,其分別應(yīng)用于不同的領(lǐng)域。Cortex系列屬于ARMv7架構(gòu),其中“A”系列面向尖端的基于虛擬內(nèi)存的操作系統(tǒng)和用戶應(yīng)用;“R”系列針對實(shí)時(shí)系統(tǒng);“M”系列對微控制器。在ARM11推出前,其處理器比較:
ARM7 | ARM9 | ARM10 | ARM11 | |
---|---|---|---|---|
流水線 | 3級 | 5級 | 6級 | 8級 |
典型頻率MHz | 80 | 150 | 260 | 335 |
功耗mW/MHz | 0.06 | 0.19(+cache) | 0.5 (+cache) | 0.4 (+cache) |
性能MIPS/MHz | 0.97 | 1.1 | 1.3 | 1.2 |
架構(gòu) | 馮*諾伊曼 | 哈佛 | 哈佛 | 哈佛 |
?馮諾伊曼結(jié)構(gòu)與哈佛結(jié)構(gòu)的區(qū)別:
?在TQ2440開發(fā)板上使用的是S3C2440芯片。這是一款基于ARM920T核心的微處理器芯片,采用哈佛結(jié)構(gòu)使用5級指令流水線包括:取指、譯碼、執(zhí)行、存儲(chǔ)及寫入。各步驟作用分別為:
(1)取指令(fetch):從存儲(chǔ)器中取出指令,并將其放入指令流水線。
(2)譯碼(decode):指令被譯碼,從寄存器堆中讀取寄存器操作數(shù)。在寄存器堆中有3個(gè)操作數(shù)讀端口,因此,大多數(shù)ARM指令能在1個(gè)周期內(nèi)讀取其操作數(shù)。
(3)執(zhí)行(execute):將其中1個(gè)操作數(shù)移位,并在ALU中產(chǎn)生結(jié)果。如果指令是Load或Store指令,則在ALU中計(jì)算存儲(chǔ)器的地址。
(4)緩沖/數(shù)據(jù)(buffer/data):如果需要?jiǎng)t訪問數(shù)據(jù)存儲(chǔ)器,否則ALU只是簡單地緩沖1個(gè)時(shí)鐘周期。
(5)回寫(write-back):將指令的結(jié)果回寫到寄存器堆,包括任何從寄存器讀出的數(shù)據(jù)。
1.1ARM基本數(shù)據(jù)類型
?ARM采用的是32位架構(gòu),基本數(shù)據(jù)類型有3種:Byte(字節(jié)), 8bit;Halfword(半字),16bit(半字必須2字節(jié)邊界對齊);Word(字), 32bit(字必須于4字節(jié)邊界對齊)。
?長度為1個(gè)字的數(shù)據(jù)項(xiàng)占用一組4字節(jié)的位置,該位置開始于4的倍數(shù)的地址(地址最末兩位為00)半字占有兩個(gè)字節(jié)的位置,該位置開始于偶數(shù)字節(jié)地址(地址最末一位為0)。
1.2存儲(chǔ)器大/小端
?大端模式,是指數(shù)據(jù)的高字節(jié)保存在內(nèi)存的低地址中,而數(shù)據(jù)的低字節(jié)保存在內(nèi)存的高地址中。小端模式,是指數(shù)據(jù)的高字節(jié)保存在內(nèi)存的高地址中,而數(shù)據(jù)的低字節(jié)保存在內(nèi)存的低地址中。例如變量word a=0xf6734bcd,使用大/小端存儲(chǔ)格式完全不一樣。
??
1.3ARM編程模型
?要想了解ARM920T為內(nèi)核芯片的主要可以從幾個(gè)方面入手:工作模式、ARM異常種類、寄存器組織、運(yùn)行狀態(tài)。
?ARM920T是基于ARM V4T 架構(gòu),共有7種工作模式:
處理器 | 描述 |
---|---|
用戶模式(usr) | ARM 處理器正常的程序執(zhí)行狀態(tài)。 |
快速中斷模式(fiq) | 用于高速數(shù)據(jù)傳輸或通道處理。 |
外部中斷模式(irq) | 用于通常的中斷處理。 |
管理模式(svc) | 操作系統(tǒng)使用的保護(hù)模式。 |
數(shù)據(jù)訪問終止模式(abt) | 當(dāng)數(shù)據(jù)或指令預(yù)取終止時(shí)進(jìn)入該模式,可用于虛擬存儲(chǔ)及存儲(chǔ)保護(hù)。 |
系統(tǒng)模式(sys) | 運(yùn)行具有特權(quán)的操作系統(tǒng)任務(wù)。 |
未定義指令中止模式(und) | 當(dāng)未定義的指令執(zhí)行時(shí)進(jìn)入該模式,可用于支持硬件協(xié)處理器的軟件仿真。 |
?七種工作模式又可以從兩個(gè)方面劃分:特權(quán)模式與非特權(quán)模式;異常模式與非異常模式。
劃分方式 | 說明 |
---|---|
特權(quán)模式與非特權(quán)模式 | 用戶模式外的其他6種處理器模式稱為特權(quán)模式(Privileged Modes)。在特權(quán)模式下,程序可以訪問所有的系統(tǒng)資源,也可以任意地進(jìn)行處理器模式切換,而用戶模式不能直接切換到別的模式。 |
異常模式與非異常模式 | 除去用戶模式和系統(tǒng)模式以外的 5 種又稱為異常模式(ExceptionModes),常用于處理中斷或異常,以及需要訪問受保護(hù)的系統(tǒng)資源等情況。 |
?在異常模式下,有著不同的異常,其對應(yīng)關(guān)系為:
異常 | 向量表 | 模式 |
---|---|---|
復(fù)位(Reset) | 0x00 | 管理模式 |
未定義指令(Undefined Instruction) | 0x04 | 未定義指令中止模式 |
軟中斷(Software Interrupt) | 0x08 | 管理模式 |
指令預(yù)取異常(Prefetch Abrot) | 0x0C | 數(shù)據(jù)訪問終止模式 |
數(shù)據(jù)異常(Data Abort) | 0x10 | 數(shù)據(jù)訪問終止模式 |
保留(Reserved) | 0x14 | / |
中斷(IRQ) | 0x18 | 數(shù)據(jù)訪問終止模式 |
快速中斷(FIQ) | 0x1C | 快速中斷模式 |
?ARM 處理器共有 37 個(gè)寄存器,被分為若干個(gè)組(BANK)。31 個(gè)通用寄存器,包括程序計(jì)數(shù)器(PC 指針),均為 32 位的寄存器;6 個(gè)狀態(tài)寄存器,1個(gè)CPSR(Current Program Status Register,當(dāng)前程序狀態(tài)寄存器),5個(gè)SPSR(Saved Program Status Register,備份程序狀態(tài)寄存器),用以標(biāo)識 CPU 的工作狀態(tài)及程序的運(yùn)行狀態(tài),均為 32 位。ARM有7種不同的處理器模式,在每一種處理器模式中有一組相應(yīng)的寄存器組。
? 在匯編語言中寄存器R0~R13為保存數(shù)據(jù)或地址值的通用寄存器。它們是完全通用的寄存器,不會(huì)被體系結(jié)構(gòu)作為特殊用途,并且可用于任何使用通用寄存器的指令。這些通用寄存器根據(jù)其分組與否可分為以下2類。未分組寄存器(the Unbanked Register),包括R0~R7;分組寄存器(the Banked Register),包括R8~R14。
? 未分組寄存器沒有被系統(tǒng)用于特殊的用途,任何可采用通用寄存器的應(yīng)用場合都可以使用未分組寄存器。但由于其通用性,在異常中斷所引起的處理器模式切換時(shí),其使用的是相同的物理寄存器,所以也就很容易使寄存器中的數(shù)據(jù)被破壞。
? 分組寄存器根據(jù)處理器模式使用方法有所不同:
分組寄存器 | 說明 |
---|---|
R8~R12 | 每個(gè)寄存器對應(yīng)兩個(gè)不同的物理寄存器。一組用于除FIQ模式外的所有處理器模式,而另一組則專門用于FIQ模式。 |
R13和R14 | 每個(gè)寄存器對應(yīng)6個(gè)不同的物理寄存器。其中的一個(gè)是用戶模式和系統(tǒng)模式公用的,而另外5個(gè)分別用于5種異常模式。訪問時(shí)需要指定它們的模式。名字形式:R13<mode>、R14<mode>。<mode>可以是以下幾種模式之一:usr、svc、abt、und、irp及fiq。R13寄存器在ARM處理器中常用作堆棧指針,稱為SP ;寄存器R14又被稱為連接寄存器(Link Register,LR)。 |
? 程序計(jì)數(shù)器R15( PC),它指向正在取指的地址,在異常模式中,另外一個(gè)寄存器“ 程序狀態(tài)備份寄存器( SPSR) ” 可以被訪問。每種異常都有自己的SPSR,在進(jìn)入異常時(shí)它保存CPSR的當(dāng)前值,異常退出時(shí)可通過它恢復(fù)CPSR。該寄存器的位分配圖為:
寄存器位 | 作用 |
---|---|
N位 | 符號位。如果結(jié)果為負(fù)數(shù),則N = 1;如果結(jié)果為正數(shù)或0,則 N = 0 |
Z位 | 如果指令的結(jié)果為0,則置1(通常用來表示比較的結(jié)果為“相等”);否則置0 |
C位 | 表示運(yùn)算的進(jìn)位、借位等 |
V位 | 益出標(biāo)志位 |
Q標(biāo)志位 | 在帶DSP指令擴(kuò)展的ARM v5及更高版本中,bit[27]被指定用于指示增強(qiáng)的DAP指令是否發(fā)生了溢出,因此也就被稱為Q標(biāo)志位。同樣,在SPSR中bit[27]也被稱為Q標(biāo)志位,用于在異常中斷發(fā)生時(shí)保存和恢復(fù)CPSR中的Q標(biāo)志位。在ARM v5以前的版本及ARM v5的非E系列處理器中,Q標(biāo)志位沒有被定義,屬于待擴(kuò)展的位。 |
I = 1 | IRQ被禁止 |
F = 1 | FIQ被禁止 |
T位 | 處理器的狀態(tài)控制位。T = 0,處理器處于ARM狀態(tài)(即正在執(zhí)行32位的ARM指令)。T = 1,處理器處于Thumb狀態(tài)(即正在執(zhí)行16位的Thumb指令)。T位只有在T系列的ARM處理器上才有效,在非T系列的ARM版本中,T位將始終為0。 |
M[4∶0] | 作為位模式控制位,其具體控制模式可見下表。 |
? ARM處理器的運(yùn)行狀態(tài)可以分為ARM與Thumb兩種狀態(tài)。其中ARM狀態(tài)下PC值為字對齊(4字節(jié)),Thumb狀態(tài)下PC值為半字對齊(2字節(jié))。
? 在嵌入式開發(fā)中,匯編程序常常用于非常關(guān)鍵的地方,比如系統(tǒng)啟動(dòng)時(shí)的初始化,進(jìn)出中斷時(shí)的環(huán)境保存、恢復(fù),對性能要求非??量痰暮瘮?shù)等。ARM 微處理器的指令集主要有 6 大類:跳轉(zhuǎn)指令、數(shù)據(jù)處理指令、程序狀態(tài)寄存器(PSR)處理指令、加載/存儲(chǔ)指令、協(xié)處理器指令、異常產(chǎn)生指令。
2.1跳轉(zhuǎn)指令
?跳轉(zhuǎn)(B)和跳轉(zhuǎn)連接(BL)指令是改變指令執(zhí)行順序的標(biāo)準(zhǔn)方式。ARM一般按照字地址順序執(zhí)行指令,需要時(shí)使用條件執(zhí)行跳過某段指令。只要程序必須偏離順序執(zhí)行,就要使用控制流指令來修改程序計(jì)數(shù)器。主要有三條指令:
指令 | 語法格式 | 跳轉(zhuǎn)范圍 |
---|---|---|
跳轉(zhuǎn)指令B及帶連接的跳轉(zhuǎn)指令BL | B{L}{<cond>} <target_address> | PC+-32MB |
BX帶狀態(tài)切換的跳轉(zhuǎn)指令BX | BX{<cond>} <Rm> | 絕對地址4G |
BXL帶狀態(tài)切換的連接跳轉(zhuǎn)指令BLX | BLX <target_add> | 絕對地址4G |
2.2數(shù)據(jù)處理指令
?在了解ARM的數(shù)據(jù)處理指令之前要知道ARM的尋址方式,數(shù)據(jù)處理指令尋址方式可以分為3種:立即數(shù)尋址方式;寄存器尋址方式;寄存器移位尋址方式。其語法格式為:
<opcode> {<cond>} {S} <Rd>,<Rn>,<shifter_operand>,其中,<shifter_operand>有11種形式 。
數(shù)據(jù)指令尋址方式 | 指令 |
---|---|
立即數(shù)尋址 | 指令中的立即數(shù)是由一個(gè)8bit常數(shù)移動(dòng)4bit偶數(shù)位得到的。 |
ADD R3,R3,#1 ;R3的值加1 | |
CMP R7,#1000 ;R7的值和1000比較 | |
BIC R9,R8,#0xFF00 ;將R8中8~15位清零,結(jié)果保存在R9中 | |
寄存器尋址方式 | 寄存器的值可以被直接用于數(shù)據(jù)操作指令,這種尋址方式是各類處理器經(jīng)常采用的一種方式,也是一種執(zhí)行效率較高的尋址方式。 |
ADD R4,R3,R2 ;R2加R3,結(jié)果送R4 | |
CMP R7,R8 ;比較R7和R8的值 | |
寄存器移位尋址方式 | 寄存器的值在被送到ALU之前,可以事先經(jīng)過桶形移位寄存器的處理。預(yù)處理和移位發(fā)生在同一周期內(nèi),所以有效地使用移位寄存器,可以增加代碼的執(zhí)行效率。 |
MOV R1,R0,LSL #2 | |
RSB R9,R5,R5,LSL #1 |
內(nèi)存訪問指令尋址方式主要有以下幾種。
寄存器指令尋址方式 | 含義 |
---|---|
寄存器間接尋址 | 指令中的地址碼給出的是一個(gè)通用寄存器編號,所需要的操作數(shù)保存在寄存器指定地址的存儲(chǔ)單元中,即寄存器為操作數(shù)的地址指針,操作數(shù)存放在存儲(chǔ)器中。 |
LDR R0,[R1] ; R0←[R1](將R1中的數(shù)值作為地址,取出此地址中的數(shù)據(jù)保存在R0中) STR R0,[R1] ; [R1] ←R0
寄存器指令尋址方式 | 含義 |
---|---|
變址尋址 | 將基址寄存器的內(nèi)容與指令中給出的偏移量相加,形成操作數(shù)的有效地址,變址尋址用于訪問基址附近的存儲(chǔ)單元,常用于查表,數(shù)組操作,功能部件寄存器訪問等。 |
LDR R2,[R3,#4] ; R2←[R3 + 4](將R3中的數(shù)值加4作為地址,取出此地址的數(shù)值保存在R2 中) STR R1,[R0,#-2] ; [R0-2] ← R1
多寄存器尋址 | 含義 |
---|---|
變址尋址 | 采用多寄存器尋址方式,一條指令可以完成多個(gè)寄存器值的傳送,這種尋址方式用一條指令最多可以完成16個(gè)寄存器值的傳送。 |
LDMIA R0,{R1,R2,R3,R5} ; R1←[R0] (IA表示是后遞增方式); R2←[R0 + 4] (IB表示是先遞增方式) ; R3←[R0 + 8] (DA和DB表示后遞減和先遞減) ; R5←[R0 + 12]
多寄存器尋址 | 含義 |
---|---|
堆棧尋址 | 堆棧操作順序分為“后進(jìn)先出”和“先進(jìn)后出”,堆棧尋址時(shí)隱含的,它使用一個(gè)專門的寄存器(堆棧指針)指向一塊存儲(chǔ)區(qū)域(堆棧),指針?biāo)赶虻拇鎯?chǔ)單元就是堆棧的棧頂。 |
向上生長:向高地址方向生長,稱為遞增堆棧;向下生長:向低地址方向生長,稱為遞減堆棧。
堆棧指針指向最后壓入的堆棧的有效數(shù)據(jù)項(xiàng), 稱為滿堆棧(Full Stack);堆棧指針指向下一個(gè)要放入的空位置,稱為空堆棧(
Empty Stack)。
堆棧工作方式 | 說明 |
---|---|
滿遞增堆棧 | 堆棧指針指向最后壓入的數(shù)據(jù),且由低地址向高地址生成。如指令LDMFA, STMFA 等。 |
滿遞減堆棧 | 堆棧指針指向最后壓入的數(shù)據(jù),且由高地址向低地址生成。如指令LDMFD, STMFD 等。 |
空遞增堆棧 | 堆棧指針指向下一個(gè)將要放入數(shù)據(jù)的空位置,且由低地址向高地址生成。如指令LDMEA, STMEA 等。 |
空遞減堆棧 | 堆棧指針指向下一個(gè)將要放入數(shù)據(jù)的空位置,且由高地址向低地址生成。如指令LDMED, STMED 等。 |
? 數(shù)據(jù)操作指令是指對存放在寄存器中的數(shù)據(jù)進(jìn)行操作的指令。包括:數(shù)據(jù)傳送指令、 算術(shù)指令、 邏輯指令、 比較與測試指令及乘法指令。 如果在數(shù)據(jù)處理指令后使用S前綴,指令的執(zhí)行結(jié)果將會(huì)影響CPSR中的標(biāo)志位。
? ARM乘法指令完成兩個(gè)數(shù)據(jù)的乘法。兩個(gè)32位二進(jìn)制數(shù)相乘的結(jié)果是64位的積。
乘法指令 | 說明 |
---|---|
MUL指令 | MUL(Multiply)32位乘法指令將Rm和Rs中的值相乘,結(jié)果的最低32位保存到Rd中 |
MLA乘—累加指令 | MLA(Multiply Accumulate)32位乘—累加指令將Rm和Rs中的值相乘,再將乘積加上第3個(gè)操作數(shù),結(jié)果的最低32位保存到Rd中。 |
UMULL指令 | UMULL(Unsigned Multiply Long)為64位無符號乘法指令。它將Rm和Rs中的值做無符號數(shù)相乘,結(jié)果的低32位保存到RsLo中,高32位保存到RdHi中。 |
UMLAL指令 | UMLAL(Unsigned Multiply Accumulate Long)為64位無符號長乘—累加指令。指令將Rm和Rs中的值做無符號數(shù)相乘,64位乘積與RdHi、RdLo相加,結(jié)果的低32位保存到RsLo中,高32位保存到RdHi中。 |
SMULL指令 | SMULL(Signed Multiply Long)為64位有符號長乘法指令。指令將Rm和Rs中的值做有符號數(shù)相乘,結(jié)果的低32位保存到RsLo中,高32位保存到RdHi中。 |
SMLAL指令 | SMLAL(Signed Multiply Accumulate Long)為64位有符號長乘—累加指令。指令將Rm和Rs中的值做有符號數(shù)相乘,64位乘積與RdHi、RdLo相加,結(jié)果的低32位保存到RsLo中,高32位保存到RdHi中。 |
2.3加載/存儲(chǔ)指令
? Load/Store內(nèi)存訪問指令在ARM寄存器和存儲(chǔ)器之間傳送數(shù)據(jù)。 ARM指令中有3種基本的數(shù)據(jù)傳送指令。單寄存器Load/Store指令( Single Register);’多寄存器Load/Store內(nèi)存訪問指令;單寄存器交換指令( Single Register Swap)。
指令 | 說明 |
---|---|
單寄存器的Load/Store指令 | 用于把單一的數(shù)據(jù)傳入或者傳出一個(gè)寄存器。支持的數(shù)據(jù)類型有字節(jié)( 8位)、半字( 16位)和字( 32位)。 |
示例代碼: LDR R2,[R5] ;將R5指向地址的字?jǐn)?shù)據(jù)存入R2 STR R1,[R0,#0x04] ;將R1的數(shù)據(jù)存儲(chǔ)到R0+0x04地址 LDRB R3,[R2],#-1 ;將R2指向地址的字節(jié)數(shù)據(jù)存入R3, R2=R2-1
指令 | 說明 |
---|---|
多寄存器的Load/Store內(nèi)存訪問指令 | 多寄存器的Load/Store內(nèi)存訪問指令也叫批量加載/存儲(chǔ)指令,它可以實(shí)現(xiàn)在一組寄存器和一塊連續(xù)的內(nèi)存單元之間傳送數(shù)據(jù)。 LDM用于加載多個(gè)寄存器, STM用于存儲(chǔ)多個(gè)寄存器。 |
示例代碼: LDR R0,=SrcData ;設(shè)置源數(shù)據(jù)地址 LDR R1,=DstData ;設(shè)置目標(biāo)地址 LDMIA R0,{R2~R9} ;加載8字?jǐn)?shù)據(jù)到寄存器R2~R9 STMIA R1,{R2~R9} ;存儲(chǔ)寄存器R2~R9到目標(biāo)地址
指令 | 說明 |
---|---|
單數(shù)據(jù)交換指令 | 交換指令是Load/Store指令的一種特例,它把一個(gè)寄存器單元的內(nèi)容與寄存器內(nèi)容交換。 |
2.4程序狀態(tài)寄存器(PSR)處理指令
?ARM指令集提供了兩條指令,可直接控制程序狀態(tài)寄存器。MRS指令用于把CPSR或SPSR的值傳送到一個(gè)寄存器;MSR與之相反,把一個(gè)寄存器的內(nèi)容傳送到CPSR或SPSR。這兩條指令相結(jié)合,可用于對CPSR和SPSR進(jìn)行讀/寫操作。
( 1)MRS指令的語法格式: MRS{cond} Rd, PSR;Rd為目標(biāo)寄存器, Rd不允許為程序計(jì)數(shù)器( PC)。 PSR為CPSR或SPSR。 指令舉例: MRS R1,CPSR ;將CPSR狀態(tài)寄存器讀取,保存到R1中 MRS R2,SPSR ;將SPSR狀態(tài)寄存器讀取,保存到R1中
(2)MSR指令的語法格式 MSR{cond} PSR_field,#immed_8r 或MSR{cond} PSR_field,Rm <fields>設(shè)置狀態(tài)寄存器中需要操作的位。狀態(tài)寄存器的32位可以分為4個(gè)8位的域( field)。 bits[31: 24]為條件標(biāo)志位域,用f表示; bits[23:16]為狀態(tài)位域,用s表示; bits[15: 8]為擴(kuò)展位域,用x表示; bits[7: 0]為控制位域,用c表示; immed_8r為要傳送到狀態(tài)寄存器指定域的立即數(shù), 8位; Rm為要傳送到狀態(tài)寄存器指定域的數(shù)據(jù)源寄存器。 指令舉例: MSR CPSR_c,#0xD3 ;CPSR[7:0]=0xD3,切換到管理模式 MSR CPSR_cxsf,R3 ;CPSR=R3
2.5協(xié)處理器指令
?ARM協(xié)處理器指令可分為3類:協(xié)處理器數(shù)據(jù)操作, CDP;協(xié)處理器數(shù)據(jù)傳送指令,包括LDC和STC;協(xié)處理器寄存器傳送指令,包括MCR和MRC。
2.6異常產(chǎn)生指令
?ARM指令集中提供了兩條產(chǎn)生異常的指令,通過這兩條指令可以用軟件的方法實(shí)現(xiàn)異常。
?為了使 C 語言程序和匯編程序之間能夠互相調(diào)用,必須為子程序間的調(diào)用制定規(guī)則,在ARM 處理器中,這個(gè)規(guī)則被稱為 ATPCS: ARM 程序和 Thumb 程序中子程序調(diào)用的規(guī)則。 基本的ATPCS 規(guī)則包括寄存器使用規(guī)則、數(shù)據(jù)棧使用規(guī)則、參數(shù)傳遞規(guī)則。
3.1、寄存器使用規(guī)則
ARM 處理器中有 r0~r15 共 16 個(gè)寄存器, 它們的用途有一些約定的習(xí)慣,并依具這些用途定義了別名,如下表所示:
寄存器 | 別名 | 使用規(guī)則 |
---|---|---|
Text | Text | Text |
r15 | pc | 程序計(jì)數(shù)器 |
r14 | lr | 連接寄存器 |
r13 | sp | 數(shù)據(jù)棧指針 |
r12 | ip | 子程序內(nèi)部調(diào)用的 scratch 寄存器 |
r11 | v8 | ARM 狀態(tài)局部變量寄存器 8 |
r10 | v7、 s1 | ARM 狀態(tài)局部變量寄存器 7、在支持?jǐn)?shù)據(jù)棧檢查的 ATPCS 中為數(shù)據(jù)棧限制指針 |
r9 | v6、 sb | ARM 狀態(tài)局部變量寄存器 6、在支持 RWPI 的 ATPCS 中為靜態(tài)基址寄存器 |
r8 | v5 | ARM 狀態(tài)局部變量寄存器 5 |
r7 | v4、 wr | ARM 狀態(tài)局部變量寄存器 4、 Thumb 狀態(tài)工作寄存器 |
r6 | v3 | ARM 狀態(tài)局部變量寄存器 3 |
r5 | v2 | ARM 狀態(tài)局部變量寄存器 2 |
r4 | v1 | ARM 狀態(tài)局部變量寄存器 1 |
r3 | a4 | 參數(shù)/結(jié)果/scratch 寄存器 4 |
r2 | a3 | 參數(shù)/結(jié)果/scratch 寄存器 3 |
r1 | a2 | 參數(shù)/結(jié)果/scratch 寄存器 2 |
r0 | a1 | 參數(shù)/結(jié)果/scratch 寄存器 1 |
3.2、 數(shù)據(jù)棧使用規(guī)則
?數(shù)據(jù)棧有兩個(gè)增長方向:向內(nèi)存地址減小的方向增長時(shí),稱為 DESCENDING 棧;向內(nèi)地址增加的方向增長時(shí),稱為 ASCENDING 棧。
?所謂數(shù)據(jù)棧的增長就是移動(dòng)棧指針。當(dāng)棧指針指向棧頂元素(最后一個(gè)入棧的數(shù)據(jù))時(shí),稱為 FULL 棧;當(dāng)棧指針指向棧頂元素(最后一個(gè)入棧的數(shù)據(jù))相鄰的一個(gè)空的數(shù)據(jù)單元時(shí),稱為 EMPTY 棧。
?綜合這兩個(gè)特點(diǎn), 數(shù)據(jù)棧可以分為以下 4 種:① FD Full Descending,滿遞減;② ED Empty Descending,空遞減;③ FA Full Ascending,滿遞增;④ EA Empty Ascending,空遞增。
?ATPCS 規(guī)定數(shù)據(jù)棧為 FD 類型,并且對數(shù)據(jù)棧的操作是 8 字節(jié)對齊的。 使用 stmdb/ldmia批量內(nèi)存訪問指令來操作 FD 數(shù)據(jù)棧。
3.3、 參數(shù)傳遞規(guī)則
?一般來說,當(dāng)參數(shù)個(gè)數(shù)不超過 4 個(gè)時(shí),使用 r0~r3 這 4 個(gè)寄存器來傳遞參數(shù);如果參數(shù)個(gè)數(shù)超過 4 個(gè),剩余的參數(shù)通過數(shù)據(jù)棧來傳遞。對于一般的返回結(jié)果, 通常使用 a0~a3 來傳遞。
感謝各位的閱讀!關(guān)于“ARM體系結(jié)構(gòu)與常用匯編指令是什么”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。