320 likes | 448 Views
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. 暫存器偏移定址. 進行偏移動作
E N D
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 ; R2 的值左移3 位,結果放入R0, 即R0 = R2 * 8
暫存器間接定址 • 指令中的位址碼為通用暫存器編號 • 運算元儲存在暫存器指定位址的儲存單元中 • 例題: 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 指令集 • 指令格式 • 記憶體存取指令 • 資料處理指令 • 跳躍指令
基本格式 • 第2 個運算元 • 條件碼
第2 個運算元 • 指令格式 <opcode>{<cond>}{S}<Rd>,<Rn> {,<opcode2>} <opcode>是指令助記符號 {<cond>}為指令執行條件
第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=R1MVN 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+R2EOR 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×R3UMLAL 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 的最低位元 來切換處理器狀態