ARM 寄存器 详解
?
From(?ARM 寄存器詳解 ):https://blog.csdn.net/sandeldeng/article/details/52954781
ARM 匯編基礎教程:2.數據類型和寄存器:https://www.52pojie.cn/thread-797306-1-1.html
?
?
ARM?的?寄存器
?
ARM?工作狀態 和?工作模式
- 工作狀態:arm 支持大小端(默認小端 --- 低地址地位字節數據)、arm支持16bit thumb指令和32bit arm指令(默認arm指令)
- 工作模式:不同 工作模式 下 可訪問的寄存器和指令集有差異,主要用于區分運行權限保護系統(由運行異常、中斷或者軟件主動觸發切換模式)
工作模式分類(7種):用戶模式usr(低權限-用戶進程工作)、快速中斷FIQ、普通中斷IRQ、保護模式supervisior(高權限-操作系統運行)、地址或內存訪問錯誤Abort、指令未定義Undefined、系統特權任務模式system(較少用)
ARM 尋址方式(處理器根據指令信息找到操作數的方式)
- 1、立即數尋址( 操作數直接在指令中 mov R1,#3:將3放到R0)
- 2、寄存器尋址 ( 操作數放在寄存器中 mov R0,R1:將R0的值放到R1中)
- 3、寄存器間接尋址
? ? ? ? (操作數在寄存器值為地址指向的內存中 mov R0,[R2]:將R2中的值為地址指向內存中的數放到R0中) - 4、寄存器位移尋址
? ? ? ? (當第二個數為位移方式時、將寄存器的值先位移處理得到操作數 mov R0,R1,lsl#3:將R1中值左移3位放到R0中) - 5、寄存器基址尋址(也叫基址變址尋址)
? ? ? ? 由間接尋址發展而來,先對寄存器中的值進行計算,再以結果為地址,取其指向內存值為操作數。
? ? ? ? 示例: LDR R0, [R1, ??#4]:先將R1中的值加4 然后以結果為地址 對應的內存操作數放到R0 - 6、多寄存器尋址
? ? ? ? 一條指令傳送多個(最多16個)寄存器值
? ? ? ? 示例: STMIA R0!,{R2-R7,R12}:將 R2 到 R7 和 R12 放到 R0 指向的地址中 - 7、相對尋址
? ? ? ? 以程序計數器 PC 的當前值為基地址,指令中的地址標號作為偏移量,
? ? ? ? 將兩者相加之后得到操作數的有效地址 BL NEXT:跳轉到NEXT標簽處 - 8、拷貝尋址。將連續的寄存器值進行操作。
? ? ? ? STMIA R0! ,{R1-R7}:將R1~R7的數據保存到R0指向的地址中 - 9、堆棧尋址。將棧用于操作數保存或者導出的操作。
? ? ? ? STMFD SP!,{R1-R7,LR}:將R1~R7,LR入棧,SP更新。滿遞減堆棧
?
要介紹?ARM 寄存器之前我們要先了解一下 ARM 處理器的工作模式:
ARM 處理器有 7 種?工作模式(?使用級別?),以防造成對系統的破壞。
不同模式可以訪問的 寄存器 不同,可以運行的指令不同
(1)USR(10000):正常用戶模式,程序正常執行模式。
(2)FIQ(10001):快速中斷模式,以處理快速情況,支持高速數據傳輸或通道處理。
(3)IRQ(10010):外部中斷模式,普通中斷處理
(4)SVC(10011):操作系統保護模式(管理模式),即操作系統使用的特權模式(內核),處理軟件中斷swi? reset
(5)abt(10111):數據訪問中止模式,用于 虛擬存儲器 和 存儲器 保護
(6)und(11011):未定義指令終止模式,用于支持通過軟件仿真硬件的協處理器
(7)sys(11111):系統模式,用于運行特權級的操作系統任務( armv4 以上版本才具有)
?
注意:
- usr 是 普通模式(?即?用戶模式 ),其他 六種 是 特權模式,而除了usr 和 sys 模式以外的五種模式是異常模式。
- ARM 微處理器的運行模式可以通過軟件改變,也可以通過外部中斷或異常處理改變。大多數的應用程序運行在用戶模式下,當處理器運行在用戶模式下時,某些被保護的系統資源是不能被訪問的。除用戶模式以外,其余的所有6種模式稱之為非用戶模式,或特權模式(Privileged Modes);其中除去 用戶模式 和 系統模式 以外的 5 種又稱為 異常模式(Exception Modes),常用于處理中斷或異常,以及需要訪問受保護的系統資源等情況。
- ARM 處理器在每一種處理器模式下均有一組相應的寄存器與之對應。即在任意一種處理器模式下,可訪問的寄存器包括15個通用寄存器(R0~R14)、1?到?2 個狀態寄存器 和 程序計數器。在所有的寄存器中,有些是在7種處理器模式下共用的同一個物理寄存器,而有些寄存器則是在不同的處理器模式下有不同的物理寄存器。
?
ARM 處理器有 32位的ARM 和 16位的Thumb 兩種工作狀態。
- 在 32 位 ARM 狀態下執行 字對齊 的 ARM 指令,
? ? ? ? 當處理器執行在ARM狀態:
? ? ? ? 1)所有指令32bits寬
? ? ? ? 2)所有指令必須 word 對齊
? ? ? ? 3)所有 pc 值由 [31:2] 決定,bits[1:0] 未定義( 所以指令不能 halfword/byte對齊 )
- 在 16位 Thumb 狀態下,執行半字對齊的Thumb指令。
? ? ? ? 在 Thumb 狀態下,程序計數器 PC (Program Counter) 使用位[1]選擇另一個半字。
- ARM 指令和 THUMB指令的關系:
THUMB 指令是 ARM 指令的子集,可以相互調用,只要遵循一定的調用規則
Thumb 指令 與 ARM 指令 的時間效率和空間效率關系為:
????????存儲空間約為ARM代碼的60%~70%
????????指令數比ARM代碼多約30%~40%
????????存儲器為32位時ARM代碼比Thumb代碼快約40%
????????存儲器為16位時Thumb比ARM代碼快約40~50%
????????使用Thumb代碼,存儲器的功耗會降低約30%
注:當處理器處于Thumb狀態時發生異常(如IRQ、FIQ、Undef、Abort、SWI等),則異常處理返回時,自動切換到 Thumb 狀態。ARM 處理器總是 從 ARM 工作狀態開始執行的。因此,如果要在調試器重運行 Thumb 程序,必須為 該 Thumb 程序添加一個 ARM程序頭,然后再切換到Thumb工作狀態,調用該 Thumb程序。
在實際系統中,內核狀態需要經常的切換(Interworkong)來滿足系統性能要求。具體的切換是通過 Branch Exchange,即 BX 指令來實現的。指令格式為:
Thumb 工作狀態 BX Rn ARM 工作狀態 BX Rn其中 Rn 可以是寄存器 R0 ~ R15 中的任意一個。指令可以通過將寄存器Rn的內容,拷貝到程序計數器 PC 來完成在 4GB地址空間中的絕對跳轉,如果操作數寄存器的狀態位 Bit0 = 0,則進入 ARM 工作狀態;如果 Bit0 = 1,則進入 Thumb 工作狀態。
?
ARM 處理器在兩種工作狀態之間可以切換,切換不影響處理器的模式或寄存器的內容。
- (1) 當操作數寄存器的狀態位 ( 位[0] ) 為 1 時,執行 BX 指令進入 Thumb 狀態。如果處理器在 Thumb 狀態進入異常,則當異常處理 ( IRQ、FIQ、Undef、Abort 和 SWI ) 返回時,自動轉換到 Thumb 狀態。
- (2) 當操作數寄存器的狀態位 ( 位[0] ) 為 0 時,執行 BX 指令進入ARM狀態,處理器進行異常處理 ( IRQ、FIQ、Reset、Undef、Abort 和 SWI )。在此情況下,把PC放入異常模式鏈接寄存器中。從異常向量地址開始執行也可以進入ARM狀態。
?
在資料《 ARM Architecture Reference Manual 》在其中的 Programmers’Model 一章中,我們可以輕松的找到官方文檔對寄存器的說明,建議大家去看看官方的英文文檔,我將其中的重要內容簡單的總結一下。
?
ARM 框架文檔
圖:
31 個通用寄存器,6 個狀態寄存器 ( 1 個 cpsr,5 個 spsr)。
?
Arm 處理器總共有 37 個寄存器,其可以分為以下 2 類:
- 1.? 通用寄存器( 31?個)
? ? ? ? 1.? 不分組寄存器( R0 — R7 ),共 8?個。
? ? ? ? 2.? 分組寄存器( R8 — R14 )
? ? ? ? 3.? PC 指針( R15 ) - 2.? 程序狀態寄存器( 6個? )
? ? ? ? 1. ?CPSR( 1個 ) ? ?
? ? ? ? 2. ?SPSR( 5個 )
所謂 不分組 就是在七種模式下的任意一種模式都訪問同一個物理寄存器地址。就是不分組寄存器沒有特權模式,任意一種模式都可以使用未分組寄存器。
?
?
ARM?框架圖(?ARM?工作狀態寄存器?):
?
?
ARM 處理器 工作模式 下的 寄存器:
圖 3:
圖 4:
?
THUMB 狀態下的 寄存器 組織?
?
?
Thumb 與 ARM 狀態下的 寄存器 關系
圖:
?
ARM 狀態下 各模式 寄存器 小結
?
?
ARM?框架?的?寄存器 解析
下面將會結合上圖和上面列出的框架對寄存器進行解析:
未分組寄存器:R0 - R7? R15? cpsr,cpu 在任何模式下看到的 這幾個寄存器都是一樣的。在所有的運行模式下,未分組寄存器都指向同一個物理寄存器,他們未被系統用作特殊的用途,因此,在中斷或異常處理進行運行模式轉換時,由于不同的處理器運行模式均使用相同的物理寄存器,可能會造成寄存器中數據的破壞,這一點在進行程序設計時應引起注意。
分組寄存器 R8 - R14 在不同模式下看到的這幾個寄存器是不一樣的
分組寄存器R8~R12
?
寄存器功能說明
- R0 - R12???存取數據,臨時數據
- R13:sp 用于指向不同模式的棧頂。棧,每種模式都需要開辟一塊內存,用于在該模式下 函數調用,臨時分配的數據存放在此處。Stack Pointer (SP),棧指針寄存器,該寄存器始終保存著一個指向棧頂的值,值得注意的地方;
SP寄存器的Bit[1:0](最低兩位)始終為0,因此這個寄存器是按照字對齊的,也就是四個字節;M3有兩個堆棧指針,并且同一時刻只能使用其中的一個;
主堆棧指針(MSP/SP_main):復位后默認使用的堆棧指針寄存器,用于操作系統內核以及異常處理例程(包括中斷服務例程);
進程堆棧指針(PSP/SP_process):由用戶的應用程序代碼使用。
寄存器R13通常被用作堆棧指針寄存器,另外究竟使用哪個寄存器,由CPU的控制寄存器來決定;Handler mode :即系統發生異常(中斷等)的情況會進入該模式,通常使用SP_main;
Thread mode:用戶程序正常運行時處于該模式,可以選擇使用SP_main 或 SP_process;
CPU的Configuration Control Register,如下圖所示; - M3有兩個堆棧指針,并且同一時刻只能使用其中的一個;
- 主堆棧指針(MSP/SP_main):復位后默認使用的堆棧指針寄存器,用于操作系統內核以及異常處理例程(包括中斷服務例程);
- 進程堆棧指針(PSP/SP_process):由用戶的應用程序代碼使用。
- R14 : lr?程序跳轉的時候,返回到的地址就保存到此處
- R15 :pc 要執行的下一條指令地址,就存放在此處,每次指令執行完,就自動+4
- CPSR:程序狀態寄存器。程序執行的時候,有很多臨時標記位,結果是0 是否溢出,是否有借位,是否有 進位,當前cpu模式,
- SPSR:用于模式切換,將切換前的 cpsr 保存到 新的模式的 spsr,模式切換回去的時候,再將spsr的內容還原到cpsr。
?
?
1. 未分組寄存器 R0 ~ R7,共 8 個。在所有的運行模式下都使用同一個物理寄存器,它們未被系統用作特殊的用途。
2.?分組寄存器 R8 ~ R12,R13 ~ R14
? ? R8 ~ R12:(?總共10個 )
? ? ? ? 每次所訪問的物理寄存器與處理器當前的運行模式有關,R8~R12:每個寄存器對應兩個不同的物理寄存器
? ? ? ? 當使用fiq模式時,訪問寄存器R8_fiq~R12_fiq,當使用除fiq模式以外的其他模式時,訪問寄存器R8_usr~R12_usr。
????????其中 FIQ 模式有單獨的一組 R8 ~ R12,共5個;(??FIQ ( 快速中斷模式 )?時訪問寄存器 R8_fiq ~ R12_fiq )
????????另外 6 種模式共用一組 R8 ~ R12,共5個;(當使用除 FIQ 模式以外的其他模式時,訪問寄存器 R8 ~ R12)
? ? ? ? ? ? ? ? ?
? ? R13 ~ R14:(?總共12個 )
? ? ? ? 其中 USR 和 SYS 模式(表格的第一列)共用一組 R13 ~ R14 共2個,
? ? ? ? 另外 5 種模式下各有獨自的一組 R13 ~ R14,并采用以下記號來區分不同的物理寄存器,分別
? ? ?? ?為 fiq、irq、svc、abt、und。共10個。(?mode為以下幾種之一:usr、fiq、irq、svc、abt、und。 )? ? ? ??? ? ??
? ? ? ? i. R13 在 ARM 指令中常用作堆棧指針 SP
? ? ? ? ? ? 特別注意:由于每一種模式都有自己的 R13,所以我們在自己初始化的時候?一般都要初始化每種模式下的R13,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?使其指向該運行模式的??臻g。? ? ? ?
? ? ? ? ii. R14 稱為子程序鏈接寄存器 LR (Link Register)
? ? ? ? ? ? 有兩個特殊功能,一種是每一種模式下都可以用于 保存函數的返回地址,
?? ??? ??? ?另外就是異常處理后的返回地址,如中斷
?
3. PC 指針( R15 )
? ? R15 用作程序計數器 ( PC ),對應一個物理寄存器,由于 ARM 體系結構采用了多級流水線技術
? ? (不了解多級流水線的可以訪問這個博客:http://blog.csdn.net/abclixu123/article/details/7471822 )
? ? 對于 ARM 指令集而言,PC 總是指向當前指令的下兩條指令的地址,可以通過向 pc 賦值,來控制程序跳轉。
? ? 即 PC 的值為當前指令的地址值加8個字節。
?
4. CPSR (1?個?狀態寄存器。CPSR 表示:當前程序狀態寄存器 )
CPSR(當前程序狀態寄存器)
在官方文檔中我們可以找到
下面介紹其中幾個比較重要的位,其他位,大家可以參考官方手冊:
- 0 ~ 7? ? ? 控制
- 8 ~ 27? ? 保留
- 28 ~ 31? 條件標志
圖
圖
圖
- N:當兩個表示的有符號整數運算時,1表示運算結果為負數,0表示結果為正或零。
- Z:1表示運算的結果為零,0表示運算的結果不為零。對于CMP指令,1表示進行比較的兩個數大小相等。
- C:下面分四種情況討論C的設置方法:
? ? ? ? a)?加法運算(包括比較指令CMN):當運算產生了進位時(無符號數溢出),C=1,否則C=0。 ? ? ? ?
? ? ? ? b)?減法運算(包括比較指令CMP):當運算時產生了借位(無符號數溢出),C=0,否則C=1。 ? ? ? ?
? ? ? ? c)?對于包含移位操作的非加/減運算指令,C為移出值的最后一位。 ? ? ? ?
? ? ? ? d) 對于其他的非加/減運算指令,C的值通常不改變。 - V:下面分兩種情況討論V的設置方法
? ? ? ? a) 對于加/減法運算指令,當操作數和運算結果為二進制的補碼表示的帶符號數時,V=1表示符號位溢出。
? ? ? ? b) 對于其他的非加/減運算指令,C的值通常不改變。 - I:?1?表示禁止外部(硬件)中斷(IRQ)
- F:1?表示禁止快速中斷(FIQ)
- T:1 表示為 thumb 狀態。 0 為?ARM?狀態。
- M[4:0]:用來設置處理器的工作模式具體數據見本文開始的介紹。
?
5. SPSR (?5 個 備份狀態寄存器?)
SPSR(備份的程序狀態寄存器,或者叫 影子寄存器)
SPSR?除 usr、sys 外,對應用于異常保護的 CPSR 的備份,異常時,保存CPSR值,異常退出時,將該值恢復到CPSR,以保證程序的正常運行,每一中異常運行模式(除usr和sys)有各自的物理寄存器。
?
至此,共有 37 個寄存器:其中 31 個為通用寄存器,6 個位狀態寄存器。
37個寄存器是指 通用寄存器 和一些 狀態寄存器,這是 ARM 架構定義好的寄存器,事實上 ARMv7 已經不止這些寄存器了,37?個?寄存器是 ARMv6 以前的架構,典型的就是基于 ARMv4T 的 ARM9 有這么多寄存器,之后 ARM 引入了 TrustZone 以及虛擬化就又引入了一些 banked 寄存器?,F在到了 ARMv8,通用寄存器又不一樣了,具體可以看 ARM 的 spec。
下圖是在?Keil MDK?的調試環境下的寄存器列表,如下所示;
從圖中可知,
- 用戶 模式 和 系統 模式
? ? ? ? 使用相同的物理寄存器,R0-R15,CPSR,共17個物理寄存器; - FIQ 模式(快速中斷請求模式)中:
? ? ? ? R0-R7,R15,CPSR 是 和 用戶模式 相同的物理寄存器,R8-R14是FIQ模式專有的; - IRQ 模式(中斷請求模式)中:
? ? ? ? R0-R12,R15,CPSR 和 用戶模式 共用相同的物理寄存器,R13,R14,SPSR 是 IRQ 模式專有的 - SVC 模式(操作系統保護模式)中:
? ? ? ? R0-R12,R15,CPSR 和 用戶模式 共用相同的物理寄存器,R13,R14,SPSR 是 SVC 模式專有的 - Undef 模式(未定義模式)中:
? ? ? ? R0-R12,R15,CPSR 和 用戶模式 共用相同的物理寄存器,R13,R14,SPSR 是 Undef 模式專有的 - Abort 模式(終止模式)中:
? ? ? ? R0-R12,R15,CPSR 和 用戶模式 共用相同的物理寄存器,R13,R14,SPSR 是 Abort 模式專有的
注:R13:寄存器 R13 通常用做堆棧指針SP。
R14:link return 寄存器,在子程序調用和異常發生時保存返回地址。(保存調用子函數的返回地址,和中斷的返回地址)
R15:寄存器R15被用做程序計數器,也稱為PC。其值等于當前執行的指令的地址+8(因為在取址和執行之間多了一個譯碼的階段)。PC總是指向正在運行的后兩條指令地址,即是當前執行指令的地址+8.
CPSR:ARM 的狀態寄存器
SPSR:CPSR 的備份寄存器,(?或者?影子寄存器 )
ARM 所有工作模式下都可以訪問程序狀態寄存器 CPSR。CPSR 包含 條件標志位、中斷控制位、當前處理器模式 以及其他狀態和控制信息。CPSR 在每種異常模式下都有一個對應的物理寄存器 ---- 程序狀態保存寄存器 SPSR。當異常發生的時候,SPSR用于保存 CPSR 的值,以便異常返回后恢復異常發生時的工作狀態。
CPSR 狀態寄存器的示意圖:
?
r0 - r3????用作傳入函數參數,傳出函數返回值。在子程序調用之間,可以將 r0-r3 用于任何用途。
? ? ? ? ? ? 被調用函數在返回之前不必恢復 r0-r3。如果調用函數需要再次使用 r0-r3 的內容,則它必須保留這些內容。
r4 - r11? ?被用來存放函數的局部變量。如果被調用函數使用了這些寄存器,它在返回之前必須恢復這些寄存器的值。
r12????????是內部調用暫時寄存器 ip。它在過程鏈接膠合代碼(例如,交互操作膠合代碼)中用于此角色。
? ? ? ? ? ? ?在過程調用之間,可以將它用于任何用途。被調用函數在返回之前不必恢復 r12。
13????????是棧指針 sp。它不能用于任何其它用途。sp 中存放的值在退出被調用函數時必須與進入時的值相同。
r14????????是鏈接寄存器 lr。如果您保存了返回地址,則可以在調用之間將 r14 用于其它用途,程序返回時要恢復
r15????????是程序計數器 PC。它不能用于任何其它用途。
注意:在中斷程序中,所有的寄存器都必須保護,編譯器會自動保護 R4~R11
?
| R0~R3 | A1~A4 | 參數寄存器,在調用函數時,用來存放前4個函數參數和返回值,多出的存堆棧中。(易失的) |
| R4~R8 | V1~V5 | 通用變量寄存器。(非易失性的) |
| R9 | V6 sb | 通用變量寄存器。在與讀/寫位置無關的編譯情況下,用作基址寄存器。(非易失性的) |
| R10 | V7 sl | 通用變量寄存器。在使用堆棧邊界檢查的編譯情況下,R10保存堆棧邊界的地址。(非易失性的) |
| R11 | V8 fp | 通用變量寄存器。在使用結構指針的情況下,必須保存這個寄存器中調用函數的變量值。(非易失性的) |
| R12 | Ip | 通用臨時過渡寄存器(易失的) |
| R13 | sp | 堆棧指針,指向滿遞減堆棧 |
| R14 | lr | 鏈接寄存器,在函數調用時用以保存返回地址 |
| R15 | pc | 程序計數器 |
注意:帶四個或更少的參數的函數,要比多于四個參數的效率到很多,多于四個,參數要存放在堆棧中,調用函數,須通過堆棧。
?
?LR
Link Register (LR),連接寄存器,即在調用子程序的時候,可以將當前的程序地址存入LR寄存器,這樣就方便了函數的返回;
通常LR會配合BL和BLX來使用,下面簡單舉一個函數調用的例子;
5 PC
Program Counter(PC),程序計數寄存器,這個寄存器的Bit [0]始終為0,所以指令的對齊方式是按照四個字節(一個字)或者兩個字節(半字)來對齊的。
LDR LR, =func01LDR PC, =func03B .func01MOV R5, #05BX LRfunc02MOV R6, #06BX LRfunc03MOV R7, #07MOV R8, #08 BX LR這個程序程序為直接將func03標簽的地址裝載到PC寄存器,因此程序會直接跳轉到func03,因為之前將func01裝載到LR寄存器,因此最終會調用函數func01。
?
ARM 64 經常用到的匯編指令
MOV X1,X0 ;將寄存器X0的值傳送到寄存器X1 ADD X0,X1,X2 ;寄存器X1和X2的值相加后傳送到X0 SUB X0,X1,X2 ;寄存器X1和X2的值相減后傳送到X0 AND X0,X0,#0xF ; X0的值與0xF相位與后的值傳送到X0 ORR X0,X0,#9 ; X0的值與9相位或后的值傳送到X0 EOR X0,X0,#0xF ; X0的值與0xF相異或后的值傳送到X0 LDR X5,[X6,#0x08] ;X6寄存器加0x08的和的地址值內的數據傳送到X5 STR X0, [SP, #0x8] ;X0寄存器的數據傳送到SP+0x8地址值指向的存儲空間 STP x29, x30, [sp, #0x10] ;入棧指令 LDP x29, x30, [sp, #0x10] ;出棧指令 CBZ ;比較(Compare),如果結果為零(Zero)就轉移(只能跳到后面的指令) CBNZ ;比較,如果結果非零(Non Zero)就轉移(只能跳到后面的指令) CMP ;比較指令,相當于SUBS,影響程序狀態寄存器CPSR B/BL ;絕對跳轉#imm, 返回地址保存到LR(X30) RET ;子程序返回指令,返回地址默認保存在LR(X30)其中?MOV?指令只能用于寄存器之間傳值,寄存器和內存之間傳值通過?LDR?和?STR
ARM指令又一個重要特點就是所有指令都是帶有條件的,就是說匯編中就需要根據狀態寄存器中的一些狀態來控制分支的執行。例如:
圖中指令 b 是跳轉指令,后邊跟著跳轉的條件 eq,那么這個 eq 是什么意思呢?
eq英文單詞equal的意思,注意這里equal并不是c語言當中==的意思,這里根據狀態寄存器的條件標志位Z來判斷,如果Z = 1則eq成立,如果Z = 0則eq不成立,就是NE。
?
ARM 指令包含4位的條件碼列表:
| 0000 | EQ | Z=1 | 相等 |
| 0001 | NE(Not Equal) | Z=0 | 不相等 |
| 0010 | CS/HS(Carry Set/High or Same) | C=1 | 無符號數大于或等于 |
| 0011 | CC/LO(Carry Clear/LOwer) | C=0 | 無符號數小于 |
| 0100 | MI(MInus) | N=1 | 負數 |
| 0101 | PL(PLus) | N=0 | 正數或零 |
| 0110 | VS(oVerflow set) | V=1 | 溢出 |
| 0111 | VC(oVerflow clear) | V=0 | 沒有溢出 |
| 1000 | HI(HIgh) | C=1,Z=0 | 無符號數大于 |
| 1001 | LS(Lower or Same) | C=0,Z=1 | 無符號數小于或等于 |
| 1010 | GE(Greater or Equal) | N=V | 有符號數大于或等于 |
| 1011 | LT(Less Than) | N!=V | 有符號數小于 |
| 1100 | GT(Greater Than) | Z=0,N=V | 有符號數大于 |
| 1101 | LE(Less or Equal) | Z=1,N!=V | 有符號數小于或等于 |
| 1110 | AL | 任何 | 無條件執行(默認) |
| 1111 | NV | 任何 | 從不執行 |
ARM指令所有指令都是帶有條件的,默認是AL即無條件執行,當指令帶有默認條件時不需要明確寫出。
?
?
總結
以上是生活随笔為你收集整理的ARM 寄存器 详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SpringBoot 自带工具类~Str
- 下一篇: 安卓逆向_5 --- Android 学