ARM處理器 定址方式
寄存器定址 直接由暫存器取出值操作 指令中的位址為暫存器編號 例題: MOV R1,R2 ; R2 -> R1 SUB R0,R1,R2 ; R1 - R2 -> R0
立即定址 指令碼是 指令 也是 運算元 取出指令即可做運算 “#”後的值為立即值,16 進制數值時以“0x”表示 例題: SUBS R0,R0,#1 ; R0 – 1 -> R0 MOV R0,#0xff00 ; 0xff00 -> R0
暫存器偏移定址 進行偏移動作 先 偏移 後 作運算 第2 個運算元在與第1 個運算元結合之前 例題: MOV R0,R2,LSL #3 ;
暫存器間接定址 指令中的位址碼為通用暫存器編號 運算元儲存在暫存器指定位址的儲存單元中 例題: LDR R1,[R2] ; 將R2 中的數值作為位址, 取出位址中的資料儲存在R1 中
基址定址 暫存器的內容與指令中給出的偏移量相加 常用於查表,陣列操作,功能指令暫存器存取等 例題: LDR R2,[R3,#0x0F] ; 將R3 中的數值加0x0F 作為位址, 將此位址的數值儲存在R2 中
多暫存器定址 一次可以傳多個暫存器值 順序由小到大的順序排列,連續的暫存器可用“-”連接,否則,用“,”分隔書寫 例題: LDMIA R1!,{R2-R7,R12} ; 將R1 中的資料讀到R2-R7, R12, R1 自動加1
堆疊定址 特定順序進行存取的儲存區 例題: STMFD SP!,{R1-R7,LR} ; 將R1~R7,LR 存入
區塊複製定址 將資料整段複製 記憶體的某一位置複製到另一位置 例題: STMIA R0!,{R1-R7} ;將R1~R7 的資料儲存到記憶體中,記憶體指標在儲存第一 個值之後增加
相對定址 指令中的位址碼欄位作為偏移量 兩者相加後得到的位址即為運算元的有效位址 例題: BL ROUTE1 ; 調整到ROUTE1 副程式 BEQ LOOP ; 條件跳躍到LOOP 旗標處 … LOOP MOV R2,#2 ROUTE1
ARM 指令集
ARM 指令集 指令格式 記憶體存取指令 資料處理指令 跳躍指令
基本格式 第2 個運算元 條件碼
第2 個運算元 指令格式 <opcode>{<cond>}{S}<Rd>,<Rn>
第2 個運算元 靈活的使用第2 個運算元能提高代碼效率 基本運算元 #immed_8r Rm Rm,shift 條件碼
第2 個運算元#immed_8r 常數是由一個8 位的常數 例題: ND R1,R2,#0x0F ; R2 與0x0F作運算,結果儲存在R1
第2 個運算元Rm 算元即為暫存器的數值 例題: SUB R1,R1,R2 ;R1-R2=>R1
第2 個運算元Rm,shift 暫存器的移位結果作為運算元 RM 值不變 ASR #n 算術右移n 位(1≤n≤32) LSL #n 邏輯左移n 位元(1≤n≤31) 例題: ADD R1,R1,R1,LSL #3 ; R1=R1*9
條件碼 相等、不相等(EQ、 NE ) 無符號數大於或等於、無符號數小於(CS/HS 、CC/LO ) 負數、正數或零(MI 、PL ) 溢出、沒有溢出(VS、 VC )
條件碼 無符號數大於、 無符號數小於或等於(HI、LS ) 帶符號數大於或等於、 帶符號數小於(GE、 LT ) 帶符號數大於、 帶符號數小於或等於(GT、 LE ) 無條件執行(AL )
條件碼 例題: CMP R0,R1 ;R0 與R1 比較 ADDHI R0,R0,#1 ;若R0>R1,則R0=R0+1 ADDLS R1,R1,#1 ;若R0<=R1,則R1=R1+1
ARM 記憶體存取指令 LDR LDM SWP
ARM 記憶體存取指令LDR 記憶體中讀取資料放入暫存器 格式: LDR{cond} {T} Rd, <地址> ; 載入指定位址上的資料(字),放入Rd 中 例題: LDR R2,[R5] ; 載入R5 指定位址上的資料(字), 放入R2 中
ARM 記憶體存取指令LDM 為載入多個暫存器 格式: LDM{cond}<模式> Rn{!},reglist{^} 例題: LDMIA R0!,{R3-R9} ; 載入R0 指向位址上的多字資料, 儲存到R3~R9 中,R0 值更新
ARM 記憶體存取指令SWP 將一個記憶體單元(暫存器Rn 中)讀取到一個暫存器Rd 中,同時將另一個暫存器Rm 寫入到該單元中 格式: SWP{cond}{B} Rd,Rm,[Rn] B 參數 ;Rd 從記憶體載入到的暫存 器;Rm 儲存到記憶體中
ARM 記憶體存取指令SWP 例題: SWP R1,R1,[R0] ; 將R1 的內容與R0 指向的儲存單元 的內容進行交換
ARM 資料處理指令 資料傳送指令 算術邏輯運算指令 比較指令 乘法指令
資料傳送指令 MOV、MVN 格式: MOV{cond}{S} Rd,operand2 MVN{cond}{S} Rd,operand2 例題: MOV R0,R1 ;R0=R1 MVN R1,R2 ;將R2 取反,結果存到R1
算術邏輯運算指令 ADD、SUB 、RSB 、AND 、ORR 格式: ADD{cond}{S} Rd,Rn,operand2 ORR{cond}{S} Rd,Rn,operand2 例題: ADD R1,R1,R2 ;R1=R1+R2 EOR R2,R1,R0 ;R2=R1^R0
比較指令 CMP、CMN、TST、TEQ 格式: CMP{cond} Rn,operand2 TST {cond} Rn,operand2 例題: CMP R1,R2 ; R1 與R2 比較,設定相關旗標位元 TST R0,#0x01 ; 判斷R0 的最低位是否為0
乘法指令 MUL 、MLA 格式: MUL{cond}{S} Rd,Rm,Rs MLA{cond}{S} Rd,Rm,Rs,Rn 例題: MUL R1,R2,R3 ;R1=R2×R3 UMLAL R0,R1,R5,R8 ; (R1,R0)=R5×R8+(R1,R0)
跳躍指令 B(跳躍 )、BL(帶鏈結的跳躍 )、BX(分支與轉換的跳躍 ) 格式: B{cond} label 例題: B WAITA ;跳躍到WAITA 標號處 BL DELAY ; 副程式使用 BX R0 ;跳躍到R0,依據R0 的最低位元 來切換處理器狀態