【正文】
跳轉(zhuǎn)范圍: 177。make off top 8 bits BIC r10,r10, 0xff000000 。保存寄存器 r0~r12和 lr STMFD sp!, {r0r12,lr} 。 ? 通過 SWI機(jī)制,運行在用戶模式下的應(yīng)用程序,可請求操作系統(tǒng)執(zhí)行一系列特權(quán)操作。 Rm Rd 3 2 1 temp 存儲器 Rn SWP 44 SWAP指令的用法 ? PRE mem32[0x9000]=0x12345678, r0=0x00000000, r1=0x11112222, r2=0x00009000 執(zhí)行操作: SWP r0, r1, [r2] ? POST: mem32[0x9000]=0x11112222, r0=0x12345678, r1=0x11112222, r2=0x00009000 ? 交換指令多用于實現(xiàn)操作系統(tǒng)中的信號量和互斥操作,該指令有修飾符 B,即有字交換和字節(jié)交換兩種形式; 45 SWP指令應(yīng)用示例 Spin MOV r1, =semaphore MOV r2, 1 SWP r3, r2, [r1] CMP r3, 1 BEQ spin 注:信號量指向的單元是 0或 1,如果為 1,則表示該服務(wù)被另一個過程使用,程序繼續(xù)循環(huán),直至為 0 46 軟件中斷 (SWI) ? 產(chǎn)生一個異常陷阱,跳轉(zhuǎn)到 SWI 硬件向量。完成一個字節(jié)或字的交換。是否到達(dá)結(jié)束地址 BNE loop 。裝載 32字節(jié)并更新 r9指針 STMIA r10!, {r0r7} 。 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ù)目,以限制最大中斷延遲。 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 。 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 。r0:a,r1:x if (a0) x=1。 CMP r0,0 MOVEQ r0,1。 Z=0 C=0 or Z=1 N=V N!=V Z=0 amp。 CMP不需要增加 “ S‖就可改變相應(yīng)的標(biāo)志位。 ? 這樣可以提高代碼密度,減少分支跳轉(zhuǎn)指令數(shù)目,提高性能。 for hex 19 條件碼標(biāo)志 ? 任何數(shù)據(jù)處理指令都可以設(shè)置條件碼 (N, Z, V, and C) ? 適用于除比較操作外的所有數(shù)據(jù)處理指令 ? 特殊的請求必須在匯編語言中實現(xiàn) ,這種請求是通過把 ” S”增加到選擇代碼中指定的 ? 算術(shù)操作設(shè)置所有的標(biāo)志位 (N, Z, C, and V) ? 邏輯和移位操作設(shè)置 N and Z ? 當(dāng)無移位操作時 ,保存 V和 C,或根據(jù)移位操作設(shè)置 ADDS r2, r2, r0 。 17 數(shù)據(jù)處理指令 7 ? 移位操作 (cont’d) ?算術(shù)移位 ?ASR:算術(shù)右移 ?ASL:算術(shù)左移 ?循環(huán)移位 : ROR, RRX 18 數(shù)據(jù)處理指令 ? 立即數(shù)操作 : ? 移位寄存器操作數(shù) ? 第二個操作數(shù)在與第一個操作數(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。 ? RRX:擴(kuò)展為 1的循環(huán)右移( Rotate Right Extended by 1 place)。 ? ROR:循環(huán)右移( Rotate Right)。若源操作數(shù)為正數(shù),則字的高端空出的位補(bǔ) 0。 ? ASR:算術(shù)右移( Arithmetic Shift Right)。 ? LSR:邏輯右移( Logical Shift Right)。 ? MO