【文章內(nèi)容簡介】
00000 r1=0x00000000 r0=0x80010 37 例 2:完成一個(gè)存儲(chǔ)器數(shù)據(jù)塊拷貝 ? 注: r9——存放源數(shù)據(jù)的起始地址 r10——存放目標(biāo)起始地址 r11——存放源結(jié)束地址 loop LDMIA r9!, {r0r7} 。裝載 32字節(jié)并更新 r9指針 STMIA r10!, {r0r7} 。存儲(chǔ) 32字節(jié)并更新 r10指針 CMP r9, r11 。是否到達(dá)結(jié)束地址 BNE loop 。不相等跳轉(zhuǎn) 目的 源 高地址 低地址 拷貝存儲(chǔ)地址 r9 r11 r10 38 堆棧操作 ? ARM使用多寄存器 Load/Store指令來完成堆棧操作; ? 使用堆棧時(shí),需要確定堆棧在存儲(chǔ)空間中是向上生長(遞增的“ A‖)還是向下生長(遞減的“ D‖); ? 滿堆棧(“ F‖)是指堆棧指針指向堆棧的最后一個(gè)已使用的地址或滿位置;相反,空堆棧(“ E‖)是指 SP指向堆棧的第一個(gè)沒有使用的地址或空位置; 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 存儲(chǔ)器頂 SP SP 100 FF 1234A0BE 8034SP Old SP ? ARM堆棧操作通過塊傳送指令來完成 : ?STMFD (Push) 塊存儲(chǔ) 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) ? 在寄存器和外部存儲(chǔ)器之間交換字節(jié)或字 ? 讀存儲(chǔ)器和寫存儲(chǔ)器是是放在一起的 ?原子指令 ?執(zhí)行時(shí)不能中斷 ?當(dāng) ‘ LOCK’ 信號(hào)輸出操作時(shí) ,外部存儲(chǔ)器管理單元被鎖定 ,當(dāng) ?多線程操作時(shí)使程序同步 (OS支持 ) ?鎖定 ?信號(hào)量 43 ? 在寄存器和存儲(chǔ)器之間,由一次存儲(chǔ)器讀和一次存儲(chǔ)器寫組成的原子操作。完成一個(gè)字節(jié)或字的交換。 ? 語法: ? SWP{cond}{B} Rd, Rm, [Rn] ? 可用作信號(hào)量 ? 不能由 armcc編譯產(chǎn)生,必須使用匯編器。 Rm Rd 3 2 1 temp 存儲(chǔ)器 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 ? 交換指令多用于實(shí)現(xiàn)操作系統(tǒng)中的信號(hào)量和互斥操作,該指令有修飾符 B,即有字交換和字節(jié)交換兩種形式; 45 SWP指令應(yīng)用示例 Spin MOV r1, =semaphore MOV r2, 1 SWP r3, r2, [r1] CMP r3, 1 BEQ spin 注:信號(hào)量指向的單元是 0或 1,如果為 1,則表示該服務(wù)被另一個(gè)過程使用,程序繼續(xù)循環(huán),直至為 0 46 軟件中斷 (SWI) ? 產(chǎn)生一個(gè)異常陷阱,跳轉(zhuǎn)到 SWI 硬件向量。 ? SWI 處理程序可以檢測 SWI號(hào),從而決定采取何種操作。 ? 通過 SWI機(jī)制,運(yùn)行在用戶模式下的應(yīng)用程序,可請求操作系統(tǒng)執(zhí)行一系列特權(quán)操作。 ? 語法: ? 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í)行指令的地址獲取軟件中斷號(hào),指令地址是從 lr計(jì)算出來的; ? SWI號(hào)的確定方法: 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 。保存寄存器 r0~r12和 lr STMFD sp!, {r0r12,lr} 。read the SWI instruction LDR r10,[lr,4] 。make off top 8 bits BIC r10,r10, 0xff000000 。 r10contains the SWI number BL service_routine 。return from SWI handler LDMFD sp!, {r0r12,pc}^ 50 控制和分支指令 ? 控制指令 ? 分支和分支連接 ?跳到希望的指令中 ?保存當(dāng)前的 PC并返回 (with ‘L’ bit) ? 分支和交換 ?跳到期望的指令中與指令集交換 ?Rm[0] == 1: Subsequent inst. are THUMB. ?Rm[0] == 0: Subsequent inst. are ARM. co n d 1 0 1 L 2 4 b i t s i g n e d w o r d o f f se t31 28 27 25 24 23 0cond Rm 0 0 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 31 28 27 6 5 4 3 0 1 L 51 ? Branch : B{cond} label ? Branch with Link : BL{cond} subroutine_label ? 處理器把偏移量左移兩位,進(jìn)行符號(hào)擴(kuò)展后再與 PC相加 ? 跳轉(zhuǎn)范圍: 177。 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 。 n o o v e rf l o w o c c u rre d BVS Ov e rf l o w s e t 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 SU