【正文】
1 嵌入式系統(tǒng)概論 — 基于 32位微處理器與實(shí)時(shí)操作系統(tǒng) 第四講 ARM指令集與編程 北京航空航天大學(xué) 機(jī)器人研究所 魏洪興 2 指令長(zhǎng)度 ? 指令集可以是以下任一種 ? 32 bits 長(zhǎng) (ARM狀態(tài) ) ? 16 bits 長(zhǎng) (Thumb 狀態(tài) ) ? ARM7TDMI 支持 3種數(shù)據(jù)類(lèi)型 ? 字節(jié) (8bit) ? 半字 (16bit) ? 字 (32bit) ? 字必須被排成 4個(gè)字節(jié)邊界對(duì)齊 ,半字必須被排列成 2個(gè)字節(jié)邊界對(duì)齊 3 ARM 指令集的特點(diǎn) ? 向后兼容:新版本增加指令,并保持指令向后兼容; ? Loadstore 結(jié)構(gòu) * ? load/store –從存儲(chǔ)器中讀某個(gè)值 ,操作完后再將其放回存儲(chǔ)器中 ? 只對(duì)存放在寄存器的數(shù)據(jù)進(jìn)行處理; ? 對(duì)于存儲(chǔ)器中的數(shù)據(jù),只能使用 load/store指令進(jìn)行存取 4 指令格式 ? 指令格式 ? 3 地址指令格式 ? 在 ARM狀態(tài)中使用 ? 例 指令語(yǔ)法 目標(biāo)寄存器(Rd) 源寄存器 1(Rn) 源寄存器 2(Rm) ADD r3,r1,r2 r3 r1 r2 5 ARM 指令分類(lèi) ? 數(shù)據(jù)處理指令 – 使用和改變寄存器的值 ? 數(shù)據(jù)傳送指令 – 把存儲(chǔ)器的值拷貝到寄存器中 (load) or 把寄存器中的值拷貝到存儲(chǔ)器中 (store) ? 控制流指令 ? 分支 ? 分支和鏈接 , 保存返回的地址 ,以恢復(fù)最先的次序 ? 軟件中斷指令 ? 程序狀態(tài)寄存器指令 ? 協(xié)處理器指令 6 ARM指令編碼格式 ? 說(shuō)明 ? Cond ? 指令執(zhí)行的條件編碼 ? Opcode ? 指令操作符編碼 ? S ? 決定指令的操作是否影響 CPSR的值 ? Rd ? 操作目標(biāo)寄存器編碼 ? Rn ? 包含第一操作數(shù)的寄存器編碼 ? Shifter_operand ? 表示第二操作數(shù) cond 001 opcode s Rn Rd Shifter_operand 31 28 27 25 24 21 20 19 16 15 12 11 8 7 0 7 ARM指令集 8 數(shù)據(jù)處理指令 1 ? 數(shù)據(jù)處理指令的類(lèi)別 ? 算術(shù)操作 ? 按位邏輯操作 ? 寄存器移位操作 ? 比較操作 ? 操作數(shù) : 32bits 寬 。 有 3種指定操作數(shù)的方式 ? 來(lái)自寄存器 ? 第二操作數(shù)可以是常數(shù) (立即數(shù) ) ? 移位寄存器操作數(shù) ? 結(jié)果 : 32bits 寬 , 放在寄存器中 ? 長(zhǎng)乘法產(chǎn)生 64位結(jié)果 9 數(shù)據(jù)處理指令 – 2* cond 0 0 operand 2 opcode S Rn Rd 31 28 27 26 25 24 21 20 19 16 15 12 1 1 0 目的寄存器 第一操作寄存器 設(shè) 置操作 碼 算 術(shù) /邏輯 功能 8bit 立即 數(shù) 1 25 1 1 8 7 0 rot Rm 1 1 7 6 5 4 3 0 shift Rm 0 25 1 1 8 7 6 5 4 3 0 Rs Sh 0 1 0 Sh immediate alignment immediate shift length shift type second operand register 移位寄存器 長(zhǎng) 度 10 數(shù)據(jù)處理指令 3 O p c o d e[ 2 4 : 2 1 ]M n e m o n i c M e a n i n g E f f e c t0 0 0 0 A N D L o g i c a l b i t w i s e A N D R d : = R n A N D O p 20 0 0 1 E O R L o g i c a l b i t w i s e e x c l u s i v e O R R d : = R n E O R O p 20 0 1 0 S U B S u b t r a c t R d : = R n O p 20 0 1 1 R S B R e v e r s e s u b t r a c t R d : = O p 2 R n0 1 0 0 A D D A d d R d : = R n + O p 20 1 0 1 A D C A d d w i t h c a r r y R d : = R n + O p 2 + C0 1 1 0 S B C S u b t r a c t w i t h c a r r y R d : = R n O p 2 + C 10 1 1 1 R S C R e v e r s e s u b t r a c t w i t h c a r r y R d : = O p 2 R n + C 11 0 0 0 T S T T e s t S c c o n R n A N D O p 21 0 0 1 T E Q T e s t e q u i v a l e n c e S c c o n R n E O R O p 21 0 1 0 C M P C o m p a r e S c c o n R n O p 21 0 1 1 C M N C o m p a r e n e g a t e d S c c o n R n + O p 21 1 0 0 O R R L o g i c a l b i t w i s e O R R d : = R n O R O p 21 1 0 1 M O V M o v e R d : = O p 21 1 1 0 B I C B i t c l e a r R d : = R n A N D N O T O p 21 1 1 1 M V N M o v e n e g a t e d R d : = N O T O p 211 數(shù)據(jù)處理指令 4 ADD r0, r1, r2 r0 := r1 + r2 ADC r0, r1, r2 r0 := r1 + r2 + C SUB r0, r1, r2 r0 := r1 r2 SBC r0, r1, r2 r0 := r1 r2 + C 1 RSB r0, r1, r2 r0 := r2 – r1 RSC r0, r1, r2 r0 := r2 – r1 + C 1 算術(shù)操作 按位邏輯操作 AND r0, r1, r2 r0 := r1 and r2 ORR r0, r1, r2 r0 := r1 or r2 EOR r0, r1, r2 r0 := r1 xor r2 BIC r0, r1, r2 r0 := r1 and (not) r2 寄存器移位 MOV r0, r2 r0 := r2 MVN r0, r2 r0 := not r2 比較操作 CMP r1, r2 set cc on r1 r2 CMN r1, r2 set cc on r1 + r2 TST r1, r2 set cc on r1 and r2 TEQ r1, r2 set cc on r1 xor r2 12 數(shù)據(jù)處理指令 MOV ? MOV指令是把一個(gè)數(shù) N送到目標(biāo)寄存器中, N可以是寄存器,也可以是立即數(shù)。 ? MOV指令語(yǔ)法: 〈 指令 〉 {〈 cond} {S} Rd, N 例: PRE r0= 5 , r2=6 MOV r0, r2 POST r0=6 ,r2=6 MOV r0, r2 r0 := r2 MVN r0, r2 r0 := not r2 13 桶形移位器 ALU 桶形移位器 Rd 結(jié)果 N 預(yù)處理 未預(yù)處理 Rm Rn 14 桶形移位器的使用 ? PRE r0=8, r2=5 ? MOV r0 ,r2, LSL 2(邏輯左移兩位: r22=r5*4) ? POST r0=20, r2=5 15 數(shù)據(jù)處理指令 ? 移位操作 ?在任何數(shù)據(jù)處理指令中 ,第二個(gè)寄存器操作數(shù)可以有應(yīng)用該操作數(shù)的移位操作 . ?邏輯移位 ?LSL:邏輯左移 ?字的最小位空位清零 ?LSR:邏輯右移字的最大位空位清零 . 16 桶形移位器操作 ? LSL:邏輯左移( Logical Shift Left)。寄存器中字的低端空出的位補(bǔ) 0。 ? LSR:邏輯右移( Logical Shift Right)。寄存器中字的高端空出的位補(bǔ) 0。 ? ASR:算術(shù)右移( Arithmetic Shift Right)。算術(shù)移位的對(duì)象是帶符號(hào)數(shù),在移位過(guò)程中必須保持操作數(shù)的符號(hào)不變。若源操作數(shù)為正數(shù),則字的高端空出的位補(bǔ) 0。若源操作數(shù)為負(fù)數(shù),則字的高端空出的位補(bǔ) 1。 ? ROR:循環(huán)右移( Rotate Right)。從字的最低端移出的位填入字的高端空出的位。 ? RRX:擴(kuò)展為 1的循環(huán)右移( Rotate Right Extended by 1 place)。操作數(shù)右移一位,空位(位 [31])用原 C標(biāo)志填充。 17 數(shù)據(jù)處理指令 7 ? 移位操作 (cont’d) ?算術(shù)移位 ?ASR:算術(shù)右移 ?ASL:算術(shù)左移 ?循環(huán)移位 : ROR, RRX 18 數(shù)據(jù)處理指令 ? 立即數(shù)操作 : ? 移位寄存器操作數(shù) ? 第二個(gè)操作數(shù)在與第一個(gè)操作數(shù)合成之前 ,是服從于移位操作的 . ADD r3, r2, r1, LSL 3 r3 := r2 + 8 x r1 ADD r5, r5, r3, LSL r2 r5 := r5 + 2r2 x r3 ADD r3, r3, 3 r3 := r3 + 3 AND r8, r7, amp。ff r8 := r7[7:0], amp。 for hex 19 條件碼標(biāo)志 ? 任何數(shù)據(jù)處理指令都可以設(shè)置條件碼 (N, Z, V, and C) ? 適用于除比較操作外的所有數(shù)據(jù)處理指令 ? 特殊的請(qǐng)求必須在匯編語(yǔ)言中實(shí)現(xiàn) ,這種請(qǐng)求是通過(guò)把 ” S”增加到選擇代碼中指定的 ? 算術(shù)操作設(shè)置所有的標(biāo)志位 (N, Z, C, and V) ? 邏輯和移位操作設(shè)置 N and Z ? 當(dāng)無(wú)移位操作時(shí) ,保存 V和 C,或根據(jù)移位操作設(shè)置 ADDS r2, r2, r0 。 carry out to C 20 ? ARM指令可以通過(guò)添加適當(dāng)?shù)臈l件碼 后綴 來(lái)達(dá)到條件執(zhí)行的目的。 ? 這樣可以提高代碼密度,減少分支跳轉(zhuǎn)指令數(shù)目,提高性能。 CMP r3,0 CMP r3,0 BEQ skip ADDNE r0,r1,r2 ADD r0,r1,r2 skip ? 默認(rèn)情況下,數(shù)據(jù)處理指令不影響 程序狀態(tài)寄存器 的條件碼標(biāo)志位,但可以選擇通過(guò)添加“ S‖來(lái)影響標(biāo)志位。 CMP不需要增加 “ S‖就可改變相應(yīng)的標(biāo)志位。 loop … SUBS r1,r1,1 BNE loop 條件執(zhí)行及標(biāo)志位 ** 如果 Z標(biāo)志清零則跳轉(zhuǎn) R1減 1,并設(shè)置標(biāo)志位 21 Condition Codes 不等于( Not equal) 無(wú)符號(hào)的大于或等于 無(wú)符號(hào)的小于 負(fù)數(shù)( Minus) 等于( Equal) 溢出( Overflow) 沒(méi)溢出 無(wú)符號(hào)的大于 無(wú)符號(hào)的小于或大于 正數(shù)或零 小于( Less Than) 大于( Greater Than) 小于等于 總是執(zhí)行( Always) 大于等于 EQ NE CS/HS CC/LO PL VS HI LS GE LT GT LE AL MI VC Suffix 描述 Z=0 C=1 C=0 Z=1 測(cè)試的標(biāo)志位 N=1 N=0 V=1 V=0 C=1 amp。 Z=0 C=0 or Z=1 N=V N!=V Z=0 amp。 N=V Z=1 or N=!V ? 下表為所有可能的條件碼: ? 注意 :AL為默認(rèn)狀態(tài),不需要單獨(dú)指出