【正文】
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=0x00000000 r1=0x00000000 r0=0x80010 37 例 2:完成一個存儲器數(shù)據(jù)塊拷貝 ? 注: r9——存放源數(shù)據(jù)的起始地址 r10——存放目標起始地址 r11——存放源結(jié)束地址 loop LDMIA r9!, {r0r7} 。存儲 32字節(jié)并更新 r10指針 CMP r9, r11 。不相等跳轉(zhuǎn) 目的 源 高地址 低地址 拷貝存儲地址 r9 r11 r10 38 堆棧操作 ? ARM使用多寄存器 Load/Store指令來完成堆棧操作; ? 使用堆棧時,需要確定堆棧在存儲空間中是向上生長(遞增的“ A‖)還是向下生長(遞減的“ D‖); ? 滿堆棧(“ F‖)是指堆棧指針指向堆棧的最后一個已使用的地址或滿位置;相反,空堆棧(“ E‖)是指 SP指向堆棧的第一個沒有使用的地址或空位置; 39 堆棧操作尋址方式 尋址方式 說明 pop =LDM push =STM FA 遞增滿 LDMFA LDMDA STMFA STMIB FD 遞減滿 LDMFD LDMIA STMFD STMDB EA 遞增空 LDMEA LDMDB STMEA STMIA ED 遞減空 LDMED LDMIB STMED STMDA 40 LDMFD sp!,{r4r7,pc} SP 100 FF 1234 AOBE 8034 1010 1234 8420 9753 r4 1 r5 14544 r6 0 r7 12 lr 9048 pc 9020 100FF1234A0BE A0BE8034堆棧 r4 100 r5 FF r6 1234 r7 A0BE lr 8034 ABCD 8765 102E 16 FFFF 1010 1234 8420 9753 存儲器頂 SP SP 100 FF 1234A0BE 8034SP Old SP ? ARM堆棧操作通過塊傳送指令來完成 : ?STMFD (Push) 塊存儲 Full Descending stack [STMDB] ?LDMFD (Pop) 塊裝載 Full Descending stack [LDMIA] STMFD sp!,{r4r7,lr} 41 例:把寄存器內(nèi)容放入堆棧,更新 sp 0x80018 0x00000001 0x80014 0x00000002 0x80010 Empty 0x8000c Empty 0x80018 0x00000001 0x80014 0x00000002 0x80010 0x00000003 0x8000c 0x00000002 PRE 地址 數(shù)據(jù) POST 地址 數(shù)據(jù) SP SP PRE : r1=0x00000002, r4=0x00000003, sp=0x00080014 執(zhí)行指令: STMFD sp!, {r1,r4} POST: r1=0x00000002, r4=0x00000003, sp=0x0008000c 42 單數(shù) 據(jù)交換指令 SWAP ? 單數(shù)據(jù)交換 (SWAP) ? 在寄存器和外部存儲器之間交換字節(jié)或字 ? 讀存儲器和寫存儲器是是放在一起的 ?原子指令 ?執(zhí)行時不能中斷 ?當 ‘ LOCK’ 信號輸出操作時 ,外部存儲器管理單元被鎖定 ,當 ?多線程操作時使程序同步 (OS支持 ) ?鎖定 ?信號量 43 ? 在寄存器和存儲器之間,由一次存儲器讀和一次存儲器寫組成的原子操作。 ? 語法: ? SWP{cond}{B} Rd, Rm, [Rn] ? 可用作信號量 ? 不能由 armcc編譯產(chǎn)生,必須使用匯編器。 ? SWI 處理程序可以檢測 SWI號,從而決定采取何種操作。 ? 語法: ? 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 。read the SWI instruction LDR r10,[lr,4] 。 r10contains the SWI number BL service_routine 。 32 Mbyte? ? 如何執(zhí)行長跳轉(zhuǎn)? 28 31 24 0 Cond 1 0 1 L 偏移量 條件碼區(qū)域 Link bit 0 = Branch 1 = Branch with link 23 25 27 分支指令 52 控制流指令 Bra n c h In te rp re ta ti o n No rm a l u s e s B BAL Un c o n d i ti o n a l A l w a y s A l w a y s t a k e t h i s b ra n c h A l w a y s t a k e t h i s b ra n c h BEQ E q u a l Co m p a ri s o n e q u a l o r z e ro r e s u l t B NE No t e q u a l Co m p a ri s o n n o t e q u a l o r n o n z e ro r e s u l t BPL P l u s Re s u l t p o s i ti v e o r z e ro B M I M i n u s Re s u l t m i n u s o r n e g a ti v e B CC B L O Ca rry c l e a r L o w e r A ri th m e ti c o p e ra ti o n d i d n o t g i v e c a rry out 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 B CS B HS Ca rry s e t Hi g h e r o r s a m e A ri th m e ti c o p e ra ti o n g a v e c a rry out 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 o r s a m e BVC Ov e rf l o w c l e a r S i g n e d i n te g e r o p e ra ti o n 。 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 。 return here SUBR: .. 。 return BL SUB1 .. SUB1: 。 copy r14 into r15 Full Descending 56 程序狀態(tài)寄存器訪問指令 ? 程序狀態(tài)寄存器訪問指令 (MRS, MSR) ? MRS 程序狀態(tài)寄存器到通用寄存器的數(shù)據(jù)傳送指令 ? MSR 通用寄存器到程序狀態(tài)寄存器的數(shù)據(jù)傳送指令 57 PSR 傳送指令 ? MRS和 MSR允許傳送 CPSR / SPSR中的內(nèi)容到 /從一個通用寄存器中。 Rd = psr ? MSR{cond} psr[_fields],Rm 。 27 31 N Z C V Q 28 6 7 I F T mode 16 23 8 15 5 4 0 24 f s x c U n d e f i n e d J 58 協(xié)處理器指令 1 ? 協(xié)處理器 ? 一般原理是通過增加核擴展指令集 ? Example : 如 MMU amp。 ? 這有三種協(xié)處理器指令 ? 協(xié)處理器數(shù)據(jù)處理指令 ? CDP:初始化協(xié)處理器數(shù)據(jù)處理操作 ? 協(xié)處理器寄存器傳送指令 ? MRC: 從 ARM 寄存器移到協(xié)處理器寄存器 ? MCR:從協(xié)處理器寄存器移到 ARM 寄存器 ? 協(xié) 處理器存