freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

pic16系列單片機(jī)常用偽指令(匯編)(編輯修改稿)

2025-05-04 06:27 本頁(yè)面
 

【文章內(nèi)容簡(jiǎn)介】 正好落在這些非法指令處時(shí),就有必要設(shè)置軟件陷阱捕捉這些非法跳轉(zhuǎn),讓程序恢復(fù)正常運(yùn)行。如果要程序員一個(gè)一個(gè)地址去分析哪里有空的指令單元然后又用特殊指令一條一條填入,這是根本行不通的。fill 偽指令在這時(shí)就派上用場(chǎng)了。fill 0x0000, 5 。從當(dāng)前地址處連續(xù)5 個(gè)程序字填成0x0000(NOP 指令)fill (goto $), NEXT_BLOCK$ 。從當(dāng)前地址開(kāi)始到標(biāo)號(hào)NEXT_BLOCK 前所有程序空間填上 。goto $ (死循環(huán))指令org 0x0800NEXT_BLOCK例312請(qǐng)大家特別注意上例312 中第二行fill 偽指令的用法。在你自己的程序中也可以用同樣的方法把所有未用到的程序空間填上“goto $”這樣一條死循環(huán)的指令。一旦單片機(jī)執(zhí)行過(guò)程中非法跳到這些指令處時(shí)指令運(yùn)行就將被“俘獲”,停在那里直到看門狗復(fù)位,然后程序從頭開(kāi)始。這是軟件陷阱的最基本處理方法。若填充指令“goto 0x0000”直接跳轉(zhuǎn)到復(fù)位地址處可能會(huì)有問(wèn)題,因?yàn)間oto 指令執(zhí)行時(shí)必須和PCLATH 寄存器配合(跨頁(yè)跳轉(zhuǎn)的問(wèn)題),若PCLATH[4:3]不為00 就不能跳到復(fù)位地址0x0000 處。在程序跑飛非法跳轉(zhuǎn)到設(shè)定的陷阱處時(shí)你又怎能保證PCLATH 中的頁(yè)面設(shè)定為正好指向第0 頁(yè)? endend 偽指令告訴匯編編譯器編譯工作到此為止,end 后面所有的信息,不管正確與否,一概不管。絕大多數(shù)情形下你的程序的最后一行應(yīng)該是“end”。無(wú)論如何,end 必須出現(xiàn)在程序中,不然編譯器會(huì)報(bào)錯(cuò),無(wú)法進(jìn)行編譯工作。 MPASM 內(nèi)的直接運(yùn)算符為了使所編的程序理解更直觀,維護(hù)更方便,MPASM 匯編器允許你在程序的編寫過(guò)程中直接以數(shù)學(xué)表達(dá)式的形式在指令中實(shí)現(xiàn)一些數(shù)字運(yùn)算的功能。千萬(wàn)不要誤解成MPASM 可以替你生成數(shù)學(xué)運(yùn)算的指令,那可是其它編譯器(例如C 編譯器)才能完成的工作。這里講的數(shù)字運(yùn)算前提是所有參與運(yùn)算的操作數(shù)全部是明明白白的立即數(shù),如果是符號(hào)名字則必 須事先用define 或equ 偽指令明確定義了的(如果是變量使用了這些符號(hào)則是地址運(yùn)算,原先有明確的地址)。整個(gè)運(yùn)算過(guò)程是由編譯器在掃描你的源程序時(shí)進(jìn)行的,運(yùn)算結(jié)果也只能是一個(gè)確定的立即數(shù)。我們將在這里介紹幾種非常有用的運(yùn)算符。 取當(dāng)前指令的地址值:$你可以在寫程序時(shí)給一條指令前加上一個(gè)標(biāo)號(hào),然后直接引用該標(biāo)而得到此程序字的地址。如果你的程序經(jīng)常需要用到指令的當(dāng)前地址或附近的地址值,這樣的標(biāo)號(hào)就需要寫很多且不能重復(fù)。用“$”運(yùn)算符讓匯編器替你計(jì)算當(dāng)前指令所處的位置將有效地減輕你的這份工作量。見(jiàn)例312 和313。用語(yǔ)句標(biāo)號(hào)得到指令地址 Here goto Here 。跳轉(zhuǎn)到當(dāng)前地址,程序進(jìn)入死循環(huán)Delay decfsz count, f 。計(jì)數(shù)器減1 并判0 goto Delay 。跳轉(zhuǎn)到上一行重復(fù)循環(huán)。用$運(yùn)算符得到指令地址而無(wú)需定義任何語(yǔ)句標(biāo)號(hào) goto $ 。跳轉(zhuǎn)到當(dāng)前地址,程序進(jìn)入死循環(huán)decfsz count, f 。計(jì)數(shù)器減1 并判0 goto $1 。跳轉(zhuǎn)到(當(dāng)前地址-1)處,即上一行,重復(fù)循環(huán)例313 取16位立即數(shù)的高低字節(jié):high 和low一個(gè)16 位的立即數(shù)在8 位單片機(jī)中必須被拆解成高8 位一個(gè)字節(jié)(高字節(jié))和低8 位一個(gè)字節(jié)(低字節(jié))才能用指令一條條處理,類似的處理在對(duì)兩字節(jié)變量賦立即數(shù)初值和基于PC 相對(duì)跳轉(zhuǎn)查表前設(shè)定PCLATH 寄存器時(shí)經(jīng)常碰到。MPASM 提供了high 和low 兩個(gè)運(yùn)算符分別計(jì)算一個(gè)立即數(shù)的高字節(jié)和低字節(jié)。我們看例314 的代碼實(shí)例:。兩字節(jié)變量賦立即數(shù)初值define DELAY_TIME .1000 。定義一個(gè)常數(shù)立即數(shù)movlw low(DELAY_TIME) 。取立即數(shù)的低字節(jié)值,經(jīng)編譯器計(jì)算將得到0xe8movwf count 。賦給變量的低字節(jié)movlw high(DELAY_TIME) 。取立即數(shù)的高字節(jié)值,經(jīng)編譯器計(jì)算將得到0x03 movwf count+1 。賦給變量的高字節(jié) (count已用EQU命令了, 地址確定 了,count+1表示count的下一個(gè)內(nèi)存地址.)。查表前設(shè)定PCLATH 寄存器。關(guān)于PC 節(jié)movlw high(Table) 。取查找表入口地址的高字節(jié)值movwf PCLATH 。設(shè)定PCLATH 寄存器movf index,w 。取查表索引值call Table 。調(diào)用查表子程序例314 加減乘除:+ * /實(shí)際上前面的很多代碼范例中都已經(jīng)說(shuō)明了“+”、“”運(yùn)算符的使用方法。“*”和“/”的運(yùn)算也類似。看下面例315 計(jì)算異步串行通訊波特率常數(shù)的方法。高速異步通信波特率BPS=Fosc/(16*(X+1))。故,波特率常數(shù)X = Fosc/(BPS*16) – 1 define BPS .9600 。定義工作波特率 define Fosc .4000000 。定義單片機(jī)工作振蕩頻率4MHz。... 。其它代碼 movlw Fosc/(BPS*.16) – 1 。(10 進(jìn)制25) movwf SPBRG 。設(shè)定波特率定時(shí)寄存器例315程序中用了統(tǒng)一的計(jì)算公式后,在調(diào)試時(shí)只要簡(jiǎn)單地改變前面的define 語(yǔ)句定義新的波特率或振蕩頻率值,然后重新編譯一次程序即實(shí)現(xiàn)了波特率設(shè)定代碼的更新,非常方便。 移位運(yùn)算: 和“”運(yùn)算符把一個(gè)立即數(shù)算術(shù)右移若干位(高位補(bǔ)0),“”運(yùn)算符把一個(gè)立即數(shù)算術(shù)左移若干位(低位補(bǔ)0)。define xxx 0x55movlw xxx1 。W=0x2amovlw xxx2 。W=0x54movlw 17 。W=0x80例316 立即數(shù)邏輯運(yùn)算: amp。 | ^“amp?!边\(yùn)算符把一個(gè)立即數(shù)和另外一個(gè)立即數(shù)相“與”;“|”運(yùn)算符把一個(gè)立即數(shù)和另外一個(gè)立即數(shù)相“或”;“^”運(yùn)算符把一個(gè)立即數(shù)和另外一個(gè)立即數(shù)相“異或”。例317 的代碼利用異或運(yùn)算符“^”實(shí)現(xiàn)類似于C 語(yǔ)言“switchcase”功能的匯編代碼指令,注意例中的VALVALVAL3 等判別值都是事先已經(jīng)定義的立即數(shù)而不是RAM 中的變量。利用異或運(yùn)算實(shí)現(xiàn)類似于C 語(yǔ)言的switchcase 語(yǔ)句movf swi
點(diǎn)擊復(fù)制文檔內(nèi)容
公司管理相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1