溫馨提示×

溫馨提示×

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

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

ARM體系結(jié)構(gòu)與常用匯編指令是什么

發(fā)布時(shí)間:2021-11-20 17:14:03 來源:億速云 閱讀:104 作者:小新 欄目:系統(tǒng)運(yùn)維

這篇文章給大家分享的是有關(guān)ARM體系結(jié)構(gòu)與常用匯編指令是什么的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。

一、ARM體系結(jié)構(gòu)

?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推出前,其處理器比較:


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

?馮諾伊曼結(jié)構(gòu)與哈佛結(jié)構(gòu)的區(qū)別:
ARM體系結(jié)構(gòu)與常用匯編指令是什么

?在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)。
ARM體系結(jié)構(gòu)與常用匯編指令是什么
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ǔ)格式完全不一樣。
ARM體系結(jié)構(gòu)與常用匯編指令是什么??ARM體系結(jié)構(gòu)與常用匯編指令是什么
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)的寄存器組。
ARM體系結(jié)構(gòu)與常用匯編指令是什么
? 在匯編語言中寄存器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。該寄存器的位分配圖為:
ARM體系結(jié)構(gòu)與常用匯編指令是什么

寄存器位作用
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 = 1IRQ被禁止
F = 1FIQ被禁止
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體系結(jié)構(gòu)與常用匯編指令是什么
? ARM處理器的運(yùn)行狀態(tài)可以分為ARM與Thumb兩種狀態(tài)。其中ARM狀態(tài)下PC值為字對齊(4字節(jié)),Thumb狀態(tài)下PC值為半字對齊(2字節(jié))。

二、ARM的指令系統(tǒng)

? 在嵌入式開發(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)指令BLB{L}{<cond>}  <target_address>PC+-32MB
BX帶狀態(tài)切換的跳轉(zhuǎn)指令BXBX{<cond>}  <Rm>絕對地址4G
BXL帶狀態(tài)切換的連接跳轉(zhuǎn)指令BLXBLX  <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種形式 。
ARM體系結(jié)構(gòu)與常用匯編指令是什么

數(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體系結(jié)構(gòu)與常用匯編指令是什么
? 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中。

ARM體系結(jié)構(gòu)與常用匯編指令是什么
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位)。

ARM體系結(jié)構(gòu)與常用匯編指令是什么

示例代碼:
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è)寄存器。

ARM體系結(jié)構(gòu)與常用匯編指令是什么

示例代碼:
    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)容交換。

ARM體系結(jié)構(gòu)與常用匯編指令是什么

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

( 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。
ARM體系結(jié)構(gòu)與常用匯編指令是什么

2.6異常產(chǎn)生指令
?ARM指令集中提供了兩條產(chǎn)生異常的指令,通過這兩條指令可以用軟件的方法實(shí)現(xiàn)異常。
ARM體系結(jié)構(gòu)與常用匯編指令是什么

三、ARM-THUMB 子程序調(diào)用規(guī)則 ATPCS

?為了使 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ī)則
TextTextText
r15pc程序計(jì)數(shù)器
r14lr連接寄存器
r13sp數(shù)據(jù)棧指針
r12ip子程序內(nèi)部調(diào)用的 scratch 寄存器
r11v8ARM 狀態(tài)局部變量寄存器 8
r10v7、 s1ARM 狀態(tài)局部變量寄存器 7、在支持?jǐn)?shù)據(jù)棧檢查的 ATPCS 中為數(shù)據(jù)棧限制指針
r9v6、 sbARM 狀態(tài)局部變量寄存器 6、在支持 RWPI 的 ATPCS 中為靜態(tài)基址寄存器
r8v5ARM 狀態(tài)局部變量寄存器 5
r7v4、 wrARM 狀態(tài)局部變量寄存器 4、 Thumb 狀態(tài)工作寄存器
r6v3ARM 狀態(tài)局部變量寄存器 3
r5v2ARM 狀態(tài)局部變量寄存器 2
r4v1ARM 狀態(tài)局部變量寄存器 1
r3a4參數(shù)/結(jié)果/scratch 寄存器 4
r2a3參數(shù)/結(jié)果/scratch 寄存器 3
r1a2參數(shù)/結(jié)果/scratch 寄存器 2
r0a1參數(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ò),可以把它分享出去讓更多的人看到吧!

向AI問一下細(xì)節(jié)

免責(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)容。

arm
AI