【正文】
2 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 ? 在寄存器和存儲器之間,由一次存儲器讀和一次存儲器寫組成的原子操作。read the SWI instruction LDR r10,[lr,4] 。 return here SUBR: .. 。 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。 ? 偽指令的功能: ? 提高程序的可讀性和易維護性 ? 易于編程 68 鏈接器( Linker) ? 將多個目標文件鏈接成一個可執(zhí)行的文件 ? 編譯器只負責把程序翻譯成機器碼,但處理與存儲器地址相關(guān)的內(nèi)容,這部分工作由鏈接器來完成; ? 一個程序編譯完成后會分成代碼段( ReadOnly,RO)、數(shù)據(jù)段(ReadWrite,RW)、零初始化段( ZeroInitialized,ZI),需要把不同的程序的不同區(qū)段鏈接成一個完整連續(xù)的區(qū)。 在 LDM/STM指令中 , 列表中的寄存器為根據(jù)寄存器的編號由低到高訪問次序 , 與列表中的寄存器排列次序無關(guān) 。 ? 4. DCQ/DCQU: 標號 DCQ/DCQU 表達式 說明: DCQ用于分配一塊以 8個字節(jié) 為單位的存儲區(qū)域并用偽指令中指定的表達式初始化 , 它定義的存儲空間是字對齊的 。 80 匯編控制偽指令 Ⅰ ? 匯編控制偽操作用于指引匯編程序的執(zhí)行流程: ? MACRO、 MEND ? IF、 ELSE、 ENDIF ? WHILE、 WEND ? MEXIT 81 匯編控制偽指令 Ⅱ ? 1. MACRO、 MEND MACRO [$標號 ] 宏名 [$參數(shù) 1, $參數(shù) 2, ?? ] 指令序列 MEND 說明: MACRO 表明一個宏定義的開始, MEND則表示一個宏的結(jié)束, MACRO、 MEND前呼后應(yīng)可以將一段代碼定義為一個整體,又稱宏,然后就可以在程序中通過宏的名稱及參數(shù)調(diào)用該段代碼。 WHILE、 WEND偽指令可以嵌套使用 。 如果段名以數(shù)字開頭 , 那么該段名需用 “ |” 字符括起來 , 如 |7wolf|, 用 C的編譯器產(chǎn)生的代碼一般也用 “ |” 括起來 。 ? COMMON屬性:定義一個通用段 , 這個段不包含用戶代碼和數(shù)據(jù) 。 用戶也可以用 GLOBAL代替 EXPORT。 [, WEAK]選項意義同IMPORT。 91 其他偽指令 Ⅷ ? : [名稱 ] ROUT 說明: ROUT可以給一個局部變量定義作用范圍 。 2 0 4 82 0 4 82 0 4 82 0 4 82 0 4 82 0 4 8E n d o f S t a c kF I Q S t a c kI R Q S t a c kA b o r t S t a c kU n d e f S t a c kS V C S t a c kU s e r S t a c k0 x d f f f f 0 00 x d f f f 7 0 00 x d f f e f 0 00 x d f f e 7 0 00 x d f f d f 0 00 x d f f d 7 0 00 x d f f c f 0 094 初始化堆棧 (2) ? 第二步 :定義各種模式下的寄存器 設(shè)定未定義指令模式堆棧 : mrs r0,cpsr bic r0,r0,0x1f orr r1,r0,0x1b|0xc0 msr cpsr_cxsf,r1 。let sp=FIQStack 96 初始化堆棧 (4) 設(shè)定監(jiān)控模式堆棧 : mrs r0,cpsr bic r0,r0,0x1f orr r1,r0,0x13|0xc0 msr cpsr_cxsf,r1 。let sp=AbortStack 95 初始化堆棧 (3) 設(shè)定中斷模式堆棧 : mrs r0,cpsr bic r0,r0,0x1f orr r1,r0,0x12|0xc0 msr cpsr_cxsf,r1 。 UndefStack 2048。 INCLUDE和 GET作用等效的 。 [, WEAK]選項表示如果所有的源文件都沒有找到這個標號的定義 , 編譯器也不會提示錯誤信息 。 在一個完整的匯編程序中至少要有一個 ENTRY, 程序中也可以有多個 , 此時 , 程序的真正入口點可在鏈接時指定 , 但在一個源文件里最多只能有一個ENTRY或者沒有 ENTRY。 ? READONLY:表示本段為只讀 。 其中 , 表達式的值為 2的冪 , 如 16等 , 用于指定對齊方式 。 82 匯編控制偽指令 Ⅲ ? 2. IF、 ELSE、 ENDIF IF邏輯表達式 代碼段 1 ELSE 代碼段 2 ENDIF 說明: IF、 ELSE、 ENDIF偽操作能根據(jù)邏輯表達式的成立與否決定是否在編譯時加入某個指令序列 。 ? : 標號 DCFS/DCFSU 表達式 說明: DCFS用于為單精度的浮點數(shù)分配一片連續(xù)的字存儲單元并用表達式初始化 ,它定義的存儲空間是字對齊的 ,每個單精度浮點數(shù)使用一個字單元 .DCFSU功能跟 DCFS類似 , 只是分配的存儲單元不嚴格字對齊 。 ? 2. DCW/DCWU: 標號 DCW/DCWU 表達式 說明: DCW分配一段半字存儲單元并用表達式值初始化 , 它定義的存儲空間是半字對齊的 。 71 符號定義偽指令 Ⅱ 1. LCLA、 LCLL、 LCLS ? 格式: LCLA/LCLL/LCLS 局部變量名 ? 說明: LCLA、 LCLL、 LCLS偽指令用于定義一個匯編程序中的局部變量 , 并初始化 , 其中: ?LCLA定義一個局部的數(shù)字變量 , 初始化為 0; ?LCLL定義一個局部的邏輯變量 , 初始化為 F; ?LCLS定義一個局部的字符串變量 , 初始化為空串; 這三條偽指令用于聲明局部變量 , 在其局部作用范圍內(nèi)變量名必須唯一 。 ? For example ? LDR r0,=0xFF = MOV r0,0xFF ? LDR r0,=0x55555555 = LDR r0,[PC,Imm12] … … DCD 0x55555555 ? 推薦使用這種方法把常數(shù)裝入寄存器 。 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)容到 /從一個通用寄存器中。 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 。 ? SWI 處理程序可以檢測 SWI號,從而決定采取何種操作。 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