###### tags: `組合語言`
# 組合語言共筆 13 : Operand 2
## 1. 簡介
Operand 2 為組合語言中,方便使用者對指令做更多操作的元素
:::danger
Operand 2 通常會被放在指令的最後一項
```
<運算子>{<condi>}{s|S} Rd Rn Operand2
- {s|S} : 修飾詞,用以更動 CPSR 的 Flags
```
```assembly=
ex :
ADD r0, r1, r2, lsl#1 // r0 := r1 + (r2 * 2)
```
:::
---
<br>
## 2. 十一種 Operand 2 格式
| 格式 | 用途 | 例子 |
| -------- | -------- | -------- |
| `#<立即值>` | 直接使用數值,範圍為 [0-255] * $2^{2n}$ | `#8` |
| `Rm ` | 利用存在 rm 中的資料作計算 | `r0` |
| `Rm, <shift_op> #<立即值> ` | 對rm中的資料做 shift or Rotate,並用立即值設定 shift 量 | `r2,lsl #1` |
| `Rm, <shift_op> Rs` | 對rm中的資料做 shift or Rotate,用 Rs 資料設定 shift 量 |`r2,lsl r3` |
| `Rm rxx ` | Rm 向右旋轉一位,並將多出的一位存到 C (carry),將原 C 資料 Rotate 到 Rm | `r0 rxx` |
- 因為 <shift_op> 有四種,所以 3,4 格式各算 4 種
```asm=
ex :
- ADD r0, r1, #10 // 第一種格式
- ADD r0, r1, r2 // 第二種格式
- ADD r0, r1, r2, lsl #2 // 第三種格式
- ADD r0, r1, r2, lsl r3 // 第四種格式
- ADD r0, r1, r2, rxx // rxx
```
---
<br>
## 3. Shifting Operator 介紹
### 1. Shift 簡介
```
Shift : 就是將二進位資料往右或左,進行移位
ex : 11000 => 往右 shift 1 位 => 01100
```
### 2. Rotate 簡介
```
Rotate : 此 shift 方法有點像坦克履帶,rotate 出的位元,會補在另一端
ex : 10011 => 往右 rotate 1 位 => 11001
```
### 3. 代表符號
| <shift_op> | 用途 | 例子 |
| -------- | -------- | -------- |
| lsl | 會向左 Shift | `lsl #1` |
| lsr | 會向右 Shift | `lsr #2 ` |
| asr | 算數右移 ( 當符號位元為 1 時,shift 填入 1,反之 0 ) | `asr #1 ` |
| ror | 向右 Rotate |`ror #1` |
| rxx | 向右 Rotate,會將移出的值存到 C (carry),將原 C 值 rotate 回去 | `rxx #1` |
- rxx 沒包含在 <shift_op> 中,但功能相似
---
<br>
## 4. Load/Store 定址模式 v.s Operand 2 差別
Load/Store 定址模式 和 Operand 2 因為分開來講,但是圖看起來都相同
所以容易搞混,在這邊紀錄一下兩者之間的區別。
- **Load/Store** 定址模式 : 指的是對 "Load/Store 對象的記憶體位址進行操作的方法",
更注重是更動位址的順序,當然在進行位置移動時,會用到 Operand 2 來做 Shift
- **Operand 2** : 主要是指對位址做 Shift 的不同操作,像是使用立即值還是 Register
或是要做旋轉...
- **差別** : Load/Store 定址模式是用移動位址順序和不同移動方式(+ or shift)來分類,
Operand 2 不考慮順序,除不同移動方式還會考慮不同的 Shift 方法
- **數量** : Load/Store 定址模式總共有 10 種,Operand 2 格式有 11 種