嵌入式課件代碼嵌入式課件代碼完美版(8)_第1頁
嵌入式課件代碼嵌入式課件代碼完美版(8)_第2頁
嵌入式課件代碼嵌入式課件代碼完美版(8)_第3頁
嵌入式課件代碼嵌入式課件代碼完美版(8)_第4頁
嵌入式課件代碼嵌入式課件代碼完美版(8)_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、跳轉指令 B BL BX 數(shù)據(jù)處理指令(寄存器之間和立即數(shù),不涉及訪存)opcodecondS Rd,Rn,OP2(8位圖立即數(shù),寄存器,寄存器移位)除了比較指令以外的指令只有加S才影響CPSR如果不加S執(zhí)行完指令,CPSR不變1. 目標寄存器是 PCMOVS PC, R0導致 CPSR=SPSR2. 目標寄存器不是 PC根據(jù)運算結果,影響CPSR勺NZCV加載存儲指令單寄存器 :把表示內存單元勺內容加載到 Rd 源: 目標: RdLDRcond Rd, LDRcondB Rd, LDRcondH Rd, LDRcondSH Rd, LDRcondSB Rd, 把表示內存單元勺內容加載到 Rd

2、源:Rd目標: 表示勺內存地址STRcond Rd, STRcondB Rd, STRcondH Rd, STRcondSH Rd, STRcondSB Rd, 地址模式:零偏移寄存器基址寄存器 +偏移量(立即數(shù),寄存器,寄存器移位) 多寄存器LDMcond 地址模式 Rb ! , 源:Rb寄存器所指內存地址目標:寄存器列表STMcond 地址模式 Rb !, 源:寄存器列表目標:Rb寄存器所指的內存地址IA (Increment After ) (先操作,后增加地址) DA(Decremetn After ) (先操作,后遞減地址)IB (Increment Before ) (先增加地址,

3、后操作) DB(Decrement Before ) (先遞減地址,后操作)R0=0x200080000x20008000=10x20008004=2 0x20008008=30x2000800C=40x20008010=5R2,R3,R4或者R1-R4LDMIA R0! , R1,R2 ,R3,R4 把 R0 所指內存單元的值加載到 R1, R1=1R2=2R3=3R4=4R0=0x2008000+16 = 0x20008010LDMIB R0! , R1,R2 ,R3,R4R0=0x200080000x20008000=10x20008004=20x20008008=30x2000800C

4、=40x20008010=5R1=2R2=3R3=4R4=5R0=0x20008010帶A號的指令只能在非用戶模式下使用1. 寄存器列表中不含PC的話,則用戶寄存器可以通過指令保存和恢復, 通常用于操作系統(tǒng)保存和恢復用戶處理狀態(tài)。2. 寄存器列表中含PC,用于從異常模式的返回,CPSR=SPSR棧:存儲STMDB STMF(以滿減棧的方式來操作)加載 LDMIA LDMFDSTM LDM(Push) ull esc ending stack 夢寄存器存鶴 STMDB (Pop) ull escending stack雰零存器加麴-LDMIASTMFD spljrt-rlriLDMFD sp!t

5、 r4-r7# pc欣器頂集Old SP一r7AOBE咋1234r5FFr4309753Q虛r -10108034AOBE1234FF100rp=8034ll.r9048 |1. 五個寄存器要入棧,此時棧頂指針指向1010內容2. 入棧,滿減棧規(guī)則入棧(STMFDSTMDB先減地址,后入棧,高地址存大號寄存器的原則,依次入棧,棧頂指向100內容。(由于是滿棧,棧頂指針指向有效數(shù)據(jù),因此,若要繼續(xù)入棧,則要先改 變棧頂指針指向一個空位置,然后入棧,否則會將原棧頂?shù)挠行?數(shù)據(jù)覆蓋,DB3. 出棧,滿減棧規(guī)則出棧(LDMFDLDMIA,先出棧,再增地址,棧頂指針執(zhí)行1010內容。(由于是滿棧,棧頂指

6、針指向有效元素,因此,若要出棧,則要先出棧,然后改變棧頂指針指向下一個有效數(shù)據(jù),IA)1. MRS旨令語法格式 讀狀態(tài)寄存器到目標寄存器2. MRSco nd Rd, psr3. cond條件碼4. Rd目標寄存器(不能是R155. Psr 程序狀態(tài)寄存器(CPSR SPSR6. MRS , CPSR7. MRS , SPSRMRS R0, CPSR ;將CPSF狀態(tài)寄存器讀取,保存到 R0中MRS R1, SPSR ;將SPSF狀態(tài)寄存器讀取,保存到 R1中指令的語法格式如下MSR CPSR_vfields, #MSR CPSR_, MSR SPSR_, #31232724N ZCV Q J

7、MSR SPSR_, 231916 1510 9 8U n d e f n e dSX域可以為以下字母(必須小寫)的一個或者組合c控制域屏蔽字節(jié)(psr7.O)x 擴展域屏蔽字節(jié)(psr15.8)s 狀態(tài)域屏蔽字節(jié)(psr23.16)f標志域屏蔽字節(jié)(psr31.24)immediate_8 : 8位圖立即數(shù)MRSR0, CPSR Read the CPSRBICR0,R0, #0xF0000000Clearthe N,乙 C and V bitsMSRCPSR_f, R0 Update the flag bits in theCPSRN, Z, C and V flags now allcl

8、earMRSR0, CPSRRead the CPSRORRR0, R0, #0x80Set the in terrupt disablebitMSRCPSR_c, R0Update the control bits in the CPSRin terrupts(IRQ) nowdisabledMRSR0, CPSRRead the CPSRBICR0, R0, #0x1F Clear the mode bitsORRR0, R0, #0x11 Set the mode bits to FIQmodeMSRCPSR_c, R0 Update the con trol bits in theCP

9、SR now in FIQmodeMSR CPSR_c, #0x11(1) 黃色部分:將 CPSR_C勺bit4:0 改為10001,其它位不變(2) 綠色部分:將 CPSR_C勺bit7:0 改為00010001,其它位不變 在特權模式下,才能修改狀態(tài)寄存器通常用讀出-修改-寫回的方式來操作狀態(tài)寄存器, 如果直接采用立即數(shù)修改,確定修改的值是正確才行。ARM偽指令不屬于ARM旨令集中的指令。定義這些指令可以使ARM匚編程序設計變得更方便。ARM偽指令可以像其他ARM旨令一樣使用。 匯編器會自動用一條或多條 ARM旨令替換ARM偽指令。ARM的偽指令包括ADR 偽指令ADRL偽指令LDR 偽指

10、令(兩種寫法)NOP 偽指令語法格式ADRc ond register, expr ( 替換成 1 條)cond:條件碼register :目標寄存器,如:R0等expr :地址表達式(相對于pc或寄存器)加載地址范圍地址字對齊時:+/-1020 bytes(255 X 4)地址非字對齊時:+/-255bytesADR R1, Delay偽指令,替換為真正的指令)Delay:MOV R0, R140x20 ADD R1, PC,#0x3cPC=0x28+0x3c=0x640x24 0x280x64 MOV R0, R14語法格式ADRLcond register, expr (替換成兩條)co

11、nd:條件碼register :目標寄存器,如: R0 等expr :地址表達式(相對于pc或寄存器)加載地址范圍地址字對齊時:-256K256K地址非字對齊時:-64K64K 用兩條指令實現(xiàn)示例ADRL R1,DelayDelay:MOV R0,r14語法格式LDRcond register,=expr | label_expr 從指令位置到文字池的偏移量必須小于 4KB 示例LDR R1, =TestData(取標號的絕對地址 & ) R仁地址LDR R0, R1TestData:.word 0x12345678語法格式LDRcond register, label_expr 從指令位置到

12、文字池的偏移量必須小于 4KB 示例LDR R1, TestData取標號內容 ) R1=0x12345678TestData:.word 0x12345678字節(jié)定義 .byte (一個字節(jié))語法格式 :.byte expr , expr 其中:expr 數(shù)字表達式或程序中的標號。示例.byte 20c:.byte 20半字定義 .hword 或. short( 兩個字節(jié) )語法格式 :.hwordexpr , expr .shortexpr , expr 其中:expr 數(shù)字表達式或程序中的標號s:.short 20字定義.word或.int 或ong語法格式 :.word expr ,

13、expr .intexpr , expr .long expr , expr 其中:expr數(shù)字表達式或程序中的標號w:.word 20字符串定義.ascii 和.asciz或.stri ng語法格式 :.ascii expr , expr 要人為的加 0.ascizexpr , expr 自動添加 0.stringexpr , expr 自動添加 0其中:expr表示字符串。str:.ascii“test0str1:.asciz “test固定填充字節(jié)內存單元定義.space或.skip 語法格式:.space size , value.skip size , value其中:size所分配

14、的字節(jié)數(shù)yy:.space 1024從yy開始,分配1024字節(jié),以0填充用匯編代碼實現(xiàn)字符串比較strcmp.sarm-li nu x-as -g strcmp.s -o strcmp.oarm-li nu x-ld -e my_strcmp -o strcmp strcmp.oC和匯編程序混合調用R0-R3來傳遞函數(shù)參數(shù)R0-R3放不下部分,通過棧來傳遞C語言中調用匯編函數(shù).text.code 32.global mystrcopymystrcopy:ldrb r2,r1,#1strb r2,r0,#1 cmp r2, #0 bne mystrcopy bx Irmain .cexter

15、n void mystrcopy(char *d , const char *s);r0r1int main(v oid)char buf256;mystrcopy(buf, “ABCD );1. 匯編子函數(shù)聲明為全局的標號.global mystrcopyextern)2. C程序要調用這個匯編函數(shù),聲明這個函數(shù)的原型(exter n void mystrcopy(char *d , const char *s);3. 按照C的使用方式調用C程序如何使用匯編程序的常量或變量.data.global yyyy:.word 0x1001. 匯編中將變量聲明為全局的2. C程序中聲明成外部標號 e

16、xter n int yy;3. 按照C的方式使用匯編調用C子函數(shù):int add4(i nt a, int b, int c,i nt d)retur n (a+b+c+d);修飾即可1. C程序中函數(shù)要是全局的,只要不加 static2. 匯編中聲明為外部的.exter n add43. 按照匯編的方式調用mov rO, #1mov r1, #2mov r2, #3mov r3, #4bl add4cmp r0,#0匯編中使用C的變量?int a;1. C中變量聲明為全局的2. 匯編中聲明外部.exter n a3. 匯編中如何使用呢?ldr r0, =aldr r1,r0C程序中調用匯編

17、程序實現(xiàn)匯編的字符串比較 my_strcmp 函數(shù)將它替換掉之前的C寫字符串比較函數(shù)按照ATPC規(guī)則修改之前的字符串比較函數(shù)增加清BSS段的代碼在寫應用程序是,在main執(zhí)行之前,其實已經有一段代碼執(zhí)行了,清除BSS段。在starts 中,實現(xiàn)了在裸板上清除BSS段的工作。當異常產生時, ARM core:拷貝 CPSR 到 SPSR_設置適當?shù)?CPSR 位:改變處理器狀態(tài)進入ARM狀態(tài)T位(當前發(fā)生異常,處于Thumb犬態(tài)) 改變處理器模式進入相應的異常模式 模式位設置中斷禁止位禁止相應中斷保存返回地址到 LR_設置 PC 為相應的異常向量返回異常時:從 SPSR_vmode恢復 CPSR

18、從 LR_32 Mbytes0x300000000x2000000SW1 HandlerSWI Exception I applicable ad4 Kbytes0x10000x0OxlC0x180x80x40x30008000Literal pool conUnddMOV PCf #0x30000000LDR PCf PCf #+OxFFO異常向量表存放的是跳轉指令,跳轉到相應的異常處理程序去執(zhí)行異常 處理程序B指令只能相對PC跳轉正負32MMOV有效立即數(shù)LDR加載指令只能加載PC的正負4K范圍因此,通常放的是LDR偽指令實現(xiàn)絕對跳轉LDR PC =SWI_Ha ndler從SWIs和未定

19、義指令返|異常是由指令本身弓I起的,因此內核在計算LR時的PC值 沒有被更新.ARMSWIpc-8pc -4;Exception taken herexxxpc-4mPC因此返回指令為:movs pc, lrNote:表示異常返回后將執(zhí)行的那條指令卜在SWI指令的執(zhí)行階段(E)響應異常,當前PC=yyy, lr =PC-4=xxx返回執(zhí)行xxx,因此lr=xxx 指令的地址 mov pc, lr從FIQs和IRQs返回異常在當前指令執(zhí)行完成后才被響應,因此內核在計算LR時的 值已被更新。In terrupt occurred duri ng executioWWWXXXmzzzARM Ir 二

20、 next instructionwwThumb Ir = two instructions aheadWWW-ARM pc-12 pc-8 pc-4 pc因此返回指令為:SUBS pg Ir; #4Note : 表示異常返回后將執(zhí)行的那條指令在執(zhí)行完指令響應異常,PC=zzz lr=PC-4=yyy中斷返回執(zhí)行xxx,因此:lr=yyy subs pc,lr ,#4從預取異常返回當指令到達執(zhí)行階段時異常才產生*因此內核在計算LR時的PC 罰更新。需要重新則亍導致異常的指令ARM Thumbwww pc-8pc-4 tofgKhAbort occurred he佗xxx pc-4 pc-2 A

21、RM Jx - next instructionYXX pc 亦ThumbJi二two instructionsahe因此返回指令為:SUBS pc, Jt #4N ote :表示異常返回后將擁亍的那條指令在執(zhí)行階段,響應異常,PC=yyy, lr=PC-4=xxxlr =xxx, 返回之后,執(zhí)行 www重新預取 subs pc, lr ,#4因此返指令為:從數(shù)據(jù)異常返回異常發(fā)生(和計算LR )在PC被更新之后需要重新執(zhí)行導致異常 的指令。ARM Thumbwwwpc-12: c 5Data abort occurred herexxxpc - 8pc -4yyy;pc - 4c 2ARM Ir = two instructionsaheadzzzaaap匚 + 42 Thumb 1二 four instructions日he日tSUBS pc, lr, #8N ote :表示異常返回后將執(zhí)行的那條指令WWW是一條訪存指令LDR直到執(zhí)行到M階段,發(fā)生異常,取數(shù)據(jù)取不到 此時,流水線已經往下移了一個周期,PC發(fā)生改變,指向zzz 保存的是lr =yyy,異常返回之后,再次執(zhí)行 Wwwsubs pc, lr, #85級流水線舉例:LDR互鉗CvcIeEOperation.ADD Rl, Rl. Ft2 aminrmV!btSUBKi.RR

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論