【正文】
22 條件執(zhí)行示例 ? 一系列的指令都使用條件指令 if (a==0) func(1)。 CMP r0,0 MOVEQ r0,1。把 func()函數(shù)的參數(shù)賦給 r0 BLEQ func ? 置標(biāo)志位,再使用不同的條件碼 if (a==0) x=0 。r0:a,r1:x if (a0) x=1。 CMP r0,0 MOVEQ r1,0 MOVGT r1,1 ? 使用條件比較指令 if (a==4 || a==10) x=0。 CMP r0,4 CMPNE r0,10 MOVEQ r1,0 23 條件執(zhí)行 ? 所有的 ARM指令都可以 條 件 執(zhí) 行 ? 指令的 執(zhí) 行 與 否取 決 于 CPSR寄存器的 N, Z, C and V標(biāo) 志位 ? 所有的 Thumb指令都可以解 壓 成全部 條 件指令 ? Condition Field in instruction ? 0000 = EQ Z set (equal) ? 0001 = NE Z clear (not equal) ? 0010 = CS C set (unsigned higher or same) ? 0011 = CC C clear (unsigned lower) ? 0100 = MI N set (negative) ? 0101 = PL N clear (positive or zero) ? 0110 = VS V set (overflow) ? 0111 = VC V clear (no overflow) ? 1000 = HI C set and Z clear (unsigned higher) ? 1001 = LS C clear or Z set (unsigned lower or same) ? 1010 = GE N set and V set, or N clear and V clear (greater or equal) ? 1011 = LT N set and V clear, or N clear and V set (less than) ? 1100 = GT Z clear, and either N set and V set, or N clear and V clear (greater than) ? 1101 = LE Z set, or N set and V clear, or N clear and V set (less than or equal) ? 1110 = AL always ? 1111 = NV never 31 27 0 Cond 24 乘法指令集 ? 在寄存器 產(chǎn) 生 32位 值 co n d 0 0 0 0 Rm31 28 27 24 23 21 20 19 16 15 12 1 1 8 7 4 3 01 0 0 1RsR n / R d L oR d / R d H im u l SO p co d e [ 23: 21] Mn em o n i c Me an i n g E f f ec t 000 M U L M ul t i pl y ( 32 bi t r es ul t ) R d : = ( R m * R s ) [ 31: 0] 001 M L A M ul t i pl y ac c um ul at e ( 32 bi t r es ul t ) R d : = ( R m * R s + R n) [ 31: 0] 100 U M U L L U ns i g ned m ul t i pl y l o ng R dH i : R dL o : = R m * R s 101 U M L A L U ns i g ned m ul t i pl y ac c um ul at e l o ng R dH i : R dL o + = R m * R s 110 S M U L L S i g ned m ul t i pl y l o ng R dH i : R dL o : = R m * R s 111 S M L A L S i g ned m ul t i pl y ac c um ul at e l o ng R dH i : R dL o + = R m * R s 25 乘法 ? 例子 (乘法 , 乘法累加器 ) ? 注意 ? 最低 32bits 置于結(jié)果寄存器中 ,其余被忽略 ? 不支持第二立即操作數(shù) ? 結(jié)果寄存器與源寄存器必須不同 ? if `S` bit is set the V is preserved and the C is rendered meaningless MUL r4, r3, r2 r4 := [r3 x r2]31:0 MLA r4, r3, r2, r1 r4 := [r3 x r2 + r1] 31:0 26 數(shù)據(jù)傳送指令 1 ? 單指令傳送 (LDR, STR) ? 單字 (32bit), 半字 (6 bit) 以及字節(jié) (8 bit) 傳送 ? 尋址 ?寄存器偏移 ?地址 =基址 ? 寄存器偏移 ?立即數(shù)偏移 ?地址 = 基址 ? 立即數(shù)常數(shù) ?后變址 Postindexing: modify address after use ?前變址 Preindexing: modify address before use ? 回寫 ?如果可能 ,更新基址寄存器 27 單寄存器傳送指令 LDR 把一個字裝入一個寄存器 Rd←mem32[address] STR 從一個寄存器保存一個字或者一個字節(jié) Rd→mem32[address] LDRB 把一個字節(jié)裝入一個寄存器 Rd←mem8[address] STRB 從一個寄存器保存一個字節(jié) Rd→mem8[address] LDRH 把一個半字節(jié)裝入一個寄存器 Rd←mem16[address] STRH 從一個寄存器保存一個半字 Rd→mem16[address] LDRSB 把一個有符號字節(jié)裝入寄存器 Rd←signExtent(mem8[address]) LDRSH 把一個有符號半字裝入寄存器 Rd←signExtent(mem16[address]) 28 尋址方式 變址模式 數(shù)據(jù) 基址寄存器 示例 回寫前變址 mem[base+offset] 基址寄存器加上偏移 LDR r0,[r1,4]! 前變址 mem[base+offset] 不變 LDR r0,[r1,4] 后變址 mem[base] 基址寄存器加上偏移 LDR r0,[r1],4 29 例子 ? PRE r0=0x00000000, r1=0x00009000, Mem32[0x00009000]=0x01010101 Mem32[0x00009004]=0x02020202 回寫型前變址尋址: LDR r0, [r1, 0x4]! ? POST r0=0x02020202, r1=0x00009004 前變址尋址: LDR r0, [r1,0x4] ? POST r0=0x02020202, r1=0x00009000 后變址尋址: LDR r0, [r1 ],0x4 ? POST r0=0x01010101, r1=0x00009004 r 0r 1寄 存 器0 x 0 0 0 0 9 0 0 00 x 0 1 0 1 0 1 0 10 x 0 2 0 2 0 2 0 2存 儲 器0 x 0 0 0 0 9 0 0 4地 址30 數(shù)據(jù)傳送指令 5 COPY: ADR r1, TABLE1 。 r1 points to TABLE1 ADR r2, TABLE2 。 r2 points to TABLE2 LOOP: LDR r0, [r1] STR r0, [r2] ADD r1, r1, 4 ADD r2, r2, 4 ... TABLE1: ... TABLE2:... COPY: ADR r1, TABLE1 。 r1 points to TABLE1 ADR r2, TABLE2 。 r2 points to TABLE2 LOOP: LDR r0, [r1], 4 STR r0, [r2], 4 ... TABLE1: ... TABLE2:... 31 多寄存器數(shù)據(jù)傳送指令 LDM ? 多數(shù)據(jù)傳送指令 (LDM, STM) ? load (LDM) 或 store (STM) 當(dāng)前可訪問寄存器的任意子集 ? 使用 ?堆棧 : maintaining full or empty stacks which can grow up or down memory ?上下文切換 : 保存或重新存儲工作寄存器 ?塊拷貝 :在主存儲器中移動大數(shù)據(jù)塊 ? 尋址 ?Pre/Post indexing ?Auto increment or decrement ?回寫到基址寄存器 Write back the base register 32 多寄存器數(shù)據(jù)傳送指令的要點 ? 多寄存器 Load/Store指令會增加中斷的延遲,因為 ARM不會打斷正在執(zhí)行的指令去響應(yīng)中斷,而必須等到指令執(zhí)行完成; ? 一般編譯器將提供一個選項以控制 Load/Store指令可以傳送的最大寄存器數(shù)目,以限制最大中斷延遲。 33 多寄存器傳送指令的尋址模式 尋址模式 描述 起始地址 結(jié)束地址 Rn! IA 執(zhí)行后增加 Rn Rn+4*N4 Rn+4*N IB 執(zhí)行前增加 Rn+4 Rn+4*N Rn+4*N DA 執(zhí)行后減少 Rn4*N+4 Rn Rn4*N DB 執(zhí)行前減少 Rn4*N Rn4 Rn4*N 注:!決定 Rn的值是否隨著傳送而改變 34 例子 要求:保存 r1~r3到內(nèi)存地址 0x9000~0x900c,并且更新基址寄存器 r4 PRE: r1=0x00000001, r2=0x00000002, r3=0x00000003, r4=0x9000 執(zhí)行操作: STMIA r4!, {r1, r2, r3}(執(zhí)行后增加 ) POST: mem32[0x9000]=0x00000001 mem32[0x9004]=0x00000002 mem32[0x9008]=0x00000003 r4=0x900c r 1r 2寄 存 器0 x 0 0 0 0 9 0 0 0存 儲 器0 x 0 0 0 0 9 0 0 4地 址r 3r 40 x 0 0 0 0 9 0 0 80 x 0 0 0 0 9 0 0 c35 多寄存器傳送尋址模式 r5 r1 r9’ r0 r9 STMIA r9!, {r0,r1,r5} 1000 16 100c 16 1018 16 r1 r5 r9 STMDA r9!, {r0,r1,r5} r0 r9’ 1000 16 100c 16 1018 16 r5 r9 STMDB r9!, {r0,r1,r5} r1 r0 r9’ 1000 16 100c 16 1018 16 r5 r1 r0 r9’ r9 STMIB r9!, {r0,r1,r5} 1000 16 100c 16 1018 16 36 例 1:將存儲器中的連續(xù)數(shù)據(jù)裝載到寄存器 ? PRE mem32[0x80018]=0x03, mem32[0x80014]=0x02, mem32[0x80010]=0x01, r0=0x00080010, r1=0x00000000, r2=0x00000000, r3=0x00000000 執(zhí)行指令: LDMIA r0!, {r1r3} ? POST r0=0x0008001c, r1=0x00000001, r2=0x00000002, r3=0x00000003 0x80020 0x00000005 0x8001c 0x00000004 0x80018 0x00000003 0x80014 0x00000002 0x80010 0x00000001 0x8000c 0x00000000 地址指針 存儲地址 數(shù)據(jù) r3=0x00000000 r2=0x000