###### tags: `組合語言`
# 組合語言共筆 1 : ARM 暫存器架構 & 執行模式
## ARM 執行模式
- **(user)** User mode : 使用者模式
- **(system)** System mode : 執行作業系統程式碼
- **(fiq)** FIQ mode : 快速中斷模式,用於高速傳遞資料
- **(irq)** IRQ mode : 中斷模式,普通中斷處理
- **(svc)** SVC mode : 管理(監視)模式,系統復位、軟中斷
- **(abt)** ABT mode : (Abort mode),資料訪問終止模式,用於保護記憶體
- **(und)** Undefined mode : 指令未定義中止,處理未知指令情況
<br>
## ARM Registers 暫存器
- 用途 : 用來暫存指令、數據和位址...

:::warning
### 1. 通用暫存器 :
> r0 - r14
> 是在所有執行**模式都是可以存取的暫存器**
> - **r0 - r7 通用暫存器,在所有模式都會被使用**
> - **r13 : 堆疊暫存器(SP/Stack Pointer) : 指向目前處理器模式的堆疊的堆疊頂端**
> - **r14 : 連結暫存器 (LR/Link Register) : 存放(副)函數返回的位置**
> - **r15 : 程式計數器 (PC/ Program Counter) : 儲存、指向下一道要執行的指令的位置**
>
> // 補充 : r12 也稱作 [ IP ] ( The Intra-Procedure-call scratch register )
> // 補充 : r11 也稱作 [ FP ] ( frame pointer )
> // 詳細解說 - [ARM FP 介紹](https://read01.com/M0onoa.html#.Y2p9mMtBxD8)
=========================================
>
> 在不同的模式中,也會有**獨立的 SP、LR 暫存器**,
> 使 Arm 的模式可以快速切換
> - r13_svc - r14_svc
> - r13_abt - r14_abt
> - r13_irq - r14_irq
> - r13_undef - r14_undef
>
=========================================
>
> 當切換到 "**快速中斷模式**" 時
> - r8_fiq - r14_fiq 會取代 r_8 - r_14
> 有利於縮短快速中斷的時間
>
> 
:::
:::warning
### 2. 狀態暫存器
用來存取狀態資訊,有分為兩種狀態暫存器
- **CPSR** : 儲存 "flag bits"(條件旗標)、中斷位元、紀錄Arm模式...
- **SPSR** : 當異常出現時,用來儲存 CPSR 值,
以便異常處理結束後返璇工作狀態

<br>
- **N ( negative )** : 此 bit 用來表示當前指令運算的結果,N=1 結果為負數
N=0 結果為正數 or 零
- **Z ( zero )** : 表示當前指令運算的結果是否為 0,Z=1 表示結果為 0
Z=0 : 表示結果不為 0
- **C ( Carry )** :
- 在加法指令中,當結果產生進位,C=1,表示無符號發生溢位(overflow)
其他情況 C=0
- 在減法指令中﹑運算發生借位 C=0,表示無進位,其他情況 C=1
- **V ( overflow )** : 當進行加減運算發生溢位 Overflow,V=1,[算數溢位](https://zh.wikipedia.org/wiki/%E7%AE%97%E8%A1%93%E6%BA%A2%E5%87%BA)
<br>
- **M[4:0] (Mode)** : 表示當前模式
:::
<br>
## Reference
- [ARM 基礎——執行模式,暫存器,指令系統,彙編,異常中斷處理](https://www.gushiciku.cn/pl/p3Fm/zh-tw)
- [ARM 處理器的結構](http://sp1.wikidot.com/arm)
- [暫存器-維基百科](https://zh.wikipedia.org/zh-tw/%E5%AF%84%E5%AD%98%E5%99%A8)
- [[MASM學習筆記]第一課:數字系統與暫存器](https://it-easy.tw/masm-class-1/2/)
- [附錄三 80x86 及 80x87 暫存器
](https://wanker742126.neocities.org/new/dos_asm/ap03.html)