單片機(jī)原理及其嵌入式應(yīng)用教程完美版_第1頁(yè)
單片機(jī)原理及其嵌入式應(yīng)用教程完美版_第2頁(yè)
單片機(jī)原理及其嵌入式應(yīng)用教程完美版_第3頁(yè)
單片機(jī)原理及其嵌入式應(yīng)用教程完美版_第4頁(yè)
單片機(jī)原理及其嵌入式應(yīng)用教程完美版_第5頁(yè)
已閱讀5頁(yè),還剩384頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

單片機(jī)原理及其嵌入式應(yīng)用教程09February2023單片機(jī)概述

單片機(jī)的發(fā)展處理器體系結(jié)構(gòu)_馮.諾依曼結(jié)構(gòu)存儲(chǔ)器有程序存儲(chǔ)器與數(shù)據(jù)存儲(chǔ)器,一般前者用ROM,后者用RAM,他們與CPU的連接有兩種方案:馮.諾依曼結(jié)構(gòu)和哈佛結(jié)構(gòu)。馮·諾伊曼結(jié)構(gòu),也稱(chēng)普林斯頓結(jié)構(gòu),是一種將程序指令存儲(chǔ)器和數(shù)據(jù)存儲(chǔ)器合并在一起的存儲(chǔ)器結(jié)構(gòu)。程序指令存儲(chǔ)地址和數(shù)據(jù)存儲(chǔ)地址指向同一個(gè)存儲(chǔ)器的不同物理位置,因此程序指令和數(shù)據(jù)的寬度相同。馮·諾伊曼結(jié)構(gòu)計(jì)算機(jī)將代碼作為一種特殊的數(shù)據(jù)來(lái)操作。這種結(jié)構(gòu)方案如下圖:程序存儲(chǔ)器CPU數(shù)據(jù)存儲(chǔ)器Motorola公司的微處理器采用此種結(jié)構(gòu)存儲(chǔ)器統(tǒng)一編址哈佛結(jié)構(gòu)哈佛結(jié)構(gòu)是一種將程序指令存儲(chǔ)和數(shù)據(jù)存儲(chǔ)分開(kāi)的存儲(chǔ)器結(jié)構(gòu)。中央處理器首先到程序指令存儲(chǔ)器中讀取程序指令內(nèi)容,解碼后得到數(shù)據(jù)地址,再到相應(yīng)的數(shù)據(jù)存儲(chǔ)器中讀取數(shù)據(jù),并進(jìn)行下一步的操作(通常是執(zhí)行)。程序指令存儲(chǔ)和數(shù)據(jù)存儲(chǔ)分開(kāi),可以使指令總線(xiàn)和數(shù)據(jù)總線(xiàn)有不同的數(shù)據(jù)寬度,如Microchip公司的PIC16芯片的程序指令是14位寬度,而數(shù)據(jù)是8位寬度。Intel公司的MCS-51/96系列的單片機(jī)就是采用這種結(jié)構(gòu)這種結(jié)構(gòu)方案如下圖:程序存儲(chǔ)器CPU數(shù)據(jù)存儲(chǔ)器存儲(chǔ)器分離編址I/O端口和寄存器的編址I/O端口分離編址:I/O端口獨(dú)立開(kāi)辟一個(gè)空間,用專(zhuān)門(mén)的I/O訪問(wèn)擴(kuò)展線(xiàn)與指令實(shí)現(xiàn)I/O操作。如Intel公司的80×86指令系統(tǒng)有IN和OUT指令實(shí)現(xiàn)I/O口操作。I/O端口統(tǒng)一編址:將I/O地址與存儲(chǔ)器地址統(tǒng)一在一個(gè)空間,分配不同的地址。寄存器編址原則類(lèi)似。Motorola微控制器的寄存器占用存儲(chǔ)器資源,為它們分配了一些專(zhuān)用的地址空間CPU程序存儲(chǔ)器數(shù)據(jù)存儲(chǔ)器I/O端口寄存器統(tǒng)一編址的體系結(jié)構(gòu)內(nèi)部時(shí)序內(nèi)部時(shí)序CPU08內(nèi)部時(shí)序由4相(節(jié)拍)組成,分別為T(mén)1、T2、T3、T4,各相輸出一個(gè)時(shí)鐘脈沖,相位差90°。每4拍組成一個(gè)CPU時(shí)鐘周期,可合并看成一個(gè)CPU總線(xiàn)時(shí)鐘。定義T1上升沿為CPU總線(xiàn)時(shí)鐘上升沿,地址總線(xiàn)上下一個(gè)新地址在T3上升沿開(kāi)始有效。數(shù)據(jù)總線(xiàn)上的數(shù)據(jù)刷新與T1上升沿同步如總線(xiàn)時(shí)鐘頻率為8M,CPU的T節(jié)拍頻率就為32M,鎖相環(huán)時(shí)鐘發(fā)生電路或晶振電路需輸出32M的時(shí)鐘頻率。周期1周期2T1T2T3T4T1T2T3T4T1T2T3T4地址周期N數(shù)據(jù)周期N執(zhí)行周期CPU時(shí)鐘內(nèi)部地址總線(xiàn)內(nèi)部數(shù)據(jù)總線(xiàn)內(nèi)部時(shí)序內(nèi)部時(shí)序CPU08內(nèi)部時(shí)序由4相(節(jié)拍)組成,分別為T(mén)1、T2、T3、T4,各相輸出一個(gè)時(shí)鐘脈沖,相位差90°。每4拍組成一個(gè)CPU時(shí)鐘周期,可合并看成一個(gè)CPU總線(xiàn)時(shí)鐘。定義T1上升沿為CPU總線(xiàn)時(shí)鐘上升沿,地址總線(xiàn)上下一個(gè)新地址在T3上升沿開(kāi)始有效。數(shù)據(jù)總線(xiàn)上的數(shù)據(jù)刷新與T1上升沿同步如總線(xiàn)時(shí)鐘頻率為8M,CPU的T節(jié)拍頻率就為32M,鎖相環(huán)時(shí)鐘發(fā)生電路或晶振電路需輸出32M的時(shí)鐘頻率。周期1周期2T1T2T3T4T1T2T3T4T1T2T3T4地址周期N數(shù)據(jù)周期N執(zhí)行周期CPU時(shí)鐘內(nèi)部地址總線(xiàn)內(nèi)部數(shù)據(jù)總線(xiàn)流水線(xiàn)技術(shù)流水線(xiàn)技術(shù)將每條指令分解為多步,并讓不同指令的各步操作重疊,從而實(shí)現(xiàn)幾條指令并行處理,以加速程序運(yùn)行過(guò)程。例如將指令分為3步:取值譯碼執(zhí)行取指譯碼執(zhí)行取指譯碼執(zhí)行取指譯碼執(zhí)行T1T2T3T4T5T6采用流水線(xiàn)技術(shù)后,并沒(méi)有加速單條指令的執(zhí)行,但實(shí)現(xiàn)多條指令的不同步驟同時(shí)執(zhí)行,總體上加快了指令流速度縮短程序執(zhí)行時(shí)間取指譯碼執(zhí)行第一條指令第二條指令第三條指令第四條指令…M68HC908GP32單片機(jī)基本結(jié)構(gòu)概述09February2023基本結(jié)構(gòu)概述

MC68HC908GP32TBMADCKBICOPLVIBRKMONSCISPITIM1TIM2PORTAPORTBPORTCPORTDPORTE88782CPU08FlashRAMSIMIRQCGMC與HC05向下兼容的中央處理器模塊512BytesRAM32,292BytesFlash監(jiān)控模塊斷點(diǎn)模塊系統(tǒng)集成模塊外部中斷模塊正常操作監(jiān)視模塊低電壓禁止模塊32kHz時(shí)鐘發(fā)生器模塊時(shí)基模塊8個(gè)鍵盤(pán)中斷8通道/8-BitA/D轉(zhuǎn)換33個(gè)雙向I/O口所有I/O引腳允許10mA灌電流10mA拉電流兩個(gè)2通道16-Bit定時(shí)器

輸入捕捉

輸出比較

脈寬調(diào)制輸出PWM異步串行通信接口SCI同步串行外圍接口SPIDIP40,QFP440頁(yè)直接尋址可實(shí)現(xiàn)位操作速度快,代碼效率高32256字節(jié)Flash存儲(chǔ)區(qū)控制及狀態(tài)寄存器區(qū)32192字節(jié)未定義3字節(jié)未定義區(qū)16字節(jié)未定義區(qū)307字節(jié)監(jiān)視ROM區(qū)43字節(jié)未定義區(qū)Flash塊保護(hù)寄存器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映象寄存器:通過(guò)存儲(chǔ)器地址訪問(wèn)的寄存器寄存器與存儲(chǔ)器一樣被分配地址,軟件通過(guò)讀寫(xiě)寄存器地址訪問(wèn)寄存器設(shè)備(沒(méi)有專(zhuān)用I/O指令)。要使用寄存器名前需用偽指令確定寄存器名和地址的對(duì)應(yīng)關(guān)系程序和數(shù)據(jù)存儲(chǔ)器(都用相同的存儲(chǔ)器,統(tǒng)一編址映象)32kFlash512字節(jié)RAM64字節(jié)I/O寄存器區(qū)512ByteRAMHC08GP32存儲(chǔ)器組織M68HC08中央處理器結(jié)構(gòu)701587015070150算術(shù)邏輯運(yùn)算部件ALUAHXSPCCRPCCPU寄存器M68HC08系列單片機(jī)的CPU寄存器16-bit

16-bit

16-bit

EasierSignedArithmetic

累加器(A)Accumulator(A)堆棧指針(SP)StackPointer(SP)程序計(jì)數(shù)器(PC)ProgramCounter(PC)條件寄存器(CCR)ConditionCodeRegister(CCR)進(jìn)位/借位標(biāo)志Carry/Borrow(MSB)負(fù)標(biāo)志位Negative(MSB=1)中斷屏蔽標(biāo)志位InterruptMask半進(jìn)位標(biāo)志位Half-Carry(forBCD)零標(biāo)志位Zero溢出標(biāo)志位Two’sComplimentOverflowVXXXXX0000011707011HINZC15變址寄存器(H:X)IndexRegister(HX)XH09February2023尋址方式與指令系統(tǒng)隱含尋址隱含尋址INHInherentCPU08有16種尋址方式執(zhí)行指令的所有信息均在操作碼中,CPU不需要從寄存器、存儲(chǔ)器中取操作數(shù),操作數(shù)隱含在累加器、變址寄存器或狀態(tài)寄存器中。具有隱含尋址方式的指令均為單字節(jié)指令I(lǐng)NCA ;累加器A內(nèi)容加1,機(jī)器碼$4C INCX ;變址寄存器X內(nèi)容加1,機(jī)器碼$5CDECA ;累加器A內(nèi)容減1,機(jī)器碼$4ADECX ;變址寄存器X內(nèi)容減1,機(jī)器碼$5ACEI ;中斷屏蔽位I清0,機(jī)器碼$9ASEI ;中斷屏蔽位I置1,機(jī)器碼$9B立即尋址操作數(shù)包含在操作碼的后繼字節(jié)中。立即尋址主要用于訪問(wèn)常數(shù),多為二字節(jié)指令,第一個(gè)字節(jié)為操作碼,第二字節(jié)為操作數(shù),在立即尋址方式中操作數(shù)為立即數(shù),立即數(shù)前要加符號(hào)前綴“#”,說(shuō)明是操作數(shù)值而不是地址。立即尋址IMMImmediateLDA#%01011010 ;將二進(jìn)制數(shù)%01011010送累加器A,機(jī)器碼為$A65A,%表示后面的操作數(shù)是二進(jìn)制數(shù)。ADD#$30 ;將累加器A的內(nèi)容與立即數(shù)$30進(jìn)行不帶進(jìn)位加運(yùn)算,結(jié)果存至A,機(jī)器碼$AB30,$表示后面的操作數(shù)為16進(jìn)制數(shù)LDHX#$8030 ;三字節(jié)指令,給變址寄存器H:X賦值$8030,機(jī)器碼為$458030,執(zhí)行后H的(H)=$80,(X)=$30LDX#-10;默認(rèn)十進(jìn)制直接尋址直接尋址DIRDirect操作數(shù)的有效地址包含于操作碼后的一個(gè)字節(jié)中。由于操作數(shù)的有效地址僅1字節(jié),由此直接尋址方式只能對(duì)存儲(chǔ)器0頁(yè)的256個(gè)字節(jié)空間($0000~$00FF)進(jìn)行操作。0頁(yè)存儲(chǔ)器有I/O控制和狀態(tài)寄存器,常用的用戶(hù)數(shù)據(jù)也盡量放在0頁(yè),這樣訪問(wèn)可節(jié)省程序空間,提高訪問(wèn)速度。直接尋址指令一般為雙字節(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擴(kuò)展尋址擴(kuò)展尋址EXTExtended操作數(shù)的有效地址包含于操作碼后的兩個(gè)字節(jié)中。由于操作數(shù)有效地址2字節(jié),可尋址64k存儲(chǔ)空間。擴(kuò)展尋址一般為三字節(jié)第二、三字節(jié)是操作數(shù)有效地址LDA$0200 ;將$0200單元內(nèi)容送累加器A,機(jī)器碼為$C60200STA$0240 ;將累加器A的內(nèi)容送$0200單元,機(jī)器碼為$C7024SourceFormOperationDescriptionEffectonCCRAddressModeOpcodeOperandCyclesVHINZCLDA#oprLoadAfromMA←(M)0---IMMA6ii2LDAoprDIRB6dd3LDAoprEXTC6hh

ll4↓↑↓↑變址尋址_無(wú)偏移量變址尋址無(wú)偏移量變址尋址操作數(shù)的有效地址在16位變址寄存器H:X中。由于H:X為16位,可訪問(wèn)64k空間。無(wú)偏移量變址尋址指令為單字節(jié)指令LDA,X ;將H:X指定的存儲(chǔ)單元的內(nèi)容送A,機(jī)器碼為$F60242$7FLDA,XH:X起到16位指針的作用AHX$0240$0241$0242$0243$0244$7F變址尋址_8位偏移量變址尋址8位偏移量變址尋址操作數(shù)的有效地址是16位變址寄存器H:X中的無(wú)符號(hào)整數(shù)與操作碼后的一個(gè)字節(jié)無(wú)符號(hào)整數(shù)之和,也可以訪問(wèn)64k空間。8位偏移量變址尋址指令為雙字節(jié)指令LDA$10,X ;將H:X中的值加上偏移量$10所得地址的存儲(chǔ)單元的內(nèi)容送A,機(jī)器碼為$E610$7FLDA$10,X偏移量為&10H:X內(nèi)容不變…0200…AHX$0200$0201$020F$0210$7F變址尋址_16位偏移量變址尋址16位偏移量變址尋址操作數(shù)的有效地址是16位變址寄存器H:X中的無(wú)符號(hào)整數(shù)與操作碼后的兩個(gè)字節(jié)無(wú)符號(hào)整數(shù)之和,也可以訪問(wèn)64k空間。16位偏移量變址尋址指令為三字節(jié)指令LDA$100,X ;將H:X中的值加上偏移量$100所得地址的存儲(chǔ)單元的內(nèi)容送A,機(jī)器碼為$D60100$7FLDA$100,X偏移量為&100H:X內(nèi)容不變…0100…AHX$0100$0101$020F$0200$7F8位偏移量和16位偏移量8位偏移量為無(wú)符號(hào)整數(shù)設(shè)LDHX#$0090STA$C0,X將累加器內(nèi)容送$0150單元16位偏移量為符號(hào)數(shù)STA$FFFE,X將累加器A的內(nèi)容送$8E單元STA-$10,X將累加器A的內(nèi)容送$80單元查表程序LOOK:LDATab,X;LDA32773,XBRA*TabFCB$00,$01,$04,$09FCB$10,$19,$24,$31FCB$40,$51000104091625364964818005TabH:X00:07查找表首地址800E+7變址:H:X不變,改變偏移量偏移量不變,改變H:X變址尋址變址尋址以H:X作為指針無(wú)偏移量變址尋址(IX)STA,X8位偏移量變址尋址(IX1)ADD$10,X16位偏移量變址尋址(IX2)AND$1030,X如(H:X)=$1030,操作數(shù)地址為$1030$1040$2060堆棧堆棧由棧區(qū)和堆棧指針構(gòu)成。棧區(qū)是一組按先進(jìn)后出(FILO)方式工作的寄存器或存儲(chǔ)單元,用于存放數(shù)據(jù)。堆棧指針(SP)是用來(lái)指示棧頂?shù)刂返募拇嫫鳎糜谧詣?dòng)管理?xiàng)^(qū),指示數(shù)據(jù)存入(進(jìn)棧)或取出(出棧)的位置。$0100$00FF$00FE$00FD$00FCSPA$0100$00FFB$00FE$0100$00FF$00FE$00FD$00FCSP$00FEBA$00FF$0100堆棧類(lèi)型硬件堆棧:棧區(qū)由微處理器內(nèi)部的寄存器組構(gòu)成;軟件堆棧:由軟件在內(nèi)存中開(kāi)辟一個(gè)特定的RAM區(qū)構(gòu)成棧區(qū)。堆棧指針用來(lái)指示棧頂位置,可由用戶(hù)設(shè)初值,一旦設(shè)定后棧底位置即確定,此后SP內(nèi)容即棧頂位置由CPU自動(dòng)管理。隨著堆棧操作的進(jìn)行,SP的值會(huì)自動(dòng)變化,其變化方向因棧區(qū)的編址方式分為向下增長(zhǎng)型和向上增長(zhǎng)型。向下增長(zhǎng)型堆棧:數(shù)據(jù)進(jìn)棧時(shí),SP自動(dòng)減量,向上浮動(dòng)而指向新棧頂。數(shù)據(jù)出 棧時(shí),SP自動(dòng)增量,向下浮動(dòng)指向新棧頂,M68HC08就是向 下增長(zhǎng)型。向上增長(zhǎng)型堆棧與之相反堆棧主要用于中斷處理和子程序調(diào)用堆棧尋址堆棧尋址堆棧指針是16位寄存器,堆棧尋址就是將堆棧指針作變址寄存器使用。堆棧尋址有8位偏移量(SP1)和16位偏移量(SP2)兩種例如:SP1: LDA$10,SP ;將SP中的值加上$10所得和作為存儲(chǔ)器單元地址,將其內(nèi)容送A,機(jī)器碼$9EE610如(SP)=$0200,指令將($0210)送ASP2:ADC$0120,SP ;;將SP中的值加上$0120所得和作為存儲(chǔ)器單元地址,將其內(nèi)容與A的值進(jìn)行帶進(jìn)位加法,結(jié)果送A,機(jī)器碼$9ED90120如(SP)=$0200,(A)=$35,進(jìn)位位C=1,($0120+$0200)=$35,指令執(zhí)行后(A)=$6B堆棧尋址_8位偏移量堆棧變址尋址8位偏移量堆棧變址尋址(SP1)操作數(shù)的有效地址是16位堆棧指針(SP)中的無(wú)符號(hào)整數(shù)與操作碼后的一個(gè)字節(jié)無(wú)符號(hào)整數(shù)之和,也可以訪問(wèn)64k空間。8位偏移量堆棧變址尋址指令為三字節(jié)指令LDA$10,SP ;將SP中的值加上偏移量$10所得地址的存儲(chǔ)單元的內(nèi)容送A,機(jī)器碼為$9EE610$7FLDA$10,SPA偏移量為&10SP內(nèi)容不變0200SP$0200$0201…$020F$0210…$7F堆棧尋址_16位偏移量堆棧變址尋址16位偏移量堆棧變址尋址(SP2)操作數(shù)的有效地址是16位堆棧指針(SP)中的無(wú)符號(hào)整數(shù)與操作碼后的一個(gè)字節(jié)無(wú)符號(hào)整數(shù)之和,也可以訪問(wèn)64k空間。16位偏移量變址尋址指令為三字節(jié)指令LDA$100,SP ;將SP中的值加上偏移量$100所得地址的存儲(chǔ)單元的內(nèi)容送A,機(jī)器碼為$9EE610$7FLDA$100,SP偏移量為&100SP內(nèi)容不變0100ASP$0100$0101…$01FF$0200…$7F存儲(chǔ)器-存儲(chǔ)器尋址這類(lèi)指令將將一個(gè)存儲(chǔ)單元的內(nèi)容傳送到另一個(gè)存儲(chǔ)單元,其中至少有一個(gè)地址是在0頁(yè)存儲(chǔ)器-存儲(chǔ)器尋址有4種:立即尋址到直接尋址(IMD)直接尋址到直接尋址(DD)自動(dòng)變址尋址到直接尋址(IX+D)直接尋址到自動(dòng)變址尋址(DIX+)立即尋址到直接尋址(IMD)和直接尋址到直接尋址(DD)立即尋址到直接尋址方式(IMD):三字節(jié)指令,第一個(gè)字節(jié)為操作碼,第二字節(jié)為立即數(shù),第三字節(jié)為8位地址MOV#$FF,$00 ;立即數(shù)$FF送$00單元源目的直接尋址到直接尋址方式(DD):三字節(jié)指令,第一個(gè)字節(jié)為操作碼,源操作數(shù)和目的操作數(shù)都是直接地址MOV$60,$00 ;$60單元內(nèi)容送$00單元源目的這類(lèi)指令通常用于初始化寄存器和變量,如MOV#$FF,PTA由于直接地址是8位,這兩種尋址方式只能實(shí)現(xiàn)0頁(yè)內(nèi)的傳送自動(dòng)變址尋址到直接尋址(IX+D)雙字節(jié)指令,第一字節(jié)是操作碼,第二字節(jié)為目的地址,源操作數(shù)是16位變址寄存器H:X,將H:X所指向單元內(nèi)容送目的存儲(chǔ)器地址單元,然后H:X中的值自動(dòng)加1,指向下一單元HX0100$7F$0041$0042…$0100$0101…$0040$01020141$7FLDHX#$0100MOVX+,$40$66LDA#$7FSTA$0100LDA#$66STA$0101LDHX#$0100MOVX+,$40MOVX+,$41立即尋址擴(kuò)展尋址立即尋址擴(kuò)展尋址擴(kuò)展尋址自動(dòng)變址到直接尋址可實(shí)現(xiàn)64k內(nèi)任一地址到0頁(yè)內(nèi)的直接傳送直接尋址到自動(dòng)變址尋址(DIX+)雙字節(jié)指令,第一字節(jié)是操作碼,第二字節(jié)為源操作數(shù)8位地址,目的操作數(shù)是16位變址寄存器H:X,將將源操作數(shù)地址存儲(chǔ)單元內(nèi)容送到H:X所指向單元,然后H:X中的值自動(dòng)加1,指向下一單元HX0240$7F$0041$0042…$0240$0241…$0040$02420241$7FLDHX#$0240MOV$40,X+MOV#$7F,$40MOV#$66,$41LDHX#$0240MOV$40,X+MOV$41,X+立即尋址到直接尋址擴(kuò)展尋址直接尋址到自動(dòng)變址可實(shí)現(xiàn)0頁(yè)向64k內(nèi)任一地址的直接傳送$66程序執(zhí)行過(guò)程LDHX#$40MOV#$44,$40LDA#$55ADD,XSTA$100BRA$4500406E4440A655FBC901008000800180028003800480058006800780088009800A800B8000PC458001008002408003PC+18006PC+18008PC+18009PC+1相對(duì)尋址(REL)相對(duì)尋址用于轉(zhuǎn)移指令。計(jì)算機(jī)運(yùn)行時(shí)程序計(jì)數(shù)器PC總指向下一條待執(zhí)行指令的地址在相對(duì)尋址方式中,CPU首先測(cè)試給定的條件,如果滿(mǎn)足條件,則發(fā)生相對(duì)轉(zhuǎn)移將當(dāng)前程序計(jì)數(shù)器PC的值加上指令碼所占字節(jié)數(shù),再加上指令操作碼后的8位有符號(hào)數(shù),使程序轉(zhuǎn)移到PC指定的新地址處,否則執(zhí)行該指令的下一條指令。相對(duì)尋址方式的指令為雙字節(jié)指令,一個(gè)為操作碼,另一個(gè)是相對(duì)偏移量,轉(zhuǎn)移范圍為相對(duì)于存放機(jī)器碼地址的-126~+129用戶(hù)在編匯編語(yǔ)言程序時(shí),不必自己計(jì)算相對(duì)偏移量,只要寫(xiě)出待跳轉(zhuǎn)的地址標(biāo)號(hào)代替偏移量,匯編程序會(huì)在匯編時(shí)自動(dòng)計(jì)算偏移量,并檢查是否超過(guò)有效轉(zhuǎn)移范圍相對(duì)尋址例main:CLC ;設(shè)置進(jìn)位標(biāo)志位C為0BCCP1;如C為0,轉(zhuǎn)P1LDA#$FF ;(A)←$FFBRAP2 ;無(wú)條件轉(zhuǎn)P2P1:LDA#$00 ;(A)←$00P2:BRA$ ;原地踏步98CLC2404BCC*+68003A6FFLDA#0xFF80052002BRA*+48007A600LDA#0x0020FEBRA*+0800B000000BRSET地址代碼指令相對(duì)尋址說(shuō)明98CLC2404BCC*+68003A6FFLDA#0xFF80052002BRA*+48007A600LDA#0x0020FEBRA*+0800B000000BRSET地址代碼指令80012404BCC*+624為操作碼,04為偏移量PC總指向下一條待執(zhí)行指令,因此當(dāng)執(zhí)行本條轉(zhuǎn)移指令BCCP1時(shí),PC正指向8003,即(PC)=8003,如轉(zhuǎn)移條件滿(mǎn)足,8003加上偏移量04,PC的新值為8007,即PC指向8007,正是符號(hào)地址P1-待跳轉(zhuǎn)的地址至于BCC*+6,則是BCCP1編譯后的源碼書(shū)寫(xiě)格式,“*”或“$”表示當(dāng)前指令位置,不要與機(jī)器碼2404混淆P1:P2:800920FEBRA*+0BRA為無(wú)條件轉(zhuǎn)移指令,20為操作碼,偏移量$FE是-2的補(bǔ)碼,執(zhí)行本條指令時(shí)PC已指向800B,800B-2=8009,PC又指向8009,實(shí)現(xiàn)原地跳轉(zhuǎn),不繼續(xù)往下執(zhí)行或者說(shuō)*+0表示當(dāng)前指令位置不變PC相對(duì)尋址執(zhí)行過(guò)程982404A6FF2002A60020FE000000800080018003800580078009800BCLCBCCP1LDA#$FFBRAP2LDA#$00BRA$BRSETCLC BCCP1 ;2404LDA#$FFBRAP2 P1:LDA#$00 P2:BRA$ 8000PC8001C=0800380078003+04=8007無(wú)偏移量變址后加1尋址在MHC08指令系統(tǒng)中,只有一條指令采用這種尋址方式,這是一條相對(duì)轉(zhuǎn)移指令:CBEQX+,rel如H:X所指向的存儲(chǔ)單元中的值和累加器A的值相等則轉(zhuǎn)移,否則順序執(zhí)行下一條指令。但無(wú)論轉(zhuǎn)移或不轉(zhuǎn)移H:X的值都自動(dòng)加1同樣,編程時(shí)無(wú)需計(jì)算偏移量,寫(xiě)成程序標(biāo)號(hà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$02018位偏移量變址后加1尋址在MHC08指令系統(tǒng)中,只有一條指令采用這種尋址方式,這是一條相對(duì)轉(zhuǎn)移指令:CBEQopr,X+,rel先將8位偏移量opr與H:X所指向的存儲(chǔ)單元中的值相加,所得和為地址的存儲(chǔ)單元中的值和累加器A的值相等則轉(zhuǎn)移,否則順序執(zhí)行下一條指令。但無(wú)論轉(zhuǎn)移或不轉(zhuǎn)移H:X的值都自動(dòng)加1同樣,編程時(shí)無(wú)需計(jì)算偏移量,寫(xiě)成程序標(biāo)號(hà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$0201尋址方式小結(jié)隱含尋址(INH)立即尋址(IMM)直接尋址(DIR)擴(kuò)展尋址(EXT)變址尋址變址寄存器變址堆棧指針變址無(wú)偏移量變址尋址(IX)8位偏移量變址尋址(IX1)16位偏移量變址尋址(IX2)8位偏移量堆棧尋址(SP1)16位偏移量堆棧尋址(SP2)存儲(chǔ)器到存儲(chǔ)器尋址立即尋址到直接尋址(IMD)直接尋址到直接尋址(DD)自動(dòng)變址尋址到直接尋址(IX+D)直接尋址到自動(dòng)變址尋址(DIX+)轉(zhuǎn)移用到的尋址方式相對(duì)尋址(REL)無(wú)偏移量后加1尋址(IX+)8位偏移量后加1尋址(IX1+)尋址方式例指令表SourceFormOperationDescriptionEffectonCCRAddressModeOpcodeOperandCyclesVHINZCLDA#oprLoadAfromMA←(M)0---IMMA6ii2LDAoprDIRB6dd3LDAoprEXTC6hh

ll4ANDoprLogicANDA←(A)&(M)0---EXTC4hh

ll4ANDopr,xIX2E4eeff4ANDopr,xIX1F4ff3BEQrelBranchifEqualPC←(PC)+2+rel?(z)=1------REl27rr3LDHXoprLoadH:XfromMH:X←(M:M+1)0---DIR55dd4LDHX#oprIMM45iijj↓↑↓↑↓↑↓↑A累加器CCR條件寄存器dd

直接尋址方式操作數(shù)hh

ll擴(kuò)展尋址方式操作數(shù)的高位和低位eeff16位偏移量變址尋址的高位和低位↓↑↓↑M存儲(chǔ)器位置opr

操作數(shù)PC程序計(jì)數(shù)器relPC相對(duì)轉(zhuǎn)移字節(jié)數(shù)據(jù)傳送指令LDA#$80 ;十六進(jìn)制立即數(shù)$80A,#表示立即數(shù)IMM→STA$10,X ;(A)((H:X)+$10)將A的數(shù)據(jù)送到以H:X中的數(shù)加上偏移量$10,形 ;成的地址單元。如H:X=$0210,A=$55,運(yùn)行后($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ù)傳送指令_寄存器間傳送→TXS ;(H:X)-1SPH:SPLH:X中的值減1后送SP,如H:X=$023F,則 ;SP=$023E,TXS通常用來(lái)設(shè)置堆棧指針→TSX ;(SPH:SPL)+1H:XSP中的值加1后送H:X,如(SP)=$023E,則 ;H:X=$023F。→例:設(shè)置棧頂LDHX#$023FTXS數(shù)據(jù)傳送指令_堆棧$0100$00FF$00FE$00FD$00FCSPAA$0100$00FFBB$00FE$0100$00FF$00FE$00FD$00FCSP$00FEBBAA$00FF$0100PUSHHPUSHXAAHXBBSP總是指向棧頂堆棧操作永遠(yuǎn)是對(duì)棧頂操作進(jìn)棧:先進(jìn)棧,SP-1出棧:先SP+1,數(shù)據(jù)出棧HXPULXPULH指令順序:先進(jìn)后出方不會(huì)錯(cuò)亂存儲(chǔ)器間傳送指令

LDHX#$0100MOV#$AA,$40MOV$40,X+算術(shù)類(lèi)指令溢出11半進(jìn)位中斷屏蔽負(fù)標(biāo)志0標(biāo)志進(jìn)位位0110100011001加法指令A(yù)DD:不帶進(jìn)位加ADDC:帶進(jìn)位加LDA#$88ADD#$88大多數(shù)算術(shù)指令中的一個(gè)操作數(shù)隱含是累加器,運(yùn)算結(jié)果也保存在AA:10001000+10001000000100001ACCRC:上電復(fù)位狀態(tài)VHINZC00100加法指令

LDA#$FFADC#$01運(yùn)行后:V=0H=1N=0Z=1C=1A:11111111

00000001+00000001/01AC:C=1/0LDA#$FFINCA運(yùn)行后:A=0V=0N=0Z=1但C和H不變這是ADD#$1和INC指令不同之處取反指令和比較指令取反指令:LDA#-$1;注意CodeWarrior

;負(fù)數(shù)書(shū)寫(xiě)格式COMA;$FF-($FF)=0→AMOV#$AA,$80COM$80;$55→$80比較指令:比較指令將兩個(gè)操作數(shù)(其中一個(gè)是(A、X或(H:X))作了一次減法,但僅影響標(biāo)志位,兩個(gè)操作數(shù)都不變MOV#$AA,$80LDA#$AACMP$80;$AA-$AA=0,所以Z=1,說(shuō)明相等16位比較:MOV#$12,$80MOV#$34,$81LDHX#$1200CPHX$80;(H:X)=$1200,($80)=$12,($81)=$34

;$1200-$1234<0,N=1,C=1,Z=0說(shuō)明 ;兩數(shù)不等,且(H:X)<($80)($81)算術(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↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑符號(hào)位的擴(kuò)展_AIS,AIX計(jì)算機(jī)中符號(hào)數(shù)以補(bǔ)碼形式表示最高位位符號(hào)位:+1(00000001)2(01)16-1(11111111)2(FF)168位符號(hào)數(shù)([-128,+127])擴(kuò)展為16位,就是將符號(hào)位擴(kuò)展到高8位中+1(00000000000000001)2-1(11111111111111111)2LDHX#$02TXS ;(SP)=(01)16=(0000000000000001)2

AIS#$80;1111111110000000

1111111110000001+SPSP設(shè)置只能由H:X傳送立即數(shù)只能是8位符號(hào)數(shù)AIX#opr8H:X←(H:X)+(16<<M);-128<=#opr8<=127邏輯運(yùn)算指令邏輯運(yùn)算類(lèi)指令都是對(duì)累加器A和另一操作數(shù)按位進(jìn)行,結(jié)果返回AVHNZC0-??-

LDA#$AA;10101010AND#$A5;^10100101A10100000要將某位取反,可對(duì)該位用1去異或,而其余各位用0異或LDA#$00;00000000EOR#$40;⊕01000000A01000000位操作指令位測(cè)試指令BIT:計(jì)算機(jī)進(jìn)行BIT指令時(shí)實(shí)際是對(duì)累加器A和操作數(shù)進(jìn)行了一次AND運(yùn)算,與AND的區(qū)別是“與”運(yùn)算結(jié)果不存入累加器A,因此兩個(gè)操作數(shù)都不變,僅改變標(biāo)志位。清位:BCLRn,addr8MOV#$FF,$80;($80)=11111111BCLR0,$80;($80)=11111110由于是直接尋址addr8,因此只能0頁(yè)尋址,對(duì)存儲(chǔ)器前256個(gè)單元操作,其位操作空間位256×8=2048。指令中n=0~7,不影響任何標(biāo)志位置位:BSETn,addr8清/置標(biāo)志位C:CLC C←0SEC C←1清/置位中斷屏蔽位:CLII←0開(kāi)中斷SEII←1關(guān)中斷第0位算術(shù)移位指令算術(shù)左移ASL和邏輯左移LSL,相當(dāng)操作數(shù)×21000000

0CAASLA0算術(shù)右移ASR,相當(dāng)操作數(shù)÷2,右移時(shí)符號(hào)位復(fù)制以保持?jǐn)?shù)值符號(hào)不變1011111

0CAASRA1(01000000)2=64,64×2=128=(10000000)2(10111110)2=-66,-66/2=-33=(11011111)2循環(huán)左移指令循環(huán)左移ROL,進(jìn)位位C與操作數(shù)作為整體循環(huán)移位1000000

0CAROLAASLA10000000

10

C00000001ROLA跳轉(zhuǎn)指令跳轉(zhuǎn)指令無(wú)條件轉(zhuǎn)移指令條件轉(zhuǎn)移指令相對(duì)轉(zhuǎn)移指令絕對(duì)轉(zhuǎn)移指令測(cè)試狀態(tài)標(biāo)志條件轉(zhuǎn)移指令測(cè)試外中斷(IRQ)條件轉(zhuǎn)移指令位測(cè)試轉(zhuǎn)移指令減1不為0轉(zhuǎn)移指令比較相等轉(zhuǎn)移指令調(diào)用子程序指令相對(duì)調(diào)用指令絕對(duì)調(diào)用指令返回指令從子程序返回指令從中斷返回指令除位測(cè)試轉(zhuǎn)移指令外,所有轉(zhuǎn)移指令不影響標(biāo)志位位測(cè)試轉(zhuǎn)移指令位測(cè)試轉(zhuǎn)移指令將測(cè)試位送標(biāo)志位C,然后判斷轉(zhuǎn)移。M:存儲(chǔ)器位置,rel相對(duì)轉(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)00020406080A0C0Edd

rrdd

rr

dd

rr

dd

rr

dd

rr

dd

rr

dd

rr

dd

rr55555555BSETn,oprSETBitninMMn←1----

--DIR(b0)l10dd4位測(cè)試?yán)?

MOV#%01000000,$40 BRCLR6,$40,P1 LDA#$FF BRAP2 P1: LDA#$00 P2: BRA$$40單元位6=0?ynP1:A←$FFP2:A←$00相對(duì)轉(zhuǎn)移和絕對(duì)轉(zhuǎn)移2004A6FF2002A60020FE0000000080008002800480068008800A800DBRAP1LDA#$FFBRAP2LDA#$00BRA$BRSETBRAP1 ;2404LDA#$FFBRAP2 P1:LDA#$00 P2:BRA$ 8000PC80028006BRArel:(PC)+rel→PC絕對(duì)轉(zhuǎn)移指令JMP:PC←跳轉(zhuǎn)地址相對(duì)和絕對(duì)轉(zhuǎn)移指令

JMPP2 ORG$8110P2:LDA#$AA8000CC8110JMP0x8110...8110A6AALDA#0xAA

BRAP2 ORG$8110P2:LDA#$AA8000200EBRA*+16;abs=8010...8110A6AALDA#0xAA比較ORG$8080、$8081、$8082等情況減1不為0轉(zhuǎn)移指令DBNZArel:A←(A)-1PC←(PC)+3+rel,?(result)≠0

LDX#$0 LDA#$3P1:INCX DBNZAP1延時(shí)程序:LDA#$3DBNZA$思考:A=?可得到最大延時(shí)CLRA

MOV#$2,$40P: LDA#$3P1:NOP DBNZAP1 DBNZ$40,P思考:NOP執(zhí)行了幾次?X=0X=X+1A=A-1whileA≠0A=0轉(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相對(duì)和絕對(duì)轉(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)子程序和返回過(guò)程

MAIN:800045023F LDHX#$023F800394TXS8004AD02BSRSUB_P800620FE BRA$SUB_P:80089DNOP800981RTSuuuuuuuuuuSP023E堆棧將返回地址8006彈出到PC,程序從中斷處8006繼續(xù)執(zhí)行8006進(jìn)堆棧保護(hù),SP-2子程序首地址8008進(jìn)PC,開(kāi)始執(zhí)行子程序程序023D023E023F023C023B棧區(qū)023Cuu0680十進(jìn)制調(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碼7404744707NSA09February2023程序設(shè)計(jì)基礎(chǔ)匯編語(yǔ)言程序格式機(jī)器語(yǔ)言:用二進(jìn)制編碼和儲(chǔ)存的機(jī)器指令(機(jī)器碼)匯編語(yǔ)言:用助記苻表示指令的功能和特征代替機(jī)器指令。由于機(jī)器只能識(shí)別機(jī)器碼,匯編語(yǔ)言源程序只有經(jīng)匯編后生成機(jī)器語(yǔ)言的目標(biāo)程序才能運(yùn)行匯編語(yǔ)言源程序格式:標(biāo)號(hào):操作碼操作數(shù)注釋

LOOP:LDA0,X;X變址尋址置送累加器A標(biāo)號(hào)標(biāo)號(hào)有兩種形式:

(1) 標(biāo)號(hào)的第一個(gè)字符是“*”時(shí),表示該行是注釋行,匯編程序忽略注釋 行。

(2) 可執(zhí)行語(yǔ)句標(biāo)號(hào)的第一個(gè)字符必須是英文字母,后面可接英文字母 數(shù)字、美元苻$和下劃線(xiàn)_。標(biāo)號(hào)區(qū)分大小寫(xiě)。標(biāo)號(hào)在此起符號(hào)地址 的作用,表示轉(zhuǎn)移語(yǔ)句的轉(zhuǎn)向地址或程序的起始地址或數(shù)據(jù)地址。標(biāo)號(hào)后的“:”不是必須的匯編語(yǔ)言源程序格式操作碼操作碼分兩類(lèi)指令碼偽指令碼,由匯編程序用于控制匯編操作,不是執(zhí)行指令操作數(shù)操作數(shù)部分指明了指令的尋址方式和操作數(shù),操作數(shù)可由符號(hào)、表達(dá)式組成,各部分由“,”分割操作數(shù)格式M68HC08尋址方式例無(wú)操作數(shù)累加器和隱含DAA,INCX,ASRX<表達(dá)式>直接、擴(kuò)展或相對(duì)LDA$40,STX$100,BRA$#<表達(dá)式>立即數(shù)LDHX#$023F<表達(dá)式>,X變址LDA$10,X<表達(dá)式>,<表達(dá)式>位置位或清零BCLER4,$40<表達(dá)式>,<表達(dá)式>,<表達(dá)式>位測(cè)試和轉(zhuǎn)移BRSET4,$40,P匯編語(yǔ)言中的表達(dá)式表達(dá)式由符號(hào)、常數(shù)、運(yùn)算符和括號(hào)組成。表達(dá)式的運(yùn)算結(jié)果為操作數(shù)。表達(dá)式可由運(yùn)算符+、-、*、/、%、&、|、^等連接苻號(hào)和常數(shù)或字符“*”(表示當(dāng)前PC的值,也可用“$”)符號(hào)功能符號(hào)功能+加%取余-減&邏輯與*乘|邏輯或/除^異或MC68HC08允許使用的運(yùn)算符及其功能STA$80+$10;編譯后STA0x90STA$90%$90;編譯后STA0x00STA$80^$01;編譯后STA0x81

LDATAB+1,X BRA*TAB:FCB$AA,$BB偽操作指令匯編語(yǔ)言有一類(lèi)不與任何處理器指令對(duì)應(yīng)的偽指令,它們?yōu)閰R編程序?qū)⒎?hào)指令編譯成機(jī)器碼提供信息:地址、數(shù)據(jù)、定位和分段等,偽指令不生成代碼。賦值偽指令:標(biāo)號(hào):EQU<表達(dá)式>注釋如:coefficientEQU5;系數(shù)為5DDRAEQU$0004;A口方向寄存器地址 將常用的地址或數(shù)值用EQU定義為一個(gè)符號(hào)有 助于閱讀和修改定位偽指令:

ORG <表達(dá)式>注釋如:ORG$8100源程序或數(shù)據(jù)編譯后存放在$8100開(kāi)始的存儲(chǔ) 空間 結(jié)束偽指令:

END表示本匯編程序到此結(jié)束常數(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, 一句只能定義一個(gè)字符串程序匯編后:414243AABB85023F00AA41428010E15001程序運(yùn)行后:A=E1,($90)=BB思考:可否LDHXTable1存儲(chǔ)區(qū)域保留偽指令DS或RMB:(<標(biāo)號(hào)>)RMB<表達(dá)式>;也可用DS從標(biāo)號(hào)位置起保留一塊存儲(chǔ)區(qū),其字節(jié)長(zhǎng)度等于表達(dá)式的值。匯編后將存儲(chǔ)區(qū)初始化為0可用RMB.B和RMS.W分別表示后面保留的存儲(chǔ)區(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匯編后

00800000

00

00AABB運(yùn)行后008002000003AABB匯編語(yǔ)言程序設(shè)計(jì)簡(jiǎn)單程序_單字節(jié)16進(jìn)制數(shù)轉(zhuǎn)換為BCD碼254/100=2……5454/10=5……4HA00254100X542B1DS.B1B2DS.B1B3DS.B1LDA#254CLRHLDX#100DIV;分離百位STAB1LDX#10 ;余數(shù)分離十位和個(gè)位

PSHHPULACLRHDIVSTAB2PSHHPULASTAB3BRA*2B10054用堆棧傳送數(shù)據(jù)005410455B24B3;用堆棧實(shí)現(xiàn)A←H;用堆棧實(shí)現(xiàn)H內(nèi)容;送存儲(chǔ)器簡(jiǎn)單程序_單字節(jié)BCD整數(shù)轉(zhuǎn)換成單字節(jié)十六進(jìn)制整數(shù)LDA#%10011000;(98)BCDCLRHLDX#16DIV ;分離十位和個(gè)位PSHH ;個(gè)位進(jìn)棧LDX#10MUL;將十位轉(zhuǎn)換為十六進(jìn)制ADD1,SP;加個(gè)位BRA*BCD數(shù)98在計(jì)算機(jī)中存放形式為10011000即$98對(duì)98=9*10+8;對(duì)$98=9*16+8算法為:$98/16=9……8實(shí)際數(shù)值為9*10+8HA00$9816X89910×+8uuuu8FESP十進(jìn)制和16進(jìn)制權(quán)不同簡(jiǎn)單程序_將壓縮BCD碼拆開(kāi)轉(zhuǎn)換為ASCII碼

ORG$80Data_BCD

DS.b1Data_ASCII

DS.b2

LDHX#$0010LDAData_BCDDIVORA#$30STAData_ASCIIPSHHPULAORA#$30STAData_ASCII+1BRA*采用除$10方法(相當(dāng)于右移4位)將BCD數(shù)拆開(kāi)010010010000100100000100BCDHBCDL000000000000BCDH0000BCDL00010000HAAHX*用半字節(jié)屏蔽方法編程,比較程序字節(jié)數(shù)、執(zhí)行周期數(shù)簡(jiǎn)單程序_雙字節(jié)求補(bǔ)

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ǎn)單分支程序

ORG$0080Data1:FCB$12Data2:FCB$34codesectionMyCode:SECTIONmain:Entry:LDAData1CMPData2BHICMP_EndMOVData2,Data1STAData2CMP_End:BRA*比較兩個(gè)無(wú)符號(hào)數(shù),按先大后小排列Flag:DS.b1Flag_MarkEQU7main:MOV#$00,DDRAMOV#$FF,PTAPUEMOV#$00,FlagBRCLR7,PTA,ExBSETFlag_Mark,FlagBRAP_EndEx:BCLRFlag_mark,Flag

P_End:BRA*根據(jù)PTA口狀態(tài)設(shè)置標(biāo)志位分支程序_多重分支

ORG$0080XX:FCB$03Y:DS.B1main:LDAXXCMP#$5BHSBE5DECXX

BRAP_EndBE5:CMP#10BHIB10CLRXX

BRAP_EndB10:INCXXP_End:MOVXX,YBRA*取xx=x-1x≥5?x>10?x=x+1x=0x->y結(jié)束yynn分支程序_簡(jiǎn)單散轉(zhuǎn)程序20042007200AP_0…P_1…P_2…800CJ_TabH:X00:04TEMP:DS.B1

main:LDX#$2BSRTJMPBRA*TJMP:CLRHLSLXJMPJ_Tab,XTJ_EndRTSJ_Tab:BRAP_0BRAP_1BRAP_2P_0:MOV#$00,TEMPBRATJ_EndP_1:MOV#$01,TEMPBRATJ_EndP_2:MOV#$02,TEMPBRATJ_EndH:X00:02BRAP_0BRAP_1BRAP_2800E80108008PC8008801080128017801C801C8012+0A循環(huán)程序_累加若干數(shù)(<255)累加,和<65535Asumdata……+1≥256ORG$0080data:FCB$00,$11,$22,$33N:DS.B1sum:DS.W1main:MOV#3,N;循環(huán)計(jì)數(shù)器LDAdata;累加器初值LDHX#data+1;數(shù)據(jù)指針設(shè)置CLCLOOP:ADD,X;作加法BCCsum_L_ad;和<256,轉(zhuǎn)INCsum;和≥256,高位加1sum_L_ad:AIX#1;指向下一數(shù)據(jù)DBNZN,LOOP;未完,重復(fù)加STAsum+1;存和數(shù)低位(和的高位已在sum內(nèi))BRA*循環(huán)控制結(jié)束部分重復(fù)處理部分初始化循環(huán)體部分簡(jiǎn)單查表程序TEMP:DS.B1LDA#$7BSRLOOKBRA*LOOK:CLRHTAXLDATab,X;LDA32782,XSTATEMPRTSTabFCB$00,$01,$04,$09FCB$10,$19,$24,$31FCB$40,$5100010409162536496481800ETab07AH:X00:07查找表首地址800E+7數(shù)據(jù)塊傳送

ORG$0080Data_S:FCB$00,$11,$22,$33Data_Len:DS.B1Data_T: DS.B10main:Entry:LDHX#$0000MOV#$04,Data_LenBSRM_To_MBRA*M_To_M:LDAData_S,X;X->ASTAData_T,X;源->目的AIX#$1;可否用INCX?DBNZData_Len,M_To_M

;是否移動(dòng)完畢

RTS00112233…Data_SData_TH:X簡(jiǎn)單查表程序_結(jié)束標(biāo)志

LDA#$3BSRLOOK

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論