###### 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 種