【正文】
let sp=IRQStack 設(shè)定快速中斷模式堆棧 : mrs r0,cpsr bic r0,r0,0x1f orr r1,r0,0x11|0xc0 msr cpsr_cxsf,r1 。 IRQStack 2048。 GET/INCLUDE只能用于包含源文件 , 包含其他文件則需要使用 INCBIN偽指令 。 89 其他偽指令 Ⅵ ? : EXTERN 標(biāo)號 [,WEAK] 說明: EXTERN告訴編譯器所使用的標(biāo)號要在當(dāng)前源文件中引用 ,但該標(biāo)號是在其他的源文件中定義的 。 ? : 名稱 EQU 表達(dá)式 [, 類型 ] 說明: EQU用于將程序中的數(shù)字常量 、 標(biāo)號 、 基于寄存器的值賦予一個等效的名稱 , 這一點類似于 C語言中的# define, 可用 “ *” 代替 EQU。 ? ALIGN=表達(dá)式:對齊方式為 2表達(dá)式次方 , 例如:表達(dá)式 =3, 則對齊方式為 8字節(jié)對齊 。 偏移量也是個數(shù)字表達(dá)式 , 如果存在偏移量 , 則當(dāng)前位置的自動對齊到: 2的表達(dá)式值次方+偏移量 。 IF、 ELSE、 ENDIF偽指令可以嵌套使用 。 ? 8. MAP: MAP 表達(dá)式 [, 基址寄存器 ] 說明: MAP定義一個結(jié)構(gòu)化的內(nèi)存表的首地址 , “ ^ ” 可以用來代替 MAP。 DCD也可用“ amp。 73 符號定義偽指令 Ⅳ 3. SETA、 SETL、 SETS ? 格式:變量名 SETA/SETL/SETS 表達(dá)式 ? 說明: SETA:給一個數(shù)字變量賦值; ?SETL:給一個邏輯變量賦值; ?SETS:給一個字符串變 Ⅳ 量賦值; 格式中的變量名必須為已經(jīng)定義過的全局或局部變量 , 表達(dá)式為將要賦給變量的值 。 ? 是 ARM 指令集的一個子集。 Rd = psr ? MSR{cond} psr[_fields],Rm 。 o v e rf l o w o c c u rre d B GT Gre a te r th a n S i g n e d i n te g e r c o m p a ri s o n g a v e g re a te r th a n B GE Gre a te r o r e q u a l S i g n e d i n te g e r c o m p a ri s o n g a v e g re a te r o r equal B L T L e s s t h a n Si g n e d i n te g e r c o m p a ri s o n g a v e l e s s t h a n B L E L e s s o r e q u a l S i g n e d i n te g e r c o m p a ri s o n g a v e l e s s t h a n o r equal B HI Hi g h e r Un s i g n e d c o m p a ri s o n g a v e h i g h e r B L S L o w e r o r s a m e Un s i g n e d c o m p a ri s o n g a v e l o w e r o r s a m e 53 分支和鏈接指令 ? 分支子程序 (r14 serves as a link register) ? 嵌套子程序 BL SUBR 。 ? 語法: ? SWI{cond} SWI number 47 軟件中斷 (SWI)執(zhí)行的操作 指令 名稱 執(zhí)行操作 SWI 軟件中斷 Lr_svc=SWI指令后面的指令地址 spsr_svc=cpsr pc=vectors+0x8 cpsr模式 =SVC cpsr I=1(屏蔽 IRQ中斷) 48 SWI中斷處理程序 ? 處理軟件中斷的代碼段稱為中斷處理程序( SWI Handler),中斷處理程序是通過執(zhí)行指令的地址獲取軟件中斷號,指令地址是從 lr計算出來的; ? SWI號的確定方法: SWI_Number=SWI instructionand NOT(0xff00000000) 28 31 24 27 0 Cond 1 1 1 1 SWI number (ignored by processor) 23 條件域 49 SWI處理程序應(yīng)用示例 ? SWI_handler 。存儲 32字節(jié)并更新 r10指針 CMP r9, r11 。 CMP r0,0 MOVEQ r1,0 MOVGT r1,1 ? 使用條件比較指令 if (a==4 || a==10) x=0。 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)志位,但可以選擇通過添加“ S‖來影響標(biāo)志位。從字的最低端移出的位填入字的高端空出的位。寄存器中字的低端空出的位補(bǔ) 0。 ? LSR:邏輯右移( Logical Shift Right)。 ? RRX:擴(kuò)展為 1的循環(huán)右移( Rotate Right Extended by 1 place)。 CMP不需要增加 “ S‖就可改變相應(yīng)的標(biāo)志位。 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=0x0