單片機實例教程秒脈沖發(fā)生器電路課件_第1頁
單片機實例教程秒脈沖發(fā)生器電路課件_第2頁
單片機實例教程秒脈沖發(fā)生器電路課件_第3頁
單片機實例教程秒脈沖發(fā)生器電路課件_第4頁
單片機實例教程秒脈沖發(fā)生器電路課件_第5頁
已閱讀5頁,還剩139頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、秒脈沖發(fā)生器電路學(xué)習(xí)目標(biāo)通過本項目的學(xué)習(xí),能夠闡述尋址方式的種類和功能;能夠理解匯編指令,包括數(shù)據(jù)傳送指令、算術(shù)運算指令、邏輯操作指令、移位類指令、跳轉(zhuǎn)指令、轉(zhuǎn)移和循環(huán)控制指令、相關(guān)堆棧指令及其他各種指令;熟悉偽指令概念及用途。能夠根據(jù)上述匯編指令編寫簡單的匯編程序。學(xué)習(xí)要求能夠闡述尋址方式的種類和功能能夠理解匯編指令熟悉偽指令概念及用途能夠根據(jù)上述匯編指令編寫簡單的匯編程序項目導(dǎo)入由飛思卡爾MC9S08GB60單片機組成最小應(yīng)用系統(tǒng),產(chǎn)生一個秒脈沖信號,控制發(fā)光二極管(LED)每一秒亮一次。即設(shè)定控制LED發(fā)光二極管每1s亮一次,秒脈沖的周期T=1s,若每隔0.5s將PTA0端口取反,即可以

2、在PTA0端口輸出1Hz的方波。如圖1-1所示。項目分析1用最少的元器件構(gòu)成一個單片機的最小應(yīng)用系統(tǒng)。2LED發(fā)光二極管的“定時亮滅”控制,可以利用延時方法來實現(xiàn),現(xiàn)常用的有兩種方法:一是用定時器中斷來實現(xiàn)(定時器的硬件和寄存器知識將在項目8介紹),二是用指令循環(huán)來實現(xiàn)。在系統(tǒng)控制內(nèi)容允許的情況下,可以采用第二種方法。在動手實現(xiàn)利用單片機的最小應(yīng)用系統(tǒng)控制LED發(fā)光二極管的定時亮滅(即秒脈沖發(fā)生器)時,先讓我們學(xué)習(xí)飛思卡爾單片機的尋址方式和匯編指令系統(tǒng)的相關(guān)知識。項目分析在動手實現(xiàn)利用單片機的最小應(yīng)用系統(tǒng)控制LED發(fā)光二極管的定時亮滅(即秒脈沖發(fā)生器)時,先讓我們學(xué)習(xí)飛思卡爾單片機的尋址方式和

3、匯編指令系統(tǒng)的相關(guān)知識。相關(guān)知識3.1 尋址方式3.2 匯編指令系統(tǒng)及應(yīng)用舉例 3.3 偽指令3.4 基本程序設(shè)計范例3.1 尋址方式指令的一個重要組成部分是操作數(shù),由它指定參與運算的數(shù)據(jù)或數(shù)據(jù)所在的存儲器單元或寄存器或I/O接口的地址。指令中所規(guī)定的尋找操作數(shù)的方式就是尋址方式。每一種計算都具有多種尋址方式,尋址方式越多,單片機的功能就越強,靈活性就越大。尋址方式的多少及尋址功能是反映指令系統(tǒng)優(yōu)劣的主要因素之一。要掌握指令系統(tǒng)也可從尋址方式入手。3.1 尋址方式HCS08系列單片機采用的尋址方式有7種:隱含尋址方式(INH)、相對尋址方式(REL)、立即尋址方式(#IMM)、直接尋址方式(D

4、IR)、擴展尋址方式(EXT)、變址尋址方式(間接尋址方式)。每種尋址方式分述如下:3.1 尋址方式3.1.1隱含尋址方式(INH)隱含尋址方式(Inherent addressing mode,INH)是當(dāng)CPU 知道要完成指令的所有信息而源碼中卻沒有提供地址時使用的一種尋址方式。在隱含尋址方式中,執(zhí)行指令的所有信息均在操作碼中,CPU不需要從寄存器、存儲器中取操作數(shù),操作數(shù)隱含在累加器、變址寄存器或狀態(tài)標(biāo)志寄存器中。具有隱含尋址方式的指令全為單字節(jié)指令,匯編后生成的操作碼在程序存儲器中只占用一個字節(jié)的空間。 3.1 尋址方式例如:INCA;累加器A中的內(nèi)容加1INCX;變址寄存器X中的內(nèi)容

5、加1DECA;累加器A中的內(nèi)容減1SEI;中斷屏蔽位I置1CLI;中斷屏蔽位I清03.1 尋址方式3.1.2相對尋址方式(REL)相對尋址方式(Relative addressing mode ,REL)是將程序計數(shù)器PC中的當(dāng)前內(nèi)容與指令第二個字節(jié)所給出的數(shù)相加,其和為跳轉(zhuǎn)指令的偏移地址。在這種尋址方式中,CPU首先測試給定的條件,如果滿足條件,則發(fā)生相對轉(zhuǎn)移,即把當(dāng)前程序計數(shù)器PC的值加上指令碼所占字節(jié)數(shù),再加上指令操作碼后的8位有符號數(shù),使程序轉(zhuǎn)移到PC指定的新地址處,否則CPU執(zhí)行該條指令的下一條指令。具有相對尋址方式的指令為2字節(jié)指令,一個字節(jié)為操作碼,另一個字節(jié)為相對偏移量。 3.

6、1 尋址方式例如:BRA rel;無條件轉(zhuǎn)移到標(biāo)號為rel的指令處執(zhí)行程序BSRInit;調(diào)用子程序Init3.1.3立即尋址方式(IMM)隱含尋址方式(Immediate addressing mode ,IMM)是單片機的指令系統(tǒng)查找數(shù)據(jù)的一種信息定位方式,在一定程度上可以把它和高級語言的常數(shù)對應(yīng)起來。字面上的解釋,是指數(shù)據(jù)本身直接出現(xiàn)在指令中,也就是說數(shù)據(jù)本身是整個指令編碼的一部分。具有立即尋址方式的指令主要用于訪問常數(shù),多為2字節(jié)指令,第一個字節(jié)為操作碼,后面字節(jié)為立即數(shù),立即數(shù)前面的符號前綴“#”說明操作碼后面的是操作數(shù)值而不是操作數(shù)地址。 3.1 尋址方式例如:MOV #$100,

7、PTAD;給一個寄存器PTAD賦初值,這里的100是直接出現(xiàn)在指令中的操作數(shù),它就是立即數(shù),它的尋址方式就是立即尋址方式.如果查看它轉(zhuǎn)換的對應(yīng)的機器語言代碼,會發(fā)現(xiàn)100是指令編碼的一部分ADC#$30;將累加器A中的內(nèi)容與十六進制立即數(shù)30進行帶進位 加運算,結(jié)果存放至累加器A中立即操作數(shù)的長度是根據(jù)指令隱含的CPU 寄存器大小來定義。編譯器會自動縮位或擴展操作數(shù)去匹配指令需要的長度。例如:LDA#$08;將立即操作數(shù)08傳送給累加器A,立即操作數(shù)的長度 為8位操作數(shù)STAPTAD;將累加器A內(nèi)容傳送給寄存器PTAD,立即操作數(shù)的長 度為8位操作數(shù)LDHX#$012A;將立即操作數(shù)012 A

8、傳送給變址寄存器H:X,立即操作 數(shù)的長度為16位操作數(shù)STHXVOLM;將變址寄存器H:X傳送給變量VOLM:VOLM+1,操 作數(shù)的長度為16位操作數(shù)3.1 尋址方式3.1.4直接尋址方式(DIR)在直接尋址方式(Direct addressing mode ,DIR)中,操作數(shù)的有效地址包含于操作碼后的一個字節(jié)中。由于操作數(shù)的有效地址公為一個字節(jié),因此直接尋址方式只能對存儲器0頁的256B空間($0000$00FF)進行操作。0頁存儲區(qū)含有I/O控制和狀態(tài)寄存器,還有部分用戶數(shù)據(jù)RAM區(qū)。一般將經(jīng)常要訪問的數(shù)據(jù)放在0頁的用戶數(shù)據(jù)RAM中,以節(jié)省程序空間,提高數(shù)據(jù)訪問速度。具有直接尋址方式

9、的指令為2字節(jié)指令,指令的第一個字節(jié)是操作碼,第地個字節(jié)為操作數(shù)的有效地址。3.1 尋址方式例如:LDA#$00;將$0000單元中的內(nèi)容送入累加器A中STA$04 ;將累加器A中的內(nèi)容傳送給$0004單元地址中 3.1 尋址方式3.1.5擴展尋址方式(EXT)在擴展尋址方式(Extended addressing mod,EXT)中,操作數(shù)的有效地址包含于操作碼后的兩個字節(jié)中。由于操作數(shù)的有效地址僅為2字節(jié),因此,采用擴展尋址方式的指令可以訪問64KB內(nèi)的任何存儲器空間。具有該尋址方式的指令一般為3字節(jié)指令,指令的第一個字節(jié)是操作碼,第二、三個字節(jié)是操作數(shù)的有效地址。 3.1 尋址方式例如:

10、LDA$0A0D;將$0A0D單元中的內(nèi)容送入累加器A中STA$0809;將累加器A中的內(nèi)容送入$0809單元中 3.1 尋址方式3.1.6 變址尋址方式變址尋址方式有時被稱為間接尋址方式,是以CPU 變址寄存器H:X作為參考地址加上偏移地址,其結(jié)果作為目的地址來存取操作數(shù)的尋址方式。有些情況下變址寄存器中的值會自動增加用來存取目的操作數(shù)。變址尋址方式的重要特征是:操作數(shù)地址取決于當(dāng)前CPU 變址寄存器的內(nèi)容而不是常數(shù)地址。變址尋址方式可分為以下幾種類型:3.1 尋址方式(1)無偏移量變址方式(IX)(2)無偏移量變址、變址加1尋址方式(IX+)(3)8位偏移量變址方式(IX1)(4)8位偏移

11、量變址、變址加1尋址方式(IX1+)(5)16位偏移量變址方式(IX2)3.1 尋址方式例如:LDA$0110,X;將以H:X 寄存器中的值加上$0110所得的值為地址的存儲單 元的內(nèi)容送至累加器A中AND$1030,X;將以H:X 寄存器中的值加上$1030所得的值為地址的存儲單 元的內(nèi)容與累加器A中的值進行邏輯運算,結(jié)果存至累加器 A中 3.1 尋址方式3.1.7 堆棧尋址方式在堆棧尋址方式或,操作數(shù)的有效地址由16位堆棧指針SP中的內(nèi)容和跟在操作碼后的無符號偏移量決定,根據(jù)偏移量的多少,堆棧尋址又分為8位偏移量堆棧尋址和16位偏移量堆棧尋址兩種尋址方式。用堆棧方式尋址的指令功能與對應(yīng)變址

12、尋址指令相似,只是與堆棧指針SP有關(guān)的指令要求預(yù)先訪問一個字節(jié),因此它要比對應(yīng)的變址指令多用一個時鐘周期。3.1 尋址方式(1)8位偏移量堆棧尋址方式(SP1)例如:LDA$20,SP;將以SP中的值加上$20所得的和為地址的存儲單元中的值送 至累加器A中INC $20,SP;將以SP中的值加上$20所得的和為地址的存儲單元中的值加13.1 尋址方式(2)16位偏移量堆棧尋址方式(SP2)在這種變址方式中,無符號的16 位偏移量與堆棧指針(SP)相加,得到要訪問的操作數(shù)地址。該尋址方式用于訪問棧中深度超過255 的數(shù)據(jù)。如果偏移量小于或等于255,編譯器將自動使用更有效率的SP1 尋址方式。

13、3.1 尋址方式例如:LDA$0110,SP;將以SP中的值加上$0110所得的和為地址的存儲單元中 的值送至累加器A中 3.2匯編指令系統(tǒng)及應(yīng)用舉例HCS08系列單片機指令系統(tǒng)有數(shù)據(jù)傳送指令、算術(shù)運算指令、邏輯操作指令、移位類指令、跳轉(zhuǎn)指令、轉(zhuǎn)移和循環(huán)控制指令、相關(guān)堆棧指令及其他各種指令。本節(jié)將按照類型分別介紹各條指令的功能、指令代碼及其使用。 3.2匯編指令系統(tǒng)及應(yīng)用舉例3. 2.1數(shù)據(jù)傳送指令這組指令主要用于CPU 寄存器、立即數(shù)、內(nèi)部存儲器單元之間的數(shù)據(jù)傳送。在讀入、存儲和數(shù)據(jù)傳送時指令會根據(jù)數(shù)據(jù)的值自動更新條件碼,這使得BEQ、BNE、BPL 和BMI 等指令不需要運行特殊的測試或比

14、較指令就可以立即進行條件轉(zhuǎn)移。3.2匯編指令系統(tǒng)及應(yīng)用舉例1.LDA指令將存儲器的數(shù)值送到累加器A中 2.LDHX指令 將存儲器的數(shù)值傳送到變址寄存器H:X 3.LDX指令 將存儲器的數(shù)值送到寄存器X(變址寄存器) 4.STA指令 將累加器A的內(nèi)容傳送到存儲器中 3.2匯編指令系統(tǒng)及應(yīng)用舉例5.STHX指令 將變址寄存器H:X的內(nèi)容送到目的地址 6.STX指令 將變址寄存器X內(nèi)容送到目的地址 7.MOV指令 將存儲器內(nèi)容送到目的地址 8.TAX指令 將累加器A的內(nèi)容送到變址寄存器X中 3.2匯編指令系統(tǒng)及應(yīng)用舉例9.TXA指令 將變址寄存器X的內(nèi)容送到累加器中 10.TAP指令 將累加器A的內(nèi)

15、容送到寄存器CCR中 11.TPA指令將寄存器CCR的內(nèi)容送到累加器A中 12.NSA指令半字節(jié)交換累加器A的數(shù)值 3.2匯編指令系統(tǒng)及應(yīng)用舉例13.BSET指令 將存儲器opr8a中的第n位置1 14.BCLR指令 將存儲器opr8a中的第n位清0 3.2匯編指令系統(tǒng)及應(yīng)用舉例例如:LDA #$55 ;將十六進制立即數(shù)55送到累加器A中LDA $01 ;將$01單元中的內(nèi)容送入累加器A 中(尋址范圍:256B)LDHX #%010111111010 ;將二進制立即數(shù)送入變址寄存器H:X中LDHX $20 ;將$20單元的內(nèi)容送入變址寄存器H,將$20+1單元的內(nèi)容送入變址寄存器X中3.2匯編

16、指令系統(tǒng)及應(yīng)用舉例LDX PTAPE ;將PTAPE單元的內(nèi)容送入變址寄存器X中LDX #$5A ;將十六進制數(shù)5A送入變址寄存器X中STA PTAD ;將累加器A的內(nèi)容送至PTAD寄存器中STA X ;將累加器A的內(nèi)容送至X寄存器中3.2匯編指令系統(tǒng)及應(yīng)用舉例STX PTEDD ;將變址寄存器X內(nèi)容送到PTEDD寄存器STX DATA ;將變址寄存器X內(nèi)容送到變量DATAMOV #$03,PTAD ; 將十六制立即數(shù)03傳送給寄存器PTAD中 MOV #$0F,PTADD ; 將十六制立即數(shù)0F傳送給寄存器PTADD中3.2匯編指令系統(tǒng)及應(yīng)用舉例LDA #$55 ;將十六進制立即數(shù)55送到累

17、加器A中 TAX ;將累加器內(nèi)容55送到變址寄存器X中LDA #$55 ;將十六進制立即數(shù)55送到累加器A中 TAP ;將累加器內(nèi)容送到寄存器CCR中3.2匯編指令系統(tǒng)及應(yīng)用舉例BSET 1,PTAD ;將寄存器PTAD的第1位置1BSET 7,PTCDD ;將寄存器PTCDD的第7位置1BSET TE,SCI1C2 ;將寄存器SCI1C2的第TE位置1BCLR 2,PTCD ;將寄存器PTCD的第2位清03.2匯編指令系統(tǒng)及應(yīng)用舉例3.2.2 算術(shù)運算指令算術(shù)運算指令包含了傳統(tǒng)的加、減、乘和除操作,還包含常用的指令,如加一、減一、清零、求補(2 進制補碼)、比較、測試和為處理BCD 碼的十進

18、制調(diào)整指令。比較指令實際上就是減操作,影響CCR 狀態(tài)位但結(jié)果不返回到CPU 寄存器。測試指令影響著N和Z 位,但是不影響被測試的數(shù)據(jù)。3.2匯編指令系統(tǒng)及應(yīng)用舉例1.ADC指令 帶進位的加法運算 2. ADD指令 不帶進位的加法運算 3.AIX指令 變址寄存器H:X的內(nèi)容加上立即數(shù)再送入變址寄存器中, AIX 指令不影響CCR 位4.SUB指令 將累加器A 中的數(shù)據(jù)減去存儲器中的數(shù)據(jù),然后將結(jié)果存儲到累加器A中。對于這個指令,進位狀態(tài)位是借位指示器, 3.2匯編指令系統(tǒng)及應(yīng)用舉例5.SBC指令 將累加器A 中的數(shù)據(jù)減去由前一次操作所影響的借位,再減去存儲器中的數(shù)據(jù),然后將結(jié)果存儲回寄存器A

19、中 6MUL指令 將寄存器X 中無符號8 位2 進制數(shù)與累加器A 中的無符號的8 位2 進制數(shù)相乘,然后存儲16 位結(jié)果到X:A 中,高8 位的結(jié)果存儲在X 中,低8 位存儲在A中。這種情況下不可能發(fā)生進位(或者是溢出),其結(jié)果將總是適合X:A 的大小。因此進行這個操作后C 將被清零。 3.2匯編指令系統(tǒng)及應(yīng)用舉例7DIV指令 將H:A 中16位無符號數(shù)值除以X中無符號的8位數(shù)值,所得的結(jié)果(8位)存儲到累加器A中,余數(shù)存儲到H 寄存器中。在計算中,X 中的除數(shù)數(shù)值無變化,因此它能夠在隨后的操作中繼續(xù)被使用。如果商為0 則Z 標(biāo)志被置1。如果商大于255 就會有溢出發(fā)生,發(fā)生溢出或除數(shù)為0時C

20、 位將被置1。 3.2匯編指令系統(tǒng)及應(yīng)用舉例8INC指令 操作數(shù)自加 9DEC指令 操作數(shù)自減1 10CLR指令 操作數(shù)清零 11.NEG指令 取補指令執(zhí)行了二進制數(shù)的補碼操作,求補指令等同于將一個8 位有符號數(shù)乘以-1。功能上等同于將寄存器A、X 或者存儲器中的數(shù)據(jù)全部取反,然后加一。 3.2匯編指令系統(tǒng)及應(yīng)用舉例12.CMP指令 CMP 指令是將累加器A的內(nèi)容與存儲器的內(nèi)容進行比較,所得的結(jié)果會影響CCR寄存器的位,但其結(jié)果不會存儲回累加器A中,因此累加器A和存儲器的數(shù)值在運算后是不發(fā)生變化的。注意,比較指令是比較累加器A、變址寄存器X (或H:X)的內(nèi)容與存儲器中的內(nèi)容。 3.2匯編指令

21、系統(tǒng)及應(yīng)用舉例13.CPHX指令 在CPHX 指令執(zhí)行時,存儲單元M指向存儲單元位置的首地址,變址寄存器H與存儲器位置M相對應(yīng),變址寄存器X與存儲器位置M+1 相對應(yīng)。CPHX 執(zhí)行一個16 位減法指令時,存儲結(jié)果不返回H:X 中。 3.2匯編指令系統(tǒng)及應(yīng)用舉例14.CPX指令 將X變址寄存器和存儲單元相比較,運算后CCR寄存器相應(yīng)的位會發(fā)生變化,但操作數(shù)不改變 15.TST指令 該指令用于測試?yán)奂悠鰽、變址寄存器X、存儲單元的值是否小于等于0,它執(zhí)行減0的操作,但不改變原操作數(shù)的值,只是根據(jù)結(jié)果改變CCR寄存器的N、Z標(biāo)志位。 3.2匯編指令系統(tǒng)及應(yīng)用舉例16.DAA指令 該指令用于BCD碼

22、的調(diào)整。在BCD 碼數(shù)值中,用十六進制數(shù)表示十進制數(shù)值0 9。當(dāng)兩個8 位的BCD 數(shù)值相加時,CPU 實際上執(zhí)行的是普通的二進制加法,對于BCD 碼,這個運算結(jié)果可能不再是一個有效的BCD 碼了。DAA 指令根據(jù)加法(ADD 或ADC )指令運算所改變的標(biāo)志位(如H 和C標(biāo)志位)對結(jié)果進行修正,使其結(jié)果成為有效的BCD 數(shù)值 ,而且還修正了C 標(biāo)志位的內(nèi)容,使其正確的表示使用BCD 加法后的結(jié)果。在早期的單片機系統(tǒng)中,由于還沒出現(xiàn)該條指令,要完成這些操作是非常復(fù)雜的過程,而現(xiàn)在,DAA 指令則能很簡單的完成這個操作。 3.2匯編指令系統(tǒng)及應(yīng)用舉例;-CMP指令例子 LDA #$0F CMP

23、#$3F MOV #$0E,VOLM CMP VOLM LDHX #$0005 CMP ,X 結(jié)果是? 3.2匯編指令系統(tǒng)及應(yīng)用舉例;-NEGA指令例子 LDA #$02 NEGA NEG VOLM NEGX LDHX #$0021 NEG ,X 結(jié)果是?3.2匯編指令系統(tǒng)及應(yīng)用舉例 ;-CPHX指令例子 LDHX #$0080 STA ,X INCX STA ,X LDHX #$0201 CPHX VOLM結(jié)果是? 3.2匯編指令系統(tǒng)及應(yīng)用舉例 ;-CPX指令例子 LDX #$05 CPX #$04 ;-TST指令例子 LDA #$01 TSTA LDX #$00 TSTX結(jié)果是?3.2匯編

24、指令系統(tǒng)及應(yīng)用舉例3.2.3 邏輯操作指令這組指令執(zhí)行8 位操作數(shù)的并行布爾運算,包括與操作、或操作、異或操作、取反操作和位測試操作。取反指令是將指定的寄存器或者存儲器中的操作數(shù)按位取反,其他邏輯指令均包括了兩個操作數(shù),一個是累加器A,另一個是存在存儲器中。立即尋址、直接尋址、擴展尋址或變址尋址等尋址方式都可應(yīng)用該組指令來訪問操作數(shù)。注意,累加器A的每個位都可執(zhí)行與、或和異或操作,操作的結(jié)果返回累加器A中,覆蓋原來的操作數(shù)。3.2匯編指令系統(tǒng)及應(yīng)用舉例1.AND指令 該指令進行邏輯與操作,將累加器A中的內(nèi)容與相應(yīng)的操作數(shù)進行按位與操作,再將操作結(jié)果存入累加器A中,同時把CCR寄存器中的標(biāo)志位V

25、清為0,影響N、Z標(biāo)志位,對其他標(biāo)志位無影響 3.2匯編指令系統(tǒng)及應(yīng)用舉例2.ORA指令 該指令進行邏輯或操作,將累加器A中的內(nèi)容與相應(yīng)的操作數(shù)進行按位或操作,再將操作結(jié)果存入累加器A中,結(jié)果對CCR寄存器的影響同AND指令一樣。 3.EOR指令 該指令進行邏輯異或操作,將累加器A中的內(nèi)容與相應(yīng)的操作數(shù)進行按位異或操作,再將操作結(jié)果存入累加器A中,結(jié)果對CCR寄存器的影響同AND指令一樣。 3.2匯編指令系統(tǒng)及應(yīng)用舉例4.COM指令 該指令進行取反操作,該指令簡單地轉(zhuǎn)換操作數(shù)的每個位,但與求補指令是不同的,取反指令執(zhí)行的是一條算術(shù)運算指令,即等效于與一個 -1 相乘。 3.2匯編指令系統(tǒng)及應(yīng)用

26、舉例5.BIT指令 該指令進行位測試,將相應(yīng)存儲地址中的操作數(shù)與累加器A的每個位進行“與操作”,但是結(jié)果不存儲在累加器A中。在執(zhí)行位測試指令后,根據(jù)“與操作”的結(jié)果來置位或清零CCR條件碼寄存器的N 和Z 位,以實現(xiàn)條件跳轉(zhuǎn)。如果使用“掩碼”方法進行編程,則掩碼中的每個對應(yīng)位將被測試,執(zhí)行BIT位測試指令后,若測試位均不是1,則Z 位被置位。 3.2匯編指令系統(tǒng)及應(yīng)用舉例;-DAA指令例子 LDA #$0E ADD #$06 DAA ;-AND指令例子 LDA #$5B AND #$0F LDHX #$0080 AND ,X 3.2匯編指令系統(tǒng)及應(yīng)用舉例 ;-ORA指令例子 LDA #$0C

27、ORA #$0A ;-EOR指令例子 LDA #$5A EOR #$03 STA VOLM ;-COM指令例子 LDA #$05 COMA 3.2匯編指令系統(tǒng)及應(yīng)用舉例 ;-BIT指令例子 LDA #$02 MOV #$01,VOLM BIT VOLM 3.2匯編指令系統(tǒng)及應(yīng)用舉例3.2.4 移位指令移位指令的操作是在9位的空間上進行的,這個空間是由8 位的累加器A、變址寄存器X 或者存儲單元和CCR寄存器中的C 位組成。移位指令的操作包括邏輯左移、邏輯右移、算術(shù)左移、算術(shù)右移、循環(huán)左移和循環(huán)右移等操作 3.2匯編指令系統(tǒng)及應(yīng)用舉例 1. LSL指令 該指令進行邏輯左移操作,就是簡單地把0移位

28、到有效值的最低位b0,有效值的最高位b7移到進位C中 3.2匯編指令系統(tǒng)及應(yīng)用舉例2.LSR指令 該指令進行邏輯右移,就是簡單地把0移位到有效值的最高位b7,有效值的最低位移b0到進位C中 3.2匯編指令系統(tǒng)及應(yīng)用舉例3.ASL指令 該指令進行算術(shù)左移(和LSL相似),類似于乘2 操作,在功能上與LSL指令沒有較大的區(qū)別 3.2匯編指令系統(tǒng)及應(yīng)用舉例4.ASR指令 該指令進行算術(shù)右移,類似于除2 操作。算術(shù)右移(ASR)指令復(fù)制最初的最高有效位(b7)返回到b7,以保護操作數(shù)符號 3.2匯編指令系統(tǒng)及應(yīng)用舉例5.ROL指令 該指令進行循環(huán)左移,就是簡單地將有效值的最高位b7移位到進位C,進位C

29、原來的值移位到有效值的最低位b0,其余各位向左移一位 3.2匯編指令系統(tǒng)及應(yīng)用舉例6.ROR指令 該指令進行循環(huán)右移,就是簡單地將有效值的最低位b0移位到進位C,進位C原來的值移位到有效值的最高位b7,其余各位向右移一位 3.2匯編指令系統(tǒng)及應(yīng)用舉例 ;-LSL指令例子 LDA #$01 LSLA LSLA ;-LSR指令例子 LDA #$80 LSRA LSRA3.2匯編指令系統(tǒng)及應(yīng)用舉例3.2.5 轉(zhuǎn)移類指令這組指令分類有條件轉(zhuǎn)移類指令和無條件轉(zhuǎn)移類指令。有條件轉(zhuǎn)移指令在條件滿足時轉(zhuǎn)移到程序計數(shù)器PC指定的相應(yīng)地址處執(zhí)行,否則順序執(zhí)行程序。有條件轉(zhuǎn)移類指令又可分為累加器A比較相等轉(zhuǎn)移指令、

30、減1不為轉(zhuǎn)移指令、CCR轉(zhuǎn)移指令、位測試轉(zhuǎn)移指令等。無條件轉(zhuǎn)移指令(也稱跳轉(zhuǎn)指令)則無條件限制,直接轉(zhuǎn)移到程序計數(shù)器PC指定的地址處執(zhí)行程序,例如,BRA、JMP指令。另外,循環(huán)控制指令也屬于有條件轉(zhuǎn)移類指令的范疇。3.2匯編指令系統(tǒng)及應(yīng)用舉例有條件轉(zhuǎn)移指令和循環(huán)控制指令都使用了相對尋址方式,有條件地轉(zhuǎn)移到一個與轉(zhuǎn)移相關(guān)的位置。CCR寄存器根據(jù)條件分支或循環(huán)控制指令,決定執(zhí)行新的地址還是繼續(xù)順序執(zhí)行下一條指令。注意,BRA指令是個特殊的指令,因為無條件轉(zhuǎn)移總是會發(fā)生;BRN指令也一樣,因為無條件轉(zhuǎn)移從不發(fā)生;BIL 和BIH指令也是很特別的,是因為它們決定是否需要轉(zhuǎn)移,查看IRQ引腳的狀態(tài)而不

31、是CCR寄存器中的條件位。3.2匯編指令系統(tǒng)及應(yīng)用舉例1.JMP指令 JMP指令是將其后面所接的操作數(shù)為地址值送至16位程序計數(shù)器PC,使程序跳至該指令所指定的地址處執(zhí)行,該指令可以實現(xiàn)64KB($0000$FFFF)空間任一有效地址的跳轉(zhuǎn)。它具有5種尋址方式,而且不影響CCR寄存器的標(biāo)志位。 3.2匯編指令系統(tǒng)及應(yīng)用舉例2.BRA指令 該指令是無條件轉(zhuǎn)移指令的其中一種,只有相對尋址方式(REL),實現(xiàn)無條件相對轉(zhuǎn)移,由于是相對尋址,本身又為2字節(jié)指令,故其無條件相對轉(zhuǎn)移的范圍為相對于存放BRA機器指令碼地址的-126+129字節(jié)空間。 3.2匯編指令系統(tǒng)及應(yīng)用舉例3.BRN指令 該指令無條件

32、不轉(zhuǎn)移,即是不具有任何轉(zhuǎn)移功能,它只是消耗3個總線周期的空操作。 3.2匯編指令系統(tǒng)及應(yīng)用舉例4.BEQ指令 該指令主要用于表格查找子程序的快速跳轉(zhuǎn),它檢測累加器A中的值是否與某一立即數(shù)或存儲單元的值相等,若相等則CC寄存器的Z標(biāo)志位被置為1,如果(Z)=1則使程序轉(zhuǎn)移到指令所指定的地址處執(zhí)行,否則順序執(zhí)行下一指令,它不改變?nèi)魏卧僮鲾?shù)的值。 3.2匯編指令系統(tǒng)及應(yīng)用舉例5.BNE指令 該指令的功能恰好與BEQ指令相反,若累加器A中的值與某一立即數(shù)或存儲單元的值不相等則轉(zhuǎn)移指令。 3.2匯編指令系統(tǒng)及應(yīng)用舉例6.BCC指令 該指令根據(jù)CC寄存器的進位標(biāo)志位C的情況決定是否轉(zhuǎn)移,若進位為0則轉(zhuǎn)移

33、,否則順序執(zhí)行程序。 3.2匯編指令系統(tǒng)及應(yīng)用舉例7.BCS指令 該指令的功能恰好與BCC指令相反,若進位為1則轉(zhuǎn)移指令,否則順序執(zhí)行程序。 8.BPL指令 該指令根據(jù)CC寄存器的負(fù)標(biāo)志位N的情況決定是否轉(zhuǎn)移,若負(fù)標(biāo)志位N=0則轉(zhuǎn)移,否則順序執(zhí)行程序。 3.2匯編指令系統(tǒng)及應(yīng)用舉例9.BMI指令 該指令的功能恰好與BPL指令相反,若負(fù)標(biāo)志位N=1則轉(zhuǎn)移,否則順序執(zhí)行程序。 10.BIL指令 該指令根據(jù)IRQ引腳電平的高低來決定是否進行轉(zhuǎn)移操作,如果IRQ引腳為低電平則程序計數(shù)器PC轉(zhuǎn)移至指定的地址處執(zhí)行程序。 3.2匯編指令系統(tǒng)及應(yīng)用舉例11.BIH指令 該指令的功能恰好與BIL指令相反,如果

34、IRQ引腳為高電平則程序計數(shù)器PC轉(zhuǎn)移至指定的地址處執(zhí)行程序。 12.BMC指令 該指令根據(jù)CC寄存器的中斷屏蔽標(biāo)志位I的情況決定是否轉(zhuǎn)移,若中斷屏蔽標(biāo)志位I=0則轉(zhuǎn)移,否則順序執(zhí)行程序 3.2匯編指令系統(tǒng)及應(yīng)用舉例13.BMS指令 該指令的功能恰好與BMC指令相反, 若中斷屏蔽標(biāo)志位I=1則轉(zhuǎn)移,否則順序執(zhí)行程序。 14BHCC指令 該指令根據(jù)CC寄存器的半進位標(biāo)志位H的情況決定是否轉(zhuǎn)移,若半進位標(biāo)志位H=0則轉(zhuǎn)移,否則順序執(zhí)行程序。 3.2匯編指令系統(tǒng)及應(yīng)用舉例15BHCS指令 該指令的功能恰好與BHCC指令相反,根據(jù)CC寄存器的半進位標(biāo)志位H的情況決定是否轉(zhuǎn)移,若半進位標(biāo)志位H=1則轉(zhuǎn)移

35、,否則順序執(zhí)行程序。 3.2匯編指令系統(tǒng)及應(yīng)用舉例16BLT指令 該指令根據(jù)CC寄存器的溢出標(biāo)志位V和負(fù)標(biāo)志位N的情況決定是否轉(zhuǎn)移,若溢出標(biāo)志位V和負(fù)標(biāo)志位N狀態(tài)不一致時則轉(zhuǎn)移,否則順序執(zhí)行程序。也就是兩個操作數(shù)進行比較,若前一個操作數(shù)小于后一個操作數(shù)則轉(zhuǎn)移。該指令通常與比較指令、減法運算指令配合使用。 3.2匯編指令系統(tǒng)及應(yīng)用舉例17BLE指令 該指令根據(jù)CC寄存器的零標(biāo)志位Z、溢出標(biāo)志位V和負(fù)標(biāo)志位N的情況決定是否轉(zhuǎn)移,若(Z) | (N V) = 1時則轉(zhuǎn)移,否則順序執(zhí)行程序。也就是兩個操作數(shù)進行比較,若前一個操作數(shù)小于或等于后一個操作數(shù)則轉(zhuǎn)移,同樣該指令也與比較指令、減法運算指令配合使

36、用。 3.2匯編指令系統(tǒng)及應(yīng)用舉例18BGE指令 該指令根據(jù)CC寄存器溢出標(biāo)志位V和負(fù)標(biāo)志位N的情況決定是否轉(zhuǎn)移,若 (N V) = 0時則轉(zhuǎn)移,否則順序執(zhí)行程序。也就是兩個操作數(shù)進行比較,若前一個操作數(shù)大于或等于后一個操作數(shù)則轉(zhuǎn)移。 3.2匯編指令系統(tǒng)及應(yīng)用舉例19BGT指令 該指令的功能與BLT指令相反,它根據(jù)CC寄存器的零標(biāo)志位Z、溢出標(biāo)志位V和負(fù)標(biāo)志位N的情況決定是否轉(zhuǎn)移,若(Z) | (N V) = 0時則轉(zhuǎn)移,也就是兩個操作數(shù)進行比較,若前一個操作數(shù)大于后一個操作數(shù)則轉(zhuǎn)移。同樣該指令也與比較指令、減法運算指令配合使用 3.2匯編指令系統(tǒng)及應(yīng)用舉例20BLO指令 該指令根據(jù)CC寄存器

37、的進位標(biāo)志位C的情況決定是否轉(zhuǎn)移,如果(C)=1,程序計數(shù)器PC則轉(zhuǎn)移。也就是兩個操作數(shù)進行比較,若前一個操作數(shù)小于后一個操作數(shù)則轉(zhuǎn)移,它與BCS指令相似。 3.2匯編指令系統(tǒng)及應(yīng)用舉例21BLS指令 該指令根據(jù)CC寄存器的進位標(biāo)志位C和零標(biāo)志位Z的情況決定是否轉(zhuǎn)移,如果(C) | (Z) = 1,程序計數(shù)器PC則轉(zhuǎn)移。也就是兩個操作數(shù)進行比較,若前一個操作數(shù)小于或等于后一個操作數(shù)則轉(zhuǎn)移。 3.2匯編指令系統(tǒng)及應(yīng)用舉例22BHS指令 該指令根據(jù)CC寄存器的進位標(biāo)志位C的情況決定是否轉(zhuǎn)移,如果(C) = 0,程序計數(shù)器PC則轉(zhuǎn)移。也就是兩個操作數(shù)進行比較,若前一個操作數(shù)大于或等于后一個操作數(shù)則轉(zhuǎn)

38、移,它與BCC指令相似, 3.2匯編指令系統(tǒng)及應(yīng)用舉例23BHI指令 該指令根據(jù)CC寄存器的進位標(biāo)志位C和零標(biāo)志位Z的情況決定是否轉(zhuǎn)移,如果(C) | (Z) = 0,程序計數(shù)器PC則轉(zhuǎn)移。也就是兩個操作數(shù)進行比較,若前一個操作數(shù)大于后一個操作數(shù)則轉(zhuǎn)移。 3.2匯編指令系統(tǒng)及應(yīng)用舉例24BRCLR指令 該指令是根據(jù)存儲單元的位的狀態(tài)來決定是否轉(zhuǎn)移,如果存儲單元中第n位為0則轉(zhuǎn)移 25BRSET指令 該指令的功能與BRCLR指令相反,如果存儲單元中第n位為1則轉(zhuǎn)移指令 3.2匯編指令系統(tǒng)及應(yīng)用舉例CBEQ指令 CBEQ 指令是比較累加器A和某個存儲單元的內(nèi)容,如果它們彼此相等就轉(zhuǎn)移至指定的地址處

39、執(zhí)行。即是兩操作數(shù)相比較,相等則轉(zhuǎn)移。注意,CBEQA指令是累加器A與一個立即數(shù)相比較,CBEQX 指令是變址寄存器X與一個立即數(shù)相比較。CBEQ 指令采用變址尋址方式時,當(dāng)比較累加器A和變址存儲單元的內(nèi)容后,變址寄存器H:X 會自動加1。 3.2匯編指令系統(tǒng)及應(yīng)用舉例27DBNZ 該指令是累加器A、變址寄存器X或存儲單元的內(nèi)容先進行減1操作,再判斷結(jié)果是否為0,如果不為0則程序計數(shù)器PC轉(zhuǎn)移指定的地址處執(zhí)行程序。 3.2匯編指令系統(tǒng)及應(yīng)用舉例JMP LOOP ;跳轉(zhuǎn)到標(biāo)號LOOPBRA Wei ;無條件轉(zhuǎn)移到標(biāo)號 WeiCMP PTAD ; 寄存器PTAD與累加器相比較BEQ YY ;兩者比

40、較若相等,(Z)=1,則轉(zhuǎn)移到標(biāo)號YCMP PTBD ; 寄存器PTBD與累加器相比較 BNE JJ ;兩者比較若不相等,(Z)=0,則轉(zhuǎn)移到標(biāo)號JJ3.2匯編指令系統(tǒng)及應(yīng)用舉例BPL TK ;如果(N)=0則轉(zhuǎn)移到標(biāo)號TKBMI TT ;如果(N)=1則轉(zhuǎn)移到標(biāo)號TTBIH DELAY ;如果IRQ引腳=1,則程序計數(shù)器PC轉(zhuǎn)移至標(biāo)號 DELAY CLI ;把CC寄存器的中斷屏蔽標(biāo)志位I清0BMC LOOP ;經(jīng)過上一條指令的執(zhí)行,(I)=0,則程序計數(shù)器 PC轉(zhuǎn)移至標(biāo)號LOOPCLI;把CC寄存器的中斷屏蔽標(biāo)志位I清0 BMC LOOP;經(jīng)過上一條指令的執(zhí)行,(I)=0,則程 序計數(shù)器PC

41、沒有轉(zhuǎn)移到 標(biāo)號LOOP,而是 順序執(zhí)行下一條指令 LDA #$0A;這時程序計數(shù)器PC跳到此處執(zhí)行3.2匯編指令系統(tǒng)及應(yīng)用舉例ADD #$01;累加器A的內(nèi)容加上二進制立即數(shù)00000001 BHCC KEY ;假設(shè)累加器A的內(nèi)容00001111,運算后(H)=1,累加器A的內(nèi)容00010000,此時程序計數(shù)器PC不轉(zhuǎn)移至標(biāo)號KEY STA PTAD ;程序計數(shù)器PC繼續(xù)順序執(zhí)行程ADD #$01;累加器A的內(nèi)容加上二進制立即數(shù)00000001 BHCS KEY ;假設(shè)累加器A的內(nèi)容00001111,運算后(H)=1,累加器A的內(nèi)容00010000,此時程序計數(shù)器PC轉(zhuǎn)移至標(biāo)號KEYCPM

42、#$08 ; 將累加器A的內(nèi)容與十六進制立即數(shù)08進行比較 BLT LK ;若累加器A的內(nèi)容小于十六進制立即數(shù)08,(N V ) =1,程序計數(shù)器PC轉(zhuǎn)移至標(biāo)號LK3.2匯編指令系統(tǒng)及應(yīng)用舉例 SUB #$02;將累加器A的內(nèi)容減去十六進制立 即數(shù)02 BGE YY ;如果累加器A的內(nèi)容大于或等于十六 進制立即數(shù),取02 (N V) = 0, 程序計數(shù)器PC 轉(zhuǎn)移至標(biāo)號YYCPM #$09;將累加器A的內(nèi)容與十六進制數(shù)09 相比較 BGE YY ;如果累加器A的內(nèi)容大于十六進制數(shù)09, (Z) | (N V) = 0,程 序計數(shù)器PC 轉(zhuǎn)移至標(biāo)號YYSUB #$02;將累加器A的內(nèi)容減去十六進

43、制立即數(shù)02 BLO WW ;假設(shè)累加器A的內(nèi)容小于十六進制數(shù)02,(C) =1,程序計數(shù)器PC 轉(zhuǎn)移至標(biāo)號WW3.2匯編指令系統(tǒng)及應(yīng)用舉例3.2.6 相關(guān)堆棧指令堆棧指令包括入棧指令和出棧指令。HCS08系列單片機的堆棧指令只能將累加器A、變址寄存器H:X中的內(nèi)容壓入堆棧,或者將堆棧中的內(nèi)容彈出到累加器A、變址寄存器H:X中。入棧操作按照先壓入,后堆棧指針寄存器SP減1的規(guī)則;出棧操作先執(zhí)照堆棧指針寄存器SP加1,后彈出的規(guī)則。它不影響CCR寄存器的標(biāo)志位。3.2匯編指令系統(tǒng)及應(yīng)用舉例1RSP指令堆棧指針復(fù)位(RSP)指令的操作是采用隱含尋址方式,它兼容于早期的M6805系列單片機。該指令使

44、用存儲單元$FF加載到堆棧指針寄存器SP 的低8 位,但不影響堆棧指針寄存器SP的高8 位。在早期的體系結(jié)構(gòu)中,SP寄存器的高8 位難以改為$00,因此RSP 需要強迫堆棧指針寄存器SP復(fù)位到其原始狀態(tài)($00FF)。在HCS08 系列中,$00FF 很少被用來作為堆棧的起始指針。所以,也不能夠確定高半部分會保持$00,因此,RSP 在新的HCS08 程序中通常不是太常用。 3.2匯編指令系統(tǒng)及應(yīng)用舉例2PSHA 指令該指令將累加器A的內(nèi)容壓入堆棧,然后堆棧指針寄存器SP自減1。 3PSHH指令 該指令將變址寄存器H的內(nèi)容壓入堆棧,然后堆棧指針寄存器SP自減1。 4PSHX指令 該指令將變址寄

45、存器X壓入堆棧,堆棧指針寄存器SP自減1。 3.2匯編指令系統(tǒng)及應(yīng)用舉例5PULA指令 該指令將累加器A的內(nèi)容出棧,指令執(zhí)行的步驟是:堆棧指針寄存器SP自加1,再把累加器A的內(nèi)容彈出 6PULH指令 該指令將變址寄存器H的內(nèi)容出棧,指令執(zhí)行的步驟是:堆棧指針寄存器SP自加1,再把變址寄存器H的內(nèi)容彈出。 3.2匯編指令系統(tǒng)及應(yīng)用舉例7PULX指令 該指令將變址寄存器X的內(nèi)容出棧,指令執(zhí)行的步驟是:堆棧指針寄存器SP自加1,再把變址寄存器X的內(nèi)容彈出 8AIS指令 該指令是將堆棧指針寄存器SP加上立即數(shù),所得的結(jié)果作為新的堆棧指針指向的地址。 3.2匯編指令系統(tǒng)及應(yīng)用舉例LDHX #$107F;

46、將十六進制立即數(shù)107F送至變址寄存器 H:XTXS;將變址寄存器H:X送至堆棧指針寄存器SP,此 時,堆棧就處于存儲器中107F地址處LDA #$08;將十六進制數(shù)08適至累加器APSHA;累加器A的內(nèi)容壓入堆棧,堆棧指針寄存 器SP自減1,執(zhí)行完 這條指令后,存儲單 元107F的內(nèi)容為累加器A的內(nèi)容08,堆棧 指針寄存器SP指向的地址為107EPULA;堆棧指針寄存器SP自加1后指向的地址為 107F,而存儲單元107F 的內(nèi)容為08,再 把存儲單元107F的內(nèi)容傳至累加器 3.2匯編指令系統(tǒng)及應(yīng)用舉例3.2.7 其他各種指令1TST指令 該指令用于測試?yán)奂悠鰽、變址寄存器X和存儲單元的內(nèi)

47、容是否小于等于0,它執(zhí)行減0操作,但不改變操作數(shù)的內(nèi)容,只是根據(jù)結(jié)果改變N、Z標(biāo)志位。 3.2匯編指令系統(tǒng)及應(yīng)用舉例2TSX指令 該指令的功能恰好與TXS指令相反,將堆棧指針寄存器SP的內(nèi)容傳至到變址寄存器H:X。它采用隱含尋址方式尋址。使用該指令后,若要在隨后的程序訪問堆棧中的變量時,可以用TXS指令恢復(fù)堆棧指針寄存器SP的內(nèi)容,這在效率上比應(yīng)用相關(guān)變址指令有微小的優(yōu)勢,因為堆棧指針寄存器SP在指向下一個堆??捎玫奈恢脮r,指針值會自動加1,很明顯,這個操作占用了時間,因此TSX指令會比變址指令快。 3.2匯編指令系統(tǒng)及應(yīng)用舉例3JSR指令 該指令使程序計數(shù)器PC跳轉(zhuǎn)至子程序標(biāo)號處執(zhí)行,執(zhí)行完

48、子程序后再返回原先的地址處繼續(xù)執(zhí)行。它具有5種尋址方式,可調(diào)用64KB地址空間中任一有效地址處的子程序。 該指令的執(zhí)行順序是:程序計數(shù)器PC加n。其中n的取值有1、2和3,具體依據(jù)該指令的尋址方式。此步驟的目的是待子程序結(jié)束返回時能使程序計數(shù)器PC正確指向該指令的下一條指令。把程序計數(shù)器PC的低8位值壓入堆棧,然后堆棧指針寄存器SP減1。把程序計數(shù)器PC的高8位值壓入堆棧,然后堆棧指針寄存器SP減1。把子程序標(biāo)號的地址傳送至程序計數(shù)器PC。3.2匯編指令系統(tǒng)及應(yīng)用舉例4BSR指令 該指令使程序計數(shù)器PC跳轉(zhuǎn)至子程序標(biāo)號處執(zhí)行轉(zhuǎn)移到子程序,執(zhí)行完子程序后再返回原先的地址處繼續(xù)執(zhí)行。它采用相對尋址

49、方式尋址,只能調(diào)用相對于本指令地址-126+129地址空間內(nèi)的子程序。該指令的執(zhí)行順序與JSR指令相似,區(qū)別是執(zhí)行該指令時,程序計數(shù)器PC是加2。 3.2匯編指令系統(tǒng)及應(yīng)用舉例5RTS指令 該指令也稱為子程序返回指令。通常,它在子程序的結(jié)尾,當(dāng)調(diào)用完子程序后,它使程序計數(shù)器PC指向調(diào)用處的下一條指令。該指令的執(zhí)行順序是:堆棧指針寄存器SP加1,程序計數(shù)器PC的高8位出棧。堆棧指針寄存器SP加1,程序計數(shù)器PC的低8位出棧。3.2匯編指令系統(tǒng)及應(yīng)用舉例6SWI 指令該指令也稱軟件中斷(SWI)指令,它和JSR 指令相似,但它要把程序計數(shù)器PC、變址寄存器X、累加器A 和CCR 寄存器中的內(nèi)容保存

50、到堆棧中,執(zhí)行完中斷服務(wù)子程序后可以返回上述幾個寄存器的值。該指令的執(zhí)行順序是:程序計數(shù)器PC加1,此步驟的目的是待子程序結(jié)束返回時能使程序計數(shù)器PC正確指向該指令的下一條指令。把程序計數(shù)器PC的低8位值壓入堆棧,然后堆棧指針寄存器SP減1。把程序計數(shù)器PC的高8位值壓入堆棧,然后堆棧指針寄存器SP減1。把變址寄存器X的值壓入堆棧,然后堆棧指針寄存器SP減1。把累加器A的值壓入堆棧,然后堆棧指針寄存器SP減1。把CCR 寄存器的值壓入堆棧,然后堆棧指針寄存器SP減1。屏蔽中斷標(biāo)志位I,即中斷標(biāo)志位I的值為1。把中斷地址的高8位傳送至程序計數(shù)器PC的高8位,把中斷地址的低8位傳送至程序計數(shù)器PC

51、的低8位。3.2匯編指令系統(tǒng)及應(yīng)用舉例7RTI 指令該指令也稱軟件中斷返回指令。一般地,它處在中斷服務(wù)程序的最后,當(dāng)執(zhí)行完中斷服務(wù)程序后,它恢復(fù)了CCR 寄存器、累加器A、變址寄存器X、程序計數(shù)器PC的值,之前這些寄存器按相反的順序被保存在堆棧中。該指令的執(zhí)行順序是:堆棧指針寄存器SP加1,CCR 寄存器的值出棧。堆棧指針寄存器SP加1,累加器A的值出棧。堆棧指針寄存器SP加1,變址寄存器X的值出棧。堆棧指針寄存器SP加1,程序計數(shù)器PC的高8位值出棧。堆棧指針寄存器SP加1,程序計數(shù)器PC的低8位值出棧。3.2匯編指令系統(tǒng)及應(yīng)用舉例8NOP指令 該指令也稱空操作指令,它沒有操作,只是用于產(chǎn)生

52、1個總線周期的延時。 9SEC指令 該指令設(shè)定CCR 寄存器的進位標(biāo)志位C為1,通常用于在執(zhí)行左移或右移指令前,改變進位標(biāo)志 3.2匯編指令系統(tǒng)及應(yīng)用舉例10CLC指令 該指令的功能恰好與SEC指令相反,它設(shè)定CCR 寄存器的進位標(biāo)志位C為0,通常用于在執(zhí)行左移或右移指令前,改變進位標(biāo)志 11SEI指令 該指令設(shè)定CCR 寄存器的中斷屏蔽標(biāo)志位I為1,主要用于禁止中斷。在上電復(fù)位或其它幾種復(fù)位開始,至堆棧指針和其他系統(tǒng)條件初始化之前的這段時間,可通過SET指令設(shè)置I 位為1來禁止中斷,以防意想不到的事件發(fā)生 3.2匯編指令系統(tǒng)及應(yīng)用舉例12CLI指令 該指令的功能恰好與SEI指令相反,它設(shè)定C

53、CR 寄存器的中斷屏蔽標(biāo)志位I為0,主要用于開戶中斷。當(dāng)完成系統(tǒng)初始化后,需要用CLI 指令來啟動中斷 3.2匯編指令系統(tǒng)及應(yīng)用舉例13BGND指令 該指令的用法特殊,用于CPU 停止執(zhí)行新指令且不知道要持續(xù)多長時間的情況,BGND指令通常被開發(fā)系統(tǒng)用于設(shè)置用戶調(diào)試程序,以實現(xiàn)軟件斷點。當(dāng)ENBDM=1時,進入背景調(diào)試狀態(tài)。相對于M68HC08系列單片機, BGND指令是HCS08的新增指令。普通用戶程序中不會使用BGND,因為它強制CPU 停止處理用戶指令而進入背景調(diào)試模式。要重新執(zhí)行用戶程序的唯一方法是通過復(fù)位,或由主機調(diào)試系統(tǒng)通過背景調(diào)試接口發(fā)出GO、TRACE1或AGGO等串行命令。3

54、.2匯編指令系統(tǒng)及應(yīng)用舉例14WAIT指令 該指令使CPU進入低功耗模式,使能中斷,接著處于等待中斷的狀態(tài)。該指令被執(zhí)行后,會引發(fā)CPU 關(guān)閉時鐘以節(jié)省功耗,但其他的外圍系統(tǒng)繼續(xù)運行,一旦有中斷源(外部的IRQ引腳或者來自內(nèi)部的外圍設(shè)備)到來,即可喚醒WAIT 模式下的CPU。另外,復(fù)位也可以喚醒WAIT 模式下的CPU 3.2匯編指令系統(tǒng)及應(yīng)用舉例15STOP指令 該指令與WAIT指令一樣,使CPU進入低功耗模式,使能中斷,停止處理相應(yīng)的MCU工作,接著處于等待中斷的狀態(tài)。該指令被執(zhí)行后,會強迫MCU 關(guān)掉所有的系統(tǒng)時鐘以減少系統(tǒng)功率,達到最小的功率。在這種模式下,振蕩器和時基模塊的雙穩(wěn)態(tài)多

55、諧振蕩器的時鐘均已停止,因此系統(tǒng)功耗減至最小狀態(tài) 3.2匯編指令系統(tǒng)及應(yīng)用舉例LDA#$0A;把十六進制數(shù)0A存入 累加器A中NOP ;沒有操作,1個總線周期NOP ;沒有操作,1個總線周期JSR DELAY ;調(diào)用子程序 DELAY3.3 偽指令匯編語言在源程序中使助記符和符號給編程帶來了極大的方便,同時也給匯編帶來了因難,因為匯編程序無法區(qū)分源程序中的符號是數(shù)據(jù)還是地址,也無法識別數(shù)據(jù)的類型,還不知道程序的定位、分段等情況。為了解決這些問題,匯編語言中專門設(shè)置了偽指令。偽指令只為匯編程序?qū)⒎栔噶罹幾g成機器指令碼提供信息,它們本身并不生成代碼,匯編工作結(jié)束后它們就不再存在。 偽指令是指令助

56、記符里保留的命令字, 它可以設(shè)置一段程序的起始地址,可以使一個標(biāo)號和一個值等同起來,可以確定程序變量在存儲器中的位置,也可以為RAM 變量預(yù)留空間,還可以控制打印、為編譯器配置選項等等。3.3 偽指令1BASE設(shè)定編譯器的缺省數(shù)進制一般地,編譯器默認(rèn)用十進制數(shù),但是有些編譯器默認(rèn)把沒有前綴的數(shù)字當(dāng)作16 進制數(shù)來處理。如果想使用十進制作為默認(rèn)的數(shù)進制,那么可在源文件的開頭使用BASE指令設(shè)置。 3.3 偽指令2INCLUDE指定附加源文件在編寫工程源代碼時,將一個工程項目的所有源代碼放在一個單獨的文件里往往是不恰當(dāng)?shù)?,如果編寫的源代碼太多,就不容易編輯和管理這個源代碼文件了,因此,可以將一個工

57、程項目拆分為兩個或更多的獨立源文件。而INCLUDE 偽指令就是這些獨立源文件的紐帶。一般地,在主源文件中使用INCLUDE 指令包含其他的源文件,當(dāng)編譯器遇到一個INCLUDE 指令時,它就會將附加源文件的內(nèi)容轉(zhuǎn)換到被包含的文件里,直到檢測測到一個文件的結(jié)束信息為止。該偽指令的常用用法是包含一個芯片的定義文件(有時被稱為通用文件)。這個文件定義了有關(guān)寄存器的相關(guān)地址,所以,在編寫源程序時能在項目里直接使用寄存器和位名。 3.3 偽指令3.NOLIST/LIST關(guān)閉或打開文件列表在將一個程序的源文件編譯成目標(biāo)代碼文件的同時,編譯器會讀一個源文件并且生成一個復(fù)合的列表文件。列表文件是一個包含了目

58、標(biāo)代碼和生成的行號以及原始文件信息的純文本文件。NOLIST 和LIST 指令允許控制列表文件的產(chǎn)生。這些指令通常應(yīng)用在編譯器處理MCU 的通用文件時壓縮列表 3.3 偽指令4ORG設(shè)置程序的起始位置在編譯過程中,編譯器保留一個“單元計數(shù)器”,這計數(shù)器可以跟蹤下一個可用的存儲單元以便存儲代碼和變量。ORG 指令可以將這個計數(shù)器設(shè)置為一個具體的地址值,在目標(biāo)文件里它不產(chǎn)生任何實際代碼,而是告訴編譯器下一字節(jié)的代碼或數(shù)據(jù)應(yīng)該存放的內(nèi)存空間位置。 3.3 偽指令5EQU賦值偽指令該指令告訴編譯器某個數(shù)值或地址與一個特定的符號聯(lián)系起來,表示符號與符號后的數(shù)值或地址是等值的。當(dāng)EQU偽指令把一數(shù)值或地址

59、定義為一個符號常量后,在源文件中就可以用該符號常量來表示該數(shù)值或地址,使程序非常清晰、直觀。 3.3 偽指令6dc.b定義存儲器中字節(jié)常量指令dc.b 用來定義存儲器的8 位常量。該指令設(shè)置了一個獨立的存儲器區(qū)域,讓其關(guān)聯(lián)于一個指定的8 位數(shù)值。該指令可以有一個與某個地址相關(guān)聯(lián)的標(biāo)號,而這個地址是用來存儲常量的。3.3 偽指令7dc.w在存儲器中定義16位常量dc.w 指令用來在存儲器中定義16 位的常量值,它設(shè)定了兩個存儲器單元用來存儲指定的16位數(shù)值,開頭的高8 位存儲在當(dāng)前單元計數(shù)器指向的地址,后面的低8 位存儲在下一個更高位的存儲器地址。這個指令有一個和地址相關(guān)聯(lián)的標(biāo)號,常量的高8 位

60、存儲在這個地址里。3.3 偽指令8ds.b/ ds.w定義存儲(保留)內(nèi)存變量字節(jié)指令ds.b 為指定的數(shù)值預(yù)留一個8 位存儲器單元,以便用來存儲程序變量;ds.w 指令為指定的程序變量預(yù)留16 位存儲器單元。這兩條指令不產(chǎn)生任何的目標(biāo)代碼。指令ds.b 使編譯器與單元計數(shù)器所指向的當(dāng)前地址相關(guān)聯(lián),之后按照ds.b 指令所設(shè)置的字節(jié)數(shù)調(diào)整單元計數(shù)器的值,單元計數(shù)器就指向了下一個可用的存儲器單元。它通常給一個指定的程序變量預(yù)留出存儲空間,也可給較大的數(shù)據(jù)結(jié)構(gòu)或表設(shè)置存儲空間。3.3 偽指令9標(biāo)號編譯器通過用戶自定義標(biāo)號可增強代碼的可讀性并且簡化編程工作。一個標(biāo)號只能定義一次,但是可以在一個程序中

溫馨提示

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

評論

0/150

提交評論