版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
單片機原理及其嵌入式應(yīng)用教程單片機原理及其嵌入式應(yīng)用教程06January2023單片機概述
26December2022單片機的發(fā)展單片機的發(fā)展處理器體系結(jié)構(gòu)_馮.諾依曼結(jié)構(gòu)存儲器有程序存儲器與數(shù)據(jù)存儲器,一般前者用ROM,后者用RAM,他們與CPU的連接有兩種方案:馮.諾依曼結(jié)構(gòu)和哈佛結(jié)構(gòu)。馮·諾伊曼結(jié)構(gòu),也稱普林斯頓結(jié)構(gòu),是一種將程序指令存儲器和數(shù)據(jù)存儲器合并在一起的存儲器結(jié)構(gòu)。程序指令存儲地址和數(shù)據(jù)存儲地址指向同一個存儲器的不同物理位置,因此程序指令和數(shù)據(jù)的寬度相同。馮·諾伊曼結(jié)構(gòu)計算機將代碼作為一種特殊的數(shù)據(jù)來操作。這種結(jié)構(gòu)方案如下圖:程序存儲器CPU數(shù)據(jù)存儲器Motorola公司的微處理器采用此種結(jié)構(gòu)存儲器統(tǒng)一編址處理器體系結(jié)構(gòu)_馮.諾依曼結(jié)構(gòu)存儲器有程序存儲器與數(shù)據(jù)存儲器哈佛結(jié)構(gòu)哈佛結(jié)構(gòu)是一種將程序指令存儲和數(shù)據(jù)存儲分開的存儲器結(jié)構(gòu)。中央處理器首先到程序指令存儲器中讀取程序指令內(nèi)容,解碼后得到數(shù)據(jù)地址,再到相應(yīng)的數(shù)據(jù)存儲器中讀取數(shù)據(jù),并進行下一步的操作(通常是執(zhí)行)。程序指令存儲和數(shù)據(jù)存儲分開,可以使指令總線和數(shù)據(jù)總線有不同的數(shù)據(jù)寬度,如Microchip公司的PIC16芯片的程序指令是14位寬度,而數(shù)據(jù)是8位寬度。Intel公司的MCS-51/96系列的單片機就是采用這種結(jié)構(gòu)這種結(jié)構(gòu)方案如下圖:程序存儲器CPU數(shù)據(jù)存儲器存儲器分離編址哈佛結(jié)構(gòu)哈佛結(jié)構(gòu)是一種將程序指令存儲和數(shù)據(jù)存儲分開的存儲器結(jié)I/O端口和寄存器的編址I/O端口分離編址:I/O端口獨立開辟一個空間,用專門的I/O訪問擴展線與指令實現(xiàn)I/O操作。如Intel公司的80×86指令系統(tǒng)有IN和OUT指令實現(xiàn)I/O口操作。I/O端口統(tǒng)一編址:將I/O地址與存儲器地址統(tǒng)一在一個空間,分配不同的地址。寄存器編址原則類似。Motorola微控制器的寄存器占用存儲器資源,為它們分配了一些專用的地址空間CPU程序存儲器數(shù)據(jù)存儲器I/O端口寄存器統(tǒng)一編址的體系結(jié)構(gòu)I/O端口和寄存器的編址I/O端口分離編址:I/O端口獨立開內(nèi)部時序內(nèi)部時序CPU08內(nèi)部時序由4相(節(jié)拍)組成,分別為T1、T2、T3、T4,各相輸出一個時鐘脈沖,相位差90°。每4拍組成一個CPU時鐘周期,可合并看成一個CPU總線時鐘。定義T1上升沿為CPU總線時鐘上升沿,地址總線上下一個新地址在T3上升沿開始有效。數(shù)據(jù)總線上的數(shù)據(jù)刷新與T1上升沿同步如總線時鐘頻率為8M,CPU的T節(jié)拍頻率就為32M,鎖相環(huán)時鐘發(fā)生電路或晶振電路需輸出32M的時鐘頻率。周期1周期2T1T2T3T4T1T2T3T4T1T2T3T4地址周期N數(shù)據(jù)周期N執(zhí)行周期CPU時鐘內(nèi)部地址總線內(nèi)部數(shù)據(jù)總線內(nèi)部時序內(nèi)部時序周期1周期2T1T2T3T4T1T2T3T4內(nèi)部時序內(nèi)部時序CPU08內(nèi)部時序由4相(節(jié)拍)組成,分別為T1、T2、T3、T4,各相輸出一個時鐘脈沖,相位差90°。每4拍組成一個CPU時鐘周期,可合并看成一個CPU總線時鐘。定義T1上升沿為CPU總線時鐘上升沿,地址總線上下一個新地址在T3上升沿開始有效。數(shù)據(jù)總線上的數(shù)據(jù)刷新與T1上升沿同步如總線時鐘頻率為8M,CPU的T節(jié)拍頻率就為32M,鎖相環(huán)時鐘發(fā)生電路或晶振電路需輸出32M的時鐘頻率。周期1周期2T1T2T3T4T1T2T3T4T1T2T3T4地址周期N數(shù)據(jù)周期N執(zhí)行周期CPU時鐘內(nèi)部地址總線內(nèi)部數(shù)據(jù)總線內(nèi)部時序內(nèi)部時序周期1周期2T1T2T3T4T1T2T3T4流水線技術(shù)流水線技術(shù)將每條指令分解為多步,并讓不同指令的各步操作重疊,從而實現(xiàn)幾條指令并行處理,以加速程序運行過程。例如將指令分為3步:取值譯碼執(zhí)行取指譯碼執(zhí)行取指譯碼執(zhí)行取指譯碼執(zhí)行T1T2T3T4T5T6采用流水線技術(shù)后,并沒有加速單條指令的執(zhí)行,但實現(xiàn)多條指令的不同步驟同時執(zhí)行,總體上加快了指令流速度縮短程序執(zhí)行時間取指譯碼執(zhí)行第一條指令第二條指令第三條指令第四條指令…流水線技術(shù)流水線技術(shù)將每條指令分解為多步,并讓不同指令的各步M68HC908GP32單片機基本結(jié)構(gòu)概述06January2023基本結(jié)構(gòu)概述M68HC908GP32單片機基本結(jié)構(gòu)概述26Decemb
MC68HC908GP32TBMADCKBICOPLVIBRKMONSCISPITIM1TIM2PORTAPORTBPORTCPORTDPORTE88782CPU08FlashRAMSIMIRQCGMC與HC05向下兼容的中央處理器模塊512BytesRAM32,292BytesFlash監(jiān)控模塊斷點模塊系統(tǒng)集成模塊外部中斷模塊正常操作監(jiān)視模塊低電壓禁止模塊32kHz時鐘發(fā)生器模塊時基模塊8個鍵盤中斷8通道/8-BitA/D轉(zhuǎn)換33個雙向I/O口所有I/O引腳允許10mA灌電流10mA拉電流兩個2通道16-Bit定時器
輸入捕捉
輸出比較
脈寬調(diào)制輸出PWM異步串行通信接口SCI同步串行外圍接口SPIDIP40,QFP44MC68HC908GP32TBMADCKBICOPLVIBR0頁直接尋址可實現(xiàn)位操作速度快,代碼效率高32256字節(jié)Flash存儲區(qū)控制及狀態(tài)寄存器區(qū)32192字節(jié)未定義3字節(jié)未定義區(qū)16字節(jié)未定義區(qū)307字節(jié)監(jiān)視ROM區(qū)43字節(jié)未定義區(qū)Flash塊保護寄存器93字節(jié)未定義區(qū)36字節(jié)Flashu復(fù)位和中斷向量區(qū)$FFFF$FF0F$FF0D$FE0C$FE00$FDFF$8000$7FFF$0240$023F$0040$003F$0000$FF10$FE1F$FE20$FF52$FF53$FF7D$FF7E$FF7F$FFDB$FFDC映象寄存器:通過存儲器地址訪問的寄存器寄存器與存儲器一樣被分配地址,軟件通過讀寫寄存器地址訪問寄存器設(shè)備(沒有專用I/O指令)。要使用寄存器名前需用偽指令確定寄存器名和地址的對應(yīng)關(guān)系程序和數(shù)據(jù)存儲器(都用相同的存儲器,統(tǒng)一編址映象)32kFlash512字節(jié)RAM64字節(jié)I/O寄存器區(qū)512ByteRAMHC08GP32存儲器組織0頁直接尋址32256字節(jié)Flash存儲區(qū)控制及狀態(tài)寄存器區(qū)M68HC08中央處理器結(jié)構(gòu)701587015070150算術(shù)邏輯運算部件ALUAHXSPCCRPCCPU寄存器M68HC08中央處理器結(jié)構(gòu)7M68HC08系列單片機的CPU寄存器16-bit
16-bit
16-bit
EasierSignedArithmetic
累加器(A)Accumulator(A)堆棧指針(SP)StackPointer(SP)程序計數(shù)器(PC)ProgramCounter(PC)條件寄存器(CCR)ConditionCodeRegister(CCR)進位/借位標(biāo)志Carry/Borrow(MSB)負標(biāo)志位Negative(MSB=1)中斷屏蔽標(biāo)志位InterruptMask半進位標(biāo)志位Half-Carry(forBCD)零標(biāo)志位Zero溢出標(biāo)志位Two’sComplimentOverflowVXXXXX0000011707011HINZC15變址寄存器(H:X)IndexRegister(HX)XHM68HC08系列單片機的CPU寄存器16-bit累06January2023尋址方式與指令系統(tǒng)26December2022尋址方式與指令系統(tǒng)隱含尋址隱含尋址INHInherentCPU08有16種尋址方式執(zhí)行指令的所有信息均在操作碼中,CPU不需要從寄存器、存儲器中取操作數(shù),操作數(shù)隱含在累加器、變址寄存器或狀態(tài)寄存器中。具有隱含尋址方式的指令均為單字節(jié)指令I(lǐng)NCA ;累加器A內(nèi)容加1,機器碼$4C INCX ;變址寄存器X內(nèi)容加1,機器碼$5CDECA ;累加器A內(nèi)容減1,機器碼$4ADECX ;變址寄存器X內(nèi)容減1,機器碼$5ACEI ;中斷屏蔽位I清0,機器碼$9ASEI ;中斷屏蔽位I置1,機器碼$9B隱含尋址隱含尋址INHInherentCPU08有16立即尋址操作數(shù)包含在操作碼的后繼字節(jié)中。立即尋址主要用于訪問常數(shù),多為二字節(jié)指令,第一個字節(jié)為操作碼,第二字節(jié)為操作數(shù),在立即尋址方式中操作數(shù)為立即數(shù),立即數(shù)前要加符號前綴“#”,說明是操作數(shù)值而不是地址。立即尋址IMMImmediateLDA#%01011010 ;將二進制數(shù)%01011010送累加器A,機器碼為$A65A,%表示后面的操作數(shù)是二進制數(shù)。ADD#$30 ;將累加器A的內(nèi)容與立即數(shù)$30進行不帶進位加運算,結(jié)果存至A,機器碼$AB30,$表示后面的操作數(shù)為16進制數(shù)LDHX#$8030 ;三字節(jié)指令,給變址寄存器H:X賦值$8030,機器碼為$458030,執(zhí)行后H的(H)=$80,(X)=$30LDX#-10;默認十進制立即尋址操作數(shù)包含在操作碼的后繼字節(jié)中。立即尋址主要用于訪問直接尋址直接尋址DIRDirect操作數(shù)的有效地址包含于操作碼后的一個字節(jié)中。由于操作數(shù)的有效地址僅1字節(jié),由此直接尋址方式只能對存儲器0頁的256個字節(jié)空間($0000~$00FF)進行操作。0頁存儲器有I/O控制和狀態(tài)寄存器,常用的用戶數(shù)據(jù)也盡量放在0頁,這樣訪問可節(jié)省程序空間,提高訪問速度。直接尋址指令一般為雙字節(jié)指令第一字節(jié)是操作碼,第二字節(jié)是操作數(shù)有效地址。STA$40 ;將累加器A中的值送$40單元 STA$40A$40$7FLDA$40 ;將$40單元內(nèi)容送累加器A中 LDA$40A$40$7F$7F$7FLDA#$77STA$40LDA$40直接尋址直接尋址DIRDirect操作數(shù)的有效地址包含于擴展尋址擴展尋址EXTExtended操作數(shù)的有效地址包含于操作碼后的兩個字節(jié)中。由于操作數(shù)有效地址2字節(jié),可尋址64k存儲空間。擴展尋址一般為三字節(jié)第二、三字節(jié)是操作數(shù)有效地址LDA$0200 ;將$0200單元內(nèi)容送累加器A,機器碼為$C60200STA$0240 ;將累加器A的內(nèi)容送$0200單元,機器碼為$C7024SourceFormOperationDescriptionEffectonCCRAddressModeOpcodeOperandCyclesVHINZCLDA#oprLoadAfromMA←(M)0---IMMA6ii2LDAoprDIRB6dd3LDAoprEXTC6hhll4↓↑↓↑擴展尋址擴展尋址EXTExtended操作數(shù)的有效地址包變址尋址_無偏移量變址尋址無偏移量變址尋址操作數(shù)的有效地址在16位變址寄存器H:X中。由于H:X為16位,可訪問64k空間。無偏移量變址尋址指令為單字節(jié)指令LDA,X ;將H:X指定的存儲單元的內(nèi)容送A,機器碼為$F60242$7FLDA,XH:X起到16位指針的作用AHX$0240$0241$0242$0243$0244$7F變址尋址_無偏移量變址尋址無偏移量變址尋址操作數(shù)的有效地址在變址尋址_8位偏移量變址尋址8位偏移量變址尋址操作數(shù)的有效地址是16位變址寄存器H:X中的無符號整數(shù)與操作碼后的一個字節(jié)無符號整數(shù)之和,也可以訪問64k空間。8位偏移量變址尋址指令為雙字節(jié)指令LDA$10,X ;將H:X中的值加上偏移量$10所得地址的存儲單元的內(nèi)容送A,機器碼為$E610$7FLDA$10,X偏移量為&10H:X內(nèi)容不變…0200…AHX$0200$0201$020F$0210$7F變址尋址_8位偏移量變址尋址8位偏移量變址尋址操作數(shù)的有效地變址尋址_16位偏移量變址尋址16位偏移量變址尋址操作數(shù)的有效地址是16位變址寄存器H:X中的無符號整數(shù)與操作碼后的兩個字節(jié)無符號整數(shù)之和,也可以訪問64k空間。16位偏移量變址尋址指令為三字節(jié)指令LDA$100,X ;將H:X中的值加上偏移量$100所得地址的存儲單元的內(nèi)容送A,機器碼為$D60100$7FLDA$100,X偏移量為&100H:X內(nèi)容不變…0100…AHX$0100$0101$020F$0200$7F變址尋址_16位偏移量變址尋址16位偏移量變址尋址操作數(shù)的有8位偏移量和16位偏移量8位偏移量為無符號整數(shù)設(shè)LDHX#$0090STA$C0,X將累加器內(nèi)容送$0150單元16位偏移量為符號數(shù)STA$FFFE,X將累加器A的內(nèi)容送$8E單元STA-$10,X將累加器A的內(nèi)容送$80單元8位偏移量和16位偏移量8位偏移量為無符號整數(shù)查表程序LOOK:LDATab,X;LDA32773,XBRA*TabFCB$00,$01,$04,$09FCB$10,$19,$24,$31FCB$40,$51000104091625364964818005TabH:X00:07查找表首地址800E+7變址:H:X不變,改變偏移量偏移量不變,改變H:X查表程序000104091625364964818005Ta變址尋址變址尋址以H:X作為指針無偏移量變址尋址(IX)STA,X8位偏移量變址尋址(IX1)ADD$10,X16位偏移量變址尋址(IX2)AND$1030,X如(H:X)=$1030,操作數(shù)地址為$1030$1040$2060變址尋址變址尋址無偏移量變址尋址(IX)S堆棧堆棧由棧區(qū)和堆棧指針構(gòu)成。棧區(qū)是一組按先進后出(FILO)方式工作的寄存器或存儲單元,用于存放數(shù)據(jù)。堆棧指針(SP)是用來指示棧頂?shù)刂返募拇嫫鳎糜谧詣庸芾項^(qū),指示數(shù)據(jù)存入(進棧)或取出(出棧)的位置。$0100$00FF$00FE$00FD$00FCSPA$0100$00FFB$00FE$0100$00FF$00FE$00FD$00FCSP$00FEBA$00FF$0100堆棧堆棧由棧區(qū)和堆棧指針構(gòu)成。棧區(qū)是一組按先進后出(FILO堆棧類型硬件堆棧:棧區(qū)由微處理器內(nèi)部的寄存器組構(gòu)成;軟件堆棧:由軟件在內(nèi)存中開辟一個特定的RAM區(qū)構(gòu)成棧區(qū)。堆棧指針用來指示棧頂位置,可由用戶設(shè)初值,一旦設(shè)定后棧底位置即確定,此后SP內(nèi)容即棧頂位置由CPU自動管理。隨著堆棧操作的進行,SP的值會自動變化,其變化方向因棧區(qū)的編址方式分為向下增長型和向上增長型。向下增長型堆棧:數(shù)據(jù)進棧時,SP自動減量,向上浮動而指向新棧頂。數(shù)據(jù)出 棧時,SP自動增量,向下浮動指向新棧頂,M68HC08就是向 下增長型。向上增長型堆棧與之相反堆棧主要用于中斷處理和子程序調(diào)用堆棧類型硬件堆棧:棧區(qū)由微處理器內(nèi)部的寄存器組構(gòu)成;堆棧指針堆棧尋址堆棧尋址堆棧指針是16位寄存器,堆棧尋址就是將堆棧指針作變址寄存器使用。堆棧尋址有8位偏移量(SP1)和16位偏移量(SP2)兩種例如:SP1: LDA$10,SP ;將SP中的值加上$10所得和作為存儲器單元地址,將其內(nèi)容送A,機器碼$9EE610如(SP)=$0200,指令將($0210)送ASP2:ADC$0120,SP ;;將SP中的值加上$0120所得和作為存儲器單元地址,將其內(nèi)容與A的值進行帶進位加法,結(jié)果送A,機器碼$9ED90120如(SP)=$0200,(A)=$35,進位位C=1,($0120+$0200)=$35,指令執(zhí)行后(A)=$6B堆棧尋址堆棧尋址堆棧指針是16位寄存器,堆棧尋址就是將堆棧指堆棧尋址_8位偏移量堆棧變址尋址8位偏移量堆棧變址尋址(SP1)操作數(shù)的有效地址是16位堆棧指針(SP)中的無符號整數(shù)與操作碼后的一個字節(jié)無符號整數(shù)之和,也可以訪問64k空間。8位偏移量堆棧變址尋址指令為三字節(jié)指令LDA$10,SP ;將SP中的值加上偏移量$10所得地址的存儲單元的內(nèi)容送A,機器碼為$9EE610$7FLDA$10,SPA偏移量為&10SP內(nèi)容不變0200SP$0200$0201…$020F$0210…$7F堆棧尋址_8位偏移量堆棧變址尋址8位偏移量堆棧變址尋址(SP堆棧尋址_16位偏移量堆棧變址尋址16位偏移量堆棧變址尋址(SP2)操作數(shù)的有效地址是16位堆棧指針(SP)中的無符號整數(shù)與操作碼后的一個字節(jié)無符號整數(shù)之和,也可以訪問64k空間。16位偏移量變址尋址指令為三字節(jié)指令LDA$100,SP ;將SP中的值加上偏移量$100所得地址的存儲單元的內(nèi)容送A,機器碼為$9EE610$7FLDA$100,SP偏移量為&100SP內(nèi)容不變0100ASP$0100$0101…$01FF$0200…$7F堆棧尋址_16位偏移量堆棧變址尋址16位偏移量堆棧變址尋址(存儲器-存儲器尋址這類指令將將一個存儲單元的內(nèi)容傳送到另一個存儲單元,其中至少有一個地址是在0頁存儲器-存儲器尋址有4種:立即尋址到直接尋址(IMD)直接尋址到直接尋址(DD)自動變址尋址到直接尋址(IX+D)直接尋址到自動變址尋址(DIX+)存儲器-存儲器尋址這類指令將將一個存儲單元的內(nèi)容傳送到另一個立即尋址到直接尋址(IMD)和直接尋址到直接尋址(DD)立即尋址到直接尋址方式(IMD):三字節(jié)指令,第一個字節(jié)為操作碼,第二字節(jié)為立即數(shù),第三字節(jié)為8位地址MOV#$FF,$00 ;立即數(shù)$FF送$00單元源目的直接尋址到直接尋址方式(DD):三字節(jié)指令,第一個字節(jié)為操作碼,源操作數(shù)和目的操作數(shù)都是直接地址MOV$60,$00 ;$60單元內(nèi)容送$00單元源目的這類指令通常用于初始化寄存器和變量,如MOV#$FF,PTA由于直接地址是8位,這兩種尋址方式只能實現(xiàn)0頁內(nèi)的傳送立即尋址到直接尋址(IMD)和直接尋址到直接尋址(DD)立即自動變址尋址到直接尋址(IX+D)雙字節(jié)指令,第一字節(jié)是操作碼,第二字節(jié)為目的地址,源操作數(shù)是16位變址寄存器H:X,將H:X所指向單元內(nèi)容送目的存儲器地址單元,然后H:X中的值自動加1,指向下一單元HX0100$7F$0041$0042…$0100$0101…$0040$01020141$7FLDHX#$0100MOVX+,$40$66LDA#$7FSTA$0100LDA#$66STA$0101LDHX#$0100MOVX+,$40MOVX+,$41立即尋址擴展尋址立即尋址擴展尋址擴展尋址自動變址到直接尋址可實現(xiàn)64k內(nèi)任一地址到0頁內(nèi)的直接傳送自動變址尋址到直接尋址(IX+D)雙字節(jié)指令,第一字節(jié)是操作直接尋址到自動變址尋址(DIX+)雙字節(jié)指令,第一字節(jié)是操作碼,第二字節(jié)為源操作數(shù)8位地址,目的操作數(shù)是16位變址寄存器H:X,將將源操作數(shù)地址存儲單元內(nèi)容送到H:X所指向單元,然后H:X中的值自動加1,指向下一單元HX0240$7F$0041$0042…$0240$0241…$0040$02420241$7FLDHX#$0240MOV$40,X+MOV#$7F,$40MOV#$66,$41LDHX#$0240MOV$40,X+MOV$41,X+立即尋址到直接尋址擴展尋址直接尋址到自動變址可實現(xiàn)0頁向64k內(nèi)任一地址的直接傳送$66直接尋址到自動變址尋址(DIX+)雙字節(jié)指令,第一字節(jié)是操作程序執(zhí)行過程LDHX#$40MOV#$44,$40LDA#$55ADD,XSTA$100BRA$4500406E4440A655FBC901008000800180028003800480058006800780088009800A800B8000PC458001008002408003PC+18006PC+18008PC+18009PC+1程序執(zhí)行過程LDHX#$404500406E4440A65相對尋址(REL)相對尋址用于轉(zhuǎn)移指令。計算機運行時程序計數(shù)器PC總指向下一條待執(zhí)行指令的地址在相對尋址方式中,CPU首先測試給定的條件,如果滿足條件,則發(fā)生相對轉(zhuǎn)移將當(dāng)前程序計數(shù)器PC的值加上指令碼所占字節(jié)數(shù),再加上指令操作碼后的8位有符號數(shù),使程序轉(zhuǎn)移到PC指定的新地址處,否則執(zhí)行該指令的下一條指令。相對尋址方式的指令為雙字節(jié)指令,一個為操作碼,另一個是相對偏移量,轉(zhuǎn)移范圍為相對于存放機器碼地址的-126~+129用戶在編匯編語言程序時,不必自己計算相對偏移量,只要寫出待跳轉(zhuǎn)的地址標(biāo)號代替偏移量,匯編程序會在匯編時自動計算偏移量,并檢查是否超過有效轉(zhuǎn)移范圍相對尋址(REL)相對尋址用于轉(zhuǎn)移指令。相對尋址例main:CLC ;設(shè)置進位標(biāo)志位C為0BCCP1;如C為0,轉(zhuǎn)P1LDA#$FF ;(A)←$FFBRAP2 ;無條件轉(zhuǎn)P2P1:LDA#$00 ;(A)←$00P2:BRA$ ;原地踏步98CLC2404BCC*+68003A6FFLDA#0xFF80052002BRA*+48007A600LDA#0x0020FEBRA*+0800B000000BRSET地址代碼指令相對尋址例main:98CLC地相對尋址說明98CLC2404BCC*+68003A6FFLDA#0xFF80052002BRA*+48007A600LDA#0x0020FEBRA*+0800B000000BRSET地址代碼指令80012404BCC*+624為操作碼,04為偏移量PC總指向下一條待執(zhí)行指令,因此當(dāng)執(zhí)行本條轉(zhuǎn)移指令BCCP1時,PC正指向8003,即(PC)=8003,如轉(zhuǎn)移條件滿足,8003加上偏移量04,PC的新值為8007,即PC指向8007,正是符號地址P1-待跳轉(zhuǎn)的地址至于BCC*+6,則是BCCP1編譯后的源碼書寫格式,“*”或“$”表示當(dāng)前指令位置,不要與機器碼2404混淆P1:P2:800920FEBRA*+0BRA為無條件轉(zhuǎn)移指令,20為操作碼,偏移量$FE是-2的補碼,執(zhí)行本條指令時PC已指向800B,800B-2=8009,PC又指向8009,實現(xiàn)原地跳轉(zhuǎn),不繼續(xù)往下執(zhí)行或者說*+0表示當(dāng)前指令位置不變PC相對尋址說明98CLC地址相對尋址執(zhí)行過程982404A6FF2002A60020FE000000800080018003800580078009800BCLCBCCP1LDA#$FFBRAP2LDA#$00BRA$BRSETCLC BCCP1 ;2404LDA#$FFBRAP2 P1:LDA#$00 P2:BRA$ 8000PC8001C=0800380078003+04=8007相對尋址執(zhí)行過程982404A6FF2002A60020FE無偏移量變址后加1尋址在MHC08指令系統(tǒng)中,只有一條指令采用這種尋址方式,這是一條相對轉(zhuǎn)移指令:CBEQX+,rel如H:X所指向的存儲單元中的值和累加器A的值相等則轉(zhuǎn)移,否則順序執(zhí)行下一條指令。但無論轉(zhuǎn)移或不轉(zhuǎn)移H:X的值都自動加1同樣,編程時無需計算偏移量,寫成程序標(biāo)號即可((H:X))=(A)?noH:X←(H:X)+1H:X←(H:X)+1順序執(zhí)行跳轉(zhuǎn)執(zhí)行yes如H:X=$0200$0200的內(nèi)容是$67則將$67與A的內(nèi)容比較決定程序執(zhí)行方向$0200$670200$67A=?H:X$0201無偏移量變址后加1尋址在MHC08指令系統(tǒng)中,只有一條指令采8位偏移量變址后加1尋址在MHC08指令系統(tǒng)中,只有一條指令采用這種尋址方式,這是一條相對轉(zhuǎn)移指令:CBEQopr,X+,rel先將8位偏移量opr與H:X所指向的存儲單元中的值相加,所得和為地址的存儲單元中的值和累加器A的值相等則轉(zhuǎn)移,否則順序執(zhí)行下一條指令。但無論轉(zhuǎn)移或不轉(zhuǎn)移H:X的值都自動加1同樣,編程時無需計算偏移量,寫成程序標(biāo)號即可$0200((H:X)+opr)=(A)?noH:X←(H:X)+1H:X←(H:X)+1順序跳轉(zhuǎn)執(zhí)行yes如H:X=$0200,偏移量opr=$10,$0210的內(nèi)容是$67,則將$67與A的內(nèi)容比較決定程序執(zhí)行方向$670210$67A=?0200H:X$02018位偏移量變址后加1尋址在MHC08指令系統(tǒng)中,只有一條指令尋址方式小結(jié)隱含尋址(INH)立即尋址(IMM)直接尋址(DIR)擴展尋址(EXT)變址尋址變址寄存器變址堆棧指針變址無偏移量變址尋址(IX)8位偏移量變址尋址(IX1)16位偏移量變址尋址(IX2)8位偏移量堆棧尋址(SP1)16位偏移量堆棧尋址(SP2)存儲器到存儲器尋址立即尋址到直接尋址(IMD)直接尋址到直接尋址(DD)自動變址尋址到直接尋址(IX+D)直接尋址到自動變址尋址(DIX+)轉(zhuǎn)移用到的尋址方式相對尋址(REL)無偏移量后加1尋址(IX+)8位偏移量后加1尋址(IX1+)尋址方式小結(jié)隱含尋址(INH)變址尋址變址寄存器變址堆棧指針尋址方式例尋址方式例指令表SourceFormOperationDescriptionEffectonCCRAddressModeOpcodeOperandCyclesVHINZCLDA#oprLoadAfromMA←(M)0---IMMA6ii2LDAoprDIRB6dd3LDAoprEXTC6hhll4ANDoprLogicANDA←(A)&(M)0---EXTC4hhll4ANDopr,xIX2E4eeff4ANDopr,xIX1F4ff3BEQrelBranchifEqualPC←(PC)+2+rel?(z)=1------REl27rr3LDHXoprLoadH:XfromMH:X←(M:M+1)0---DIR55dd4LDHX#oprIMM45iijj↓↑↓↑↓↑↓↑A累加器CCR條件寄存器dd直接尋址方式操作數(shù)hhll擴展尋址方式操作數(shù)的高位和低位eeff16位偏移量變址尋址的高位和低位↓↑↓↑M存儲器位置opr操作數(shù)PC程序計數(shù)器relPC相對轉(zhuǎn)移字節(jié)指令表SourceOperationDescriptionE數(shù)據(jù)傳送指令LDA#$80 ;十六進制立即數(shù)$80A,#表示立即數(shù)IMM→STA$10,X ;(A)((H:X)+$10)將A的數(shù)據(jù)送到以H:X中的數(shù)加上偏移量$10,形 ;成的地址單元。如H:X=$0210,A=$55,運行后($0220)=$55IX1→LDA$80 ;($80)A將$80單元內(nèi)容送A,$80表示內(nèi)存單元地址, ;($80)表示內(nèi)存單元的內(nèi)容DIR→LDHX#$023F ;16位傳送指令,立即數(shù)$02H,$3FX,IMM→→HX→LDHX$40 ;16位傳送指令,($40)H,($41)XDIR→→STHX$40 ;16位傳送指令,(H)($40),(X)($41)DIR→16位傳送LDHX#$023FLDHX$40$40$41AABBHXAABB023FSTHX$40HXAABB$40$41AABB數(shù)據(jù)傳送指令LDA#$80 ;十六進制立即數(shù)$80數(shù)據(jù)傳送指令_寄存器間傳送→TXS ;(H:X)-1SPH:SPLH:X中的值減1后送SP,如H:X=$023F,則 ;SP=$023E,TXS通常用來設(shè)置堆棧指針→TSX ;(SPH:SPL)+1H:XSP中的值加1后送H:X,如(SP)=$023E,則 ;H:X=$023F。→例:設(shè)置棧頂LDHX#$023FTXS數(shù)據(jù)傳送指令_寄存器間傳送→TXS ;(H:X)-1數(shù)據(jù)傳送指令_堆棧$0100$00FF$00FE$00FD$00FCSPAA$0100$00FFBB$00FE$0100$00FF$00FE$00FD$00FCSP$00FEBBAA$00FF$0100PUSHHPUSHXAAHXBBSP總是指向棧頂堆棧操作永遠是對棧頂操作進棧:先進棧,SP-1出棧:先SP+1,數(shù)據(jù)出棧HXPULXPULH指令順序:先進后出方不會錯亂數(shù)據(jù)傳送指令_堆棧$0100$00FF$00FE$00FD$存儲器間傳送指令
LDHX#$0100MOV#$AA,$40MOV$40,X+存儲器間傳送指令LDHX#$0100算術(shù)類指令溢出11半進位中斷屏蔽負標(biāo)志0標(biāo)志進位位0110100011001加法指令A(yù)DD:不帶進位加ADDC:帶進位加LDA#$88ADD#$88大多數(shù)算術(shù)指令中的一個操作數(shù)隱含是累加器,運算結(jié)果也保存在AA:10001000+10001000000100001ACCRC:上電復(fù)位狀態(tài)VHINZC00100算術(shù)類指令溢出11半進位中斷屏蔽負標(biāo)志0標(biāo)志進位位01101加法指令
LDA#$FFADC#$01運行后:V=0H=1N=0Z=1C=1A:11111111
00000001+00000001/01AC:C=1/0LDA#$FFINCA運行后:A=0V=0N=0Z=1但C和H不變這是ADD#$1和INC指令不同之處加法指令LDA#$FF運行后:A:11取反指令和比較指令取反指令:LDA#-$1;注意CodeWarrior
;負數(shù)書寫格式COMA;$FF-($FF)=0→AMOV#$AA,$80COM$80;$55→$80比較指令:比較指令將兩個操作數(shù)(其中一個是(A、X或(H:X))作了一次減法,但僅影響標(biāo)志位,兩個操作數(shù)都不變MOV#$AA,$80LDA#$AACMP$80;$AA-$AA=0,所以Z=1,說明相等16位比較:MOV#$12,$80MOV#$34,$81LDHX#$1200CPHX$80;(H:X)=$1200,($80)=$12,($81)=$34
;$1200-$1234<0,N=1,C=1,Z=0說明 ;兩數(shù)不等,且(H:X)<($80)($81)取反指令和比較指令取反指令:比較指令:MOV#$AA,$8算術(shù)指令SourceFormOperationDescriptionEffectonCCRAddressModeOpcodeOperandCyclesVHINZCINCoprincreamentM←(M)+1---DIR3Cdd4ADCoprAddwithcarryA←(A)+(M)+(C)-DIRB9dd3SUBoprAddwithoutcarryA←(A)-(M)-DIRB9dd3CMPoprCompareAwithM(A)-(M)-DIRB1dd3TST,XTestforNegativeorZero(X)-$000---INH5D1AIS#oprAddImmediateValue(single)toSPSP←(SP)+(16<<M)------IMMA7Ii2↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑算術(shù)指令SourceOperationDescription符號位的擴展_AIS,AIX計算機中符號數(shù)以補碼形式表示最高位位符號位:+1(00000001)2(01)16-1(11111111)2(FF)168位符號數(shù)([-128,+127])擴展為16位,就是將符號位擴展到高8位中+1(00000000000000001)2-1(11111111111111111)2LDHX#$02TXS ;(SP)=(01)16=(0000000000000001)2
AIS#$80;1111111110000000
1111111110000001+SPSP設(shè)置只能由H:X傳送立即數(shù)只能是8位符號數(shù)AIX#opr8H:X←(H:X)+(16<<M);-128<=#opr8<=127符號位的擴展_AIS,AIX計算機中符號數(shù)以補碼形式表示最高邏輯運算指令邏輯運算類指令都是對累加器A和另一操作數(shù)按位進行,結(jié)果返回AVHNZC0-??-
LDA#$AA;10101010AND#$A5;^10100101A10100000要將某位取反,可對該位用1去異或,而其余各位用0異或LDA#$00;00000000EOR#$40;⊕01000000A01000000邏輯運算指令邏輯運算類指令都是對累加器A和另一操作數(shù)按位進行位操作指令位測試指令BIT:計算機進行BIT指令時實際是對累加器A和操作數(shù)進行了一次AND運算,與AND的區(qū)別是“與”運算結(jié)果不存入累加器A,因此兩個操作數(shù)都不變,僅改變標(biāo)志位。清位:BCLRn,addr8MOV#$FF,$80;($80)=11111111BCLR0,$80;($80)=11111110由于是直接尋址addr8,因此只能0頁尋址,對存儲器前256個單元操作,其位操作空間位256×8=2048。指令中n=0~7,不影響任何標(biāo)志位置位:BSETn,addr8清/置標(biāo)志位C:CLC C←0SEC C←1清/置位中斷屏蔽位:CLII←0開中斷SEII←1關(guān)中斷第0位位操作指令位測試指令BIT:清位:由于是直接尋址addr8,算術(shù)移位指令算術(shù)左移ASL和邏輯左移LSL,相當(dāng)操作數(shù)×21000000
0CAASLA0算術(shù)右移ASR,相當(dāng)操作數(shù)÷2,右移時符號位復(fù)制以保持數(shù)值符號不變1011111
0CAASRA1(01000000)2=64,64×2=128=(10000000)2(10111110)2=-66,-66/2=-33=(11011111)2算術(shù)移位指令算術(shù)左移ASL和邏輯左移LSL,相當(dāng)操作數(shù)×21循環(huán)左移指令循環(huán)左移ROL,進位位C與操作數(shù)作為整體循環(huán)移位1000000
0CAROLAASLA10000000
10
C00000001ROLA循環(huán)左移指令循環(huán)左移ROL,進位位C與操作數(shù)作為整體循環(huán)移位跳轉(zhuǎn)指令跳轉(zhuǎn)指令無條件轉(zhuǎn)移指令條件轉(zhuǎn)移指令相對轉(zhuǎn)移指令絕對轉(zhuǎn)移指令測試狀態(tài)標(biāo)志條件轉(zhuǎn)移指令測試外中斷(IRQ)條件轉(zhuǎn)移指令位測試轉(zhuǎn)移指令減1不為0轉(zhuǎn)移指令比較相等轉(zhuǎn)移指令調(diào)用子程序指令相對調(diào)用指令絕對調(diào)用指令返回指令從子程序返回指令從中斷返回指令除位測試轉(zhuǎn)移指令外,所有轉(zhuǎn)移指令不影響標(biāo)志位跳轉(zhuǎn)指令跳轉(zhuǎn)指令無條件轉(zhuǎn)移指令條件轉(zhuǎn)移指令相對轉(zhuǎn)移指令測試狀位測試轉(zhuǎn)移指令位測試轉(zhuǎn)移指令將測試位送標(biāo)志位C,然后判斷轉(zhuǎn)移。M:存儲器位置,rel相對轉(zhuǎn)移數(shù)SourceFormOperationDescriptionEffectonCCRAddressModeOpcodeOperandCyclesVHINZCBRSETn,opr,relBranchifBitninMsetPC←(PC)+3+rel?(Mn)=1-----?DIR(b0)DIR(b1)DIR(b3)DIR(b4)DIR(b5)DIR(b6)DIR(b7)DIR(b8)00020406080A0C0Eddrrddrrddrrddrrddrrddrrddrrddrr55555555BSETn,oprSETBitninMMn←1----
--DIR(b0)l10dd4位測試轉(zhuǎn)移指令位測試轉(zhuǎn)移指令將測試位送標(biāo)志位C,然后判斷轉(zhuǎn)移位測試例1
MOV#%01000000,$40 BRCLR6,$40,P1 LDA#$FF BRAP2 P1: LDA#$00 P2: BRA$$40單元位6=0?ynP1:A←$FFP2:A←$00位測試例1 MOV#%01000000,$40$40單元相對轉(zhuǎn)移和絕對轉(zhuǎn)移2004A6FF2002A60020FE0000000080008002800480068008800A800DBRAP1LDA#$FFBRAP2LDA#$00BRA$BRSETBRAP1 ;2404LDA#$FFBRAP2 P1:LDA#$00 P2:BRA$ 8000PC80028006BRArel:(PC)+rel→PC絕對轉(zhuǎn)移指令JMP:PC←跳轉(zhuǎn)地址相對轉(zhuǎn)移和絕對轉(zhuǎn)移2004A6FF2002A60020FE0相對和絕對轉(zhuǎn)移指令
JMPP2 ORG$8110P2:LDA#$AA8000CC8110JMP0x8110...8110A6AALDA#0xAA
BRAP2 ORG$8110P2:LDA#$AA8000200EBRA*+16;abs=8010...8110A6AALDA#0xAA比較ORG$8080、$8081、$8082等情況相對和絕對轉(zhuǎn)移指令 JMPP28000CC8110減1不為0轉(zhuǎn)移指令DBNZArel:A←(A)-1PC←(PC)+3+rel,?(result)≠0
LDX#$0 LDA#$3P1:INCX DBNZAP1延時程序:LDA#$3DBNZA$思考:A=?可得到最大延時CLRA
MOV#$2,$40P: LDA#$3P1:NOP DBNZAP1 DBNZ$40,P思考:NOP執(zhí)行了幾次?X=0X=X+1A=A-1whileA≠0A=0減1不為0轉(zhuǎn)移指令DBNZArel:A←(A)-1P轉(zhuǎn)子程序和返回指令SourceFormOperationDescriptionEffectonCCRAddressModeOpcodeOperandCyclesVHINZCBSRrelBranchtoSubroutinePC←(PC)+2;push(PCL)SP←(SP)-1;push(PCH)SP←(SP)-1PC←(PC)+rel-
-
-
-
-
-RELADrr4RTSReturnfromSubroutineSP←(SP)+1;pull(PCH)SP←(SP)+1;pull(PCH)-
-
-
-
-
-INH814轉(zhuǎn)子程序和返回指令SourceOperationDescri相對和絕對轉(zhuǎn)移調(diào)用子程序指令
JSRP2 ORG$8110P2:LDA#$AARTSCD8110JSR0x8110800320FEBRA*+0;abs=8003...A6AALDA#0xAA811281RTS
BSRP2 ORG$8110P2:LDA#$AARTSAD0EBSR*+16;abs=8010800220FEBRA*+0;abs=8003...A6AALDA#0xAA811281RTS比較ORG$8080、$8081、$8082等情況相對和絕對轉(zhuǎn)移調(diào)用子程序指令 JSRP2CD8110轉(zhuǎn)子程序和返回過程
MAIN:800045023F LDHX#$023F800394TXS8004AD02BSRSUB_P800620FE BRA$SUB_P:80089DNOP800981RTSuuuuuuuuuuSP023E堆棧將返回地址8006彈出到PC,程序從中斷處8006繼續(xù)執(zhí)行8006進堆棧保護,SP-2子程序首地址8008進PC,開始執(zhí)行子程序程序023D023E023F023C023B棧區(qū)023Cuu0680轉(zhuǎn)子程序和返回過程MAIN:SUB_P:uuuuuuuuu十進制調(diào)整和半字節(jié)交換指令BCD數(shù)78+35=113LDA#$78ADD#$35;(A)=$ADDAA;(C)=1,(A)=13減法不能用DAALDA#$74NSA ;(A)=47MOV#$74,$80LDA$80AND#$0FSTA$82LDA$80NSAAND#$0FSTA$81BRA$011101000000111100000100^010001110000111100000111^740704808182NSA經(jīng)常用于BCD碼的處理例:將壓縮BCD轉(zhuǎn)換成非壓縮BCD碼7404744707NSA十進制調(diào)整和半字節(jié)交換指令BCD數(shù)78+35=113LDA06January2023程序設(shè)計基礎(chǔ)26December2022程序設(shè)計基礎(chǔ)匯編語言程序格式機器語言:用二進制編碼和儲存的機器指令(機器碼)匯編語言:用助記苻表示指令的功能和特征代替機器指令。由于機器只能識別機器碼,匯編語言源程序只有經(jīng)匯編后生成機器語言的目標(biāo)程序才能運行匯編語言源程序格式:標(biāo)號:操作碼操作數(shù)注釋
LOOP:LDA0,X;X變址尋址置送累加器A標(biāo)號標(biāo)號有兩種形式:
(1) 標(biāo)號的第一個字符是“*”時,表示該行是注釋行,匯編程序忽略注釋 行。
(2) 可執(zhí)行語句標(biāo)號的第一個字符必須是英文字母,后面可接英文字母 數(shù)字、美元苻$和下劃線_。標(biāo)號區(qū)分大小寫。標(biāo)號在此起符號地址 的作用,表示轉(zhuǎn)移語句的轉(zhuǎn)向地址或程序的起始地址或數(shù)據(jù)地址。標(biāo)號后的“:”不是必須的匯編語言程序格式機器語言:用二進制編碼和儲存的機器指令(機器匯編語言源程序格式操作碼操作碼分兩類指令碼偽指令碼,由匯編程序用于控制匯編操作,不是執(zhí)行指令操作數(shù)操作數(shù)部分指明了指令的尋址方式和操作數(shù),操作數(shù)可由符號、表達式組成,各部分由“,”分割操作數(shù)格式M68HC08尋址方式例無操作數(shù)累加器和隱含DAA,INCX,ASRX<表達式>直接、擴展或相對LDA$40,STX$100,BRA$#<表達式>立即數(shù)LDHX#$023F<表達式>,X變址LDA$10,X<表達式>,<表達式>位置位或清零BCLER4,$40<表達式>,<表達式>,<表達式>位測試和轉(zhuǎn)移BRSET4,$40,P匯編語言源程序格式操作碼操作數(shù)操作數(shù)格式M68HC08尋址方匯編語言中的表達式表達式由符號、常數(shù)、運算符和括號組成。表達式的運算結(jié)果為操作數(shù)。表達式可由運算符+、-、*、/、%、&、|、^等連接苻號和常數(shù)或字符“*”(表示當(dāng)前PC的值,也可用“$”)符號功能符號功能+加%取余-減&邏輯與*乘|邏輯或/除^異或MC68HC08允許使用的運算符及其功能STA$80+$10;編譯后STA0x90STA$90%$90;編譯后STA0x00STA$80^$01;編譯后STA0x81
LDATAB+1,X BRA*TAB:FCB$AA,$BB匯編語言中的表達式表達式由符號、常數(shù)、運算符和括號組成。表達偽操作指令匯編語言有一類不與任何處理器指令對應(yīng)的偽指令,它們?yōu)閰R編程序?qū)⒎栔噶罹幾g成機器碼提供信息:地址、數(shù)據(jù)、定位和分段等,偽指令不生成代碼。賦值偽指令:標(biāo)號:EQU<表達式>注釋如:coefficientEQU5;系數(shù)為5DDRAEQU$0004;A口方向寄存器地址 將常用的地址或數(shù)值用EQU定義為一個符號有 助于閱讀和修改定位偽指令:
ORG <表達式>注釋如:ORG$8100源程序或數(shù)據(jù)編譯后存放在$8100開始的存儲 空間 結(jié)束偽指令:
END表示本匯編程序到此結(jié)束偽操作指令匯編語言有一類不與任何處理器指令對應(yīng)的偽指令,它們常數(shù)定義偽指令 ORG$80Table: FCB‘ABC’,$AA,$BBTable1: FDB$023F,$AA ORG$8030Table_C:FCC'AB'main:Entry: LDATable2MOVTable+4,$90 ORG$8010Table2: FCB$E1,$50,$01 ENDDB
或FCB:定義字節(jié)和字符串DW或FDB:定義字。DC或FCC:定義字符串,如用FCC, 一句只能定義一個字符串程序匯編后:414243AABB85023F00AA41428010E15001程序運行后:A=E1,($90)=BB思考:可否LDHXTable1常數(shù)定義偽指令 ORG$80DB或FCB:定義存儲區(qū)域保留偽指令DS或RMB:(<標(biāo)號>)RMB<表達式>;也可用DS從標(biāo)號位置起保留一塊存儲區(qū),其字節(jié)長度等于表達式的值。匯編后將存儲區(qū)初始化為0可用RMB.B和RMS.W分別表示后面保留的存儲區(qū)以字節(jié)或字(雙字節(jié))作單位DS.B3保留3字節(jié)DS.W3保留6字節(jié)
ORG$80Sum1:RMB3Sum2:RMB1Table:FCB$AA,$BBmain:Entry: MOV#$2,Sum1 MOV#$3,Sum2 BRA$END匯編后
008000000000AABB運行后008002000003AABB存儲區(qū)域保留偽指令DS或RMB:匯編語言程序設(shè)計匯編語言程序設(shè)計簡單程序_單字節(jié)16進制數(shù)轉(zhuǎn)換為BCD碼254/100=2……5454/10=5……4HA00254100X542B1DS.B1B2DS.B1B3DS.B1LDA#254CLRHLDX#100DIV;分離百位STAB1LDX#10 ;余數(shù)分離十位和個位
PSHHPULACLRHDIVSTAB2PSHHPULASTAB3BRA*2B10054用堆棧傳送數(shù)據(jù)005410455B24B3;用堆棧實現(xiàn)A←H;用堆棧實現(xiàn)H內(nèi)容;送存儲器簡單程序_單字節(jié)16進制數(shù)轉(zhuǎn)換為BCD碼254/100=2…簡單程序_單字節(jié)BCD整數(shù)轉(zhuǎn)換成單字節(jié)十六進制整數(shù)LDA#%10011000;(98)BCDCLRHLDX#16DIV ;分離十位和個位PSHH ;個位進棧LDX#10MUL;將十位轉(zhuǎn)換為十六進制ADD1,SP;加個位BRA*BCD數(shù)98在計算機中存放形式為10011000即$98對98=9*10+8;對$98=9*16+8算法為:$98/16=9……8實際數(shù)值為9*10+8HA00$9816X89910×+8uuuu8FESP十進制和16進制權(quán)不同簡單程序_單字節(jié)BCD整數(shù)轉(zhuǎn)換成單字節(jié)十六進制整數(shù)LDA簡單程序_將壓縮BCD碼拆開轉(zhuǎn)換為ASCII碼
ORG$80Data_BCDDS.b1Data_ASCIIDS.b2
LDHX#$0010LDAData_BCDDIVORA#$30STAData_ASCIIPSHHPULAORA#$30STAData_ASCII+1BRA*采用除$10方法(相當(dāng)于右移4位)將BCD數(shù)拆開010010010000100100000100BCDHBCDL000000000000BCDH0000BCDL00010000HAAHX*用半字節(jié)屏蔽方法編程,比較程序字節(jié)數(shù)、執(zhí)行周期數(shù)簡單程序_將壓縮BCD碼拆開轉(zhuǎn)換為ASCII碼簡單程序_雙字節(jié)求補
ORG$80DATAHFCB$00DATAL:FCB$01main:Entry: BSRDNEGBRA*DNEG:
NEG DATAL ;00-DATAL CLRA
SBC DATAH STA DATAH RTS
算法1:0-DATA→DATA算法2:取反加1main:Entry: BSRDNEGBRA*DNEG: COMDATAH;取反高位 LDADATALCOMA;取反低位
ADD#$1 ;雙字節(jié)加1STADATALCLRA
ADCDATAHSTA DATAHRTS0000DHDLDHDL+01簡單程序_雙字節(jié)求補 ORG$80算法1:0分支程序_簡單分支程序
ORG$0080Data1:FCB$12Data2:FCB$34codesectionMyCode:SECTIONmain:Entry:LDAData1CMPData2BHICMP_EndMOVData2,Data1STAData2CMP_End:BRA*比較兩個無符號數(shù),按先大后小排列Flag:DS.b1Flag_MarkEQU7main:MOV#$00,DDRAMOV#$FF,PTAPUEMOV#$00,FlagBRCLR7,PTA,ExBSETFlag_Mark,FlagBRAP_EndEx:BCLRFlag_mark,FlagP_End:BRA*根據(jù)PTA口狀態(tài)設(shè)置標(biāo)志位分支程序_簡單分支程序 ORG$0080比較兩個無分支程序_多重分支
ORG$0080XX:FCB$03Y:DS.B1main:LDAXXCMP#$5BHSBE5DECXX
BRAP_EndBE5:CMP#10BHIB10CLRXX
溫馨提示
- 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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年環(huán)境污染治理技術(shù)與工程合同
- 2024年特許連鎖合同:美容護膚品牌連鎖經(jīng)營
- 船舶英語課程設(shè)計
- 液壓課程設(shè)計集成塊
- 統(tǒng)計表微課程設(shè)計
- 箱蓋機械制造課程設(shè)計
- 文科課程設(shè)計個人日志
- 背景圖高級課程設(shè)計
- 物體旋轉(zhuǎn)課程設(shè)計思路
- 體育行業(yè)市場拓展總結(jié)
- 人教版六年級上冊道德與法治知識點
- 期貨從業(yè)資格(期貨基礎(chǔ)知識)歷年真題試卷匯編27
- 人工智能學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 北師大版(2019)必修第二冊Unit 5 Humans and nature Lesson 3 Race to the pole教學(xué)設(shè)計
- 《毛概》23版學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 2024CSCO胰腺癌診療指南解讀
- 窗簾采購?fù)稑?biāo)方案(技術(shù)方案)
- 電力安全工作規(guī)程考試試題(答案)
- 2024-2030年串番茄行業(yè)市場發(fā)展分析及前景趨勢與投資研究報告
- 城市燃氣管網(wǎng)改造合同
- 2024-2025學(xué)年廣東省東莞市高三思想政治上冊期末試卷及答案
評論
0/150
提交評論