第3章-指令系統(tǒng)及程序設(shè)計ppt課件(全)_第1頁
第3章-指令系統(tǒng)及程序設(shè)計ppt課件(全)_第2頁
第3章-指令系統(tǒng)及程序設(shè)計ppt課件(全)_第3頁
第3章-指令系統(tǒng)及程序設(shè)計ppt課件(全)_第4頁
第3章-指令系統(tǒng)及程序設(shè)計ppt課件(全)_第5頁
已閱讀5頁,還剩77頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第3章指令系統(tǒng)及程序設(shè)計吳政江制作

貴州電子信息職業(yè)技術(shù)學(xué)院貴州省人才培養(yǎng)優(yōu)秀單位3.1指令格式和尋址方式3.2AT89C51指令系統(tǒng)3.3匯編語言程序設(shè)計3.4匯編語言程序設(shè)計舉例實訓(xùn)三:單片機控制信號燈亮滅

小結(jié)習(xí)題與思考題3.1.1指令系統(tǒng)簡介AT89C51單片機的指令系統(tǒng)與MCS-51系列單片機完全兼容,它具有很多的快速尋址方式,不僅可以進(jìn)行字節(jié)操作,還可以進(jìn)行位操作,特別適合控制應(yīng)用。AT89C51單片機共有111條指令。其中,單字節(jié)指令49條,雙字節(jié)指令45條,三字節(jié)指令17條。在111條指令中,有64條是單機器周期指令,45條雙機器周期指令,兩條四機器周期指令。這里應(yīng)注意,計算機執(zhí)行指令時間的長短并不取決于指令所占存儲器的字節(jié)數(shù),而是取決于所占用的機器周期數(shù)。3.1.2匯編語言指令格式[標(biāo)號:]<助記符>[操作數(shù)][;注釋](1)標(biāo)號。(2)助記符。(3)操作數(shù)。(4)注釋。3.1指令格式和尋址方式3.1.3符號注釋(1)Rn(n=0~7)。表示八個通用寄存器R0~R7。(2)Ri(i=0,1)。表示兩個寄存器R0、R1,常用作8位地址指針。(3)#DATA。表示8位立即數(shù),即包含在指令中的8位常數(shù),如#31H或#00110001B。(4)#DATA16。表示16位立即數(shù),即包含在指令中的16位常數(shù),如#2010H。(5)direct。表示片內(nèi)RAM(含特殊功能寄存器)的直接地址。(6)addr11。表示11位目的地址。(7)addr16。表示16位目的地址。(8)rel。表示帶符號的8位地址偏移量。(9)bit。表示位地址。(10)@。作為寄存器的前綴,表示間接尋址。(11)(X)。表示X中內(nèi)容。(12)((X))。表示X所指地址單元的內(nèi)容。(13)→。表示將箭頭左邊內(nèi)容送入箭頭右邊。3.1.4尋址方式所謂尋址方式,就是如何找到存放操作數(shù)的地址,把操作數(shù)提取出來的方法。牢固掌握尋址方式,對學(xué)習(xí)單片機原理及程序設(shè)計有著重要的意義。AT89C51共有七種尋址方式,即立即尋址、直接尋址、寄存器尋址、寄存器間接尋址、變址尋址、相對尋址和位尋址。(1)立即數(shù)尋址立即數(shù)尋址是指操作數(shù)作為指令的一部分存放在程序存儲器中,在取指令運行的同時,直接獲得該操作數(shù)。這類操作數(shù)可以是一字節(jié)或兩字節(jié)操作數(shù),應(yīng)用時應(yīng)在操作數(shù)前面加“#”號,以區(qū)別直接地址?!纠?.1】

MOVA,#30H;單字節(jié)立即數(shù)30H送入累計加器A中(立即數(shù)尋址)【例3.2】

MOVA,30H;30H單元中的數(shù)據(jù)送入累加器A中(直接尋址)【例3.3】

MOVDPTR,#2000H;雙字節(jié)立即數(shù)2000H送入DPTR(立即數(shù)尋址)(2)直接尋址直接尋址是指在指令中直接給出操作數(shù)所在存儲單元的地址。執(zhí)行指令時,從該地址中直接獲取操作數(shù)。在AT89C51中,可直接尋址的單元為內(nèi)部RAM低128個字節(jié)和所有的特殊功能寄存器。對于SFR,既可用名字,也可用地址。但一般程序設(shè)計中都建議使用名字,以便于程序的閱讀和理解?!纠?.4】

MOVA,40H;(40H)→A,將40H單元中的數(shù)據(jù)3AH送入累加器A中該指令的執(zhí)行示意圖如圖3-1所示。【例3.5】

MOVA,P0;(P0)→A因為P0為特殊功能寄存器,它的地址是80H,所以它又等價于:MOVA,80H。圖3-1直接尋址示意圖3AH3AHA內(nèi)部RAM40H(3)寄存器尋址寄存器尋址是指把寄存器的內(nèi)容作為操作數(shù)。寄存器可以是通用寄存器R0~R7,也可以是ACC、B、DPTR等特殊功能寄存器?!纠?.6】

MOVA,R1;將R1寄存器中的內(nèi)容送入累加器A中(4)寄存器間接尋址在寄存器間接尋址中,指令中的一個操作數(shù)是加了前綴“@”的寄存器,“@”表示該寄存器中的內(nèi)容是操作數(shù)的地址。執(zhí)行指令時,計算機根據(jù)這個地址取出操作數(shù)完成相應(yīng)的操作,這種尋址方式稱作寄存器間接尋址。【例3.7】將片內(nèi)RAM20H單元的內(nèi)容58H用間接尋址方式送入累加器A中。MOVR0,#20HMOVA,@R0【例3.8】將片外RAM2000H單元的內(nèi)容送入累加器A中。MOVDPTR,#2000HMOVXA,@DPTR圖3-2間接尋址示意圖58H58HA內(nèi)部RAM20H20HR0

(5)變址尋址(基址寄存器+變址寄存器)變址尋址是指以寄存器DPTR或PC的內(nèi)容作為基地址,然后在這個基地址的基礎(chǔ)上再加上地址偏移量(累加器A的值)形成操作數(shù)的地址,并從這個地址中取出操作數(shù)。在AT89C51中,可用于變址尋址的指令只有兩條,一條是“MOVCA,@A+DPTR”,另一條是“MOVCA,@A+PC”。用于讀取程序存儲器的數(shù)據(jù),常用于查表操作。設(shè)累加器A的內(nèi)容為20H,DPTR的值為2000H,程序存儲器2020H單元內(nèi)容為47H,則執(zhí)行該指令后累加器A的值為47H。其執(zhí)行示意圖如圖3-3所示。2000H20HA指令執(zhí)行前2020H47H47HAROM指令執(zhí)行后DPTR圖3-3變址尋址示意圖

(6)相對尋址

相對尋址是將程序計數(shù)器PC中的當(dāng)前值與指令第二字節(jié)給出的偏移量rel相加,其結(jié)果作為跳轉(zhuǎn)指令的轉(zhuǎn)移地址。相對尋址主要用于轉(zhuǎn)移類指令,尋址范圍是程序存儲器。所有的相對轉(zhuǎn)移指令均為相對尋址。

(7)位尋址位尋址是指指令的操作數(shù)為8位二進(jìn)制數(shù)的某一位,指令中給出的是操作數(shù)的位地址??捎糜谖粚ぶ返膮^(qū)域是片內(nèi)RAM20H~2FH單元和部分特殊功能寄存器(見表2-4)可尋址的位。凡位操作指令所涉及的尋址均為位尋址。訪問片內(nèi)20H~2FH單元128個位地址時,可直接使用該位的物理地址,如把片內(nèi)20H單元的最高位清零,可以使用CLR20H.7。訪問特殊功能寄存器的位地址時,除用位地址表示方法外,還可以用寄存器名字加位數(shù)表示,或直接用位名稱。如SETBD3H等價于SETBPSW.3或SETBRS0。3.2.1數(shù)據(jù)傳送類指令(如表3-1所示)(1)片內(nèi)RAM傳送指令(MOV)

功能:將源操作數(shù)的內(nèi)容傳送到目的操作數(shù),而源操作數(shù)內(nèi)容不改變?!纠?.9】設(shè)(R1)=30H,(20H)=30H,(30H)=40H,分別執(zhí)行以下指令,寫出累加器A的運行結(jié)果。MOVA,#10H;10H→A,(A)=10HMOVA,R1;(R1)→A,(A)=30HMOVA,20H;(20H)→A,(A)=30HMOVA,@R1;(20H)→A,(A)=40H3.2AT89C51指令系統(tǒng)

(2)外部RAM傳送指令(MOVX)功能:也是將源操作數(shù)的內(nèi)容傳送到目的操作數(shù),而源操作數(shù)的內(nèi)容不改變。只是在訪問外部RAM時,目的操作數(shù)和源操作數(shù)總有一個在累加器A中,另一個在片外存儲器中?!纠?.10】將片外RAM2000H單元內(nèi)容送入片內(nèi)RAM20H單元中。MOVDPTR,#2000HMOVXA,@DPTR;片外2000H單元內(nèi)容→累加器AMOV20H,A ;(A)→片內(nèi)20H單元【例3.11】

將片外RAM1000H單元內(nèi)容送入片外RAM3000H單元。MOVDPTR,#1000H ;地址指針指向1000HMOVXA,@DPTR ;將1000H單元內(nèi)容送入AMOVDPTR,#3000H ;地址指針指向3000HMOVX@DPTR,A;將累加器A的內(nèi)容送入3000H單元【例3.12】

用間接尋址將片內(nèi)RAM10H單元內(nèi)容送入片外RAM20H單元。MOVR0,#10HMOVA,@R0 ;取片內(nèi)單元數(shù)據(jù)MOVR0,#20HMOVX@R0,A ;送入片外地址單元(3)查表指令(MOVC)查表指令(MOVC)是指程序存儲器內(nèi)的查表指令,用來獲取程序存儲器數(shù)據(jù)表格中的數(shù)據(jù),并將獲取的數(shù)據(jù)送入累加器A中。有兩條指令:“MOVCA,@A+DPTR”和“MOVCA,@A+PC”。【例3.13】下面的程序從程序存儲器1000H單元開始存放,寫出執(zhí)行下列程序后,累加器A、寄存器R0和程序指針PC的值。1000H:MOVA,#01H;01→A,數(shù)據(jù)項數(shù)送入累加器1002H:ADDA,#0BH;項數(shù)+偏移量0BH→A,A為0CH1004H:MOVCA,@A+PC;PC為1005H,與0CH相加后,CPU到1011H單元取數(shù)04H送入A中1005H:MOVR0,A;(A)→R0,PC為1006H┇1010H:02H1011H:04H1012H:06H1014H:08H執(zhí)行結(jié)果為(A)=04H,(R0)=04H,(PC)=1006H。(4)堆棧指令(PUSH與POP)堆棧是在內(nèi)部RAM中開辟的一端相對固定,另一端活動的存儲空間,活動端稱為棧頂,固定端稱為棧底,所有數(shù)據(jù)的存入和取出都從棧頂進(jìn)行。其操作應(yīng)遵循“先進(jìn)后出或后進(jìn)先出”的原則,主要用于數(shù)據(jù)保護(hù)。PUSH指令用于把直接尋址的一個字節(jié)數(shù)壓入棧頂。執(zhí)行時,先將棧頂指針SP的值加1,然后把直接尋址單元里的數(shù)存入到SP指向的單元中。POP指令用于把棧頂?shù)膬?nèi)容送入直接尋址的一個單元中。執(zhí)行時,先將堆棧指針SP指向單元內(nèi)容彈出,并送入直接地址中,然后將SP的值減1,從而使SP的值仍指向棧頂?!纠?.14】

執(zhí)行下列指令,注意累加器A的變化。MOVSP,#63H ;設(shè)置堆棧初值MOVA,#17H ;17H送入APUSHACC ;將17H壓入堆棧保存RLA ;將累加器A的內(nèi)容左循環(huán)一次MOVR1,A ;(A)→R1POPACC ;將17H彈出并送入累加器中(5)交換指令(XCH與XCHD)①XCH指令是將源操作數(shù)的值與目的操作數(shù)累加器A的值全字節(jié)交換;②XCHD指令是將源操作數(shù)的值與目的操作數(shù)累加器A低4位內(nèi)容交換,而高4位不變;③SWAP指令是將累加器A的內(nèi)容高4位和低4位互換。【例3.15】設(shè)(A)=47H,(R0)=58H,(58H)=36H,分別執(zhí)行下列指令,寫出A和各寄存器的值。 執(zhí)行結(jié)果①XCHA,R0 ;(A)=58H,(R0)=47H②XCHA,@R0 ;(A)=36H,(58H)=47H,(R0)=47H③XCHDA,@R0 ;(A)=46H,(58H)=37H,(R0)=47H④SWAPA ;(A)=74H3.2.2算術(shù)運算類指令(見表3-2所示)(1)不帶進(jìn)位加法指令(ADD)ADD是不帶進(jìn)位的加法運算指令,其功能是將累加器A的內(nèi)容與源操作數(shù)的內(nèi)容相加,結(jié)果送入累加器A中,源操作數(shù)指定單元的內(nèi)容不變。該指令執(zhí)行結(jié)果影響標(biāo)志位CY、OV、AC、P?!纠?.16】設(shè)(A)=8DH,(R1)=95H,則執(zhí)行指令“ADDA,R1”后,其和為:10001101

+10010101100100010即(A)=22H,(CY)=1,(OV)=1,(AC)=1,其中(CY)=1表示最高位有進(jìn)位;(AC)=1表示低3位向高4位有進(jìn)位;(OV)=1表示若為有符號數(shù)加法,則結(jié)果溢出。(2)帶進(jìn)位的加法指令(ADDC)ADDC指令功能是同時把源操作數(shù)所指出的內(nèi)容、進(jìn)位標(biāo)志CY和累加器A的內(nèi)容相加,結(jié)果存入累加器A中。ADDC指令一般用于多字節(jié)加法運算中。在多字節(jié)加法運算中,低字節(jié)加法結(jié)果可能產(chǎn)生進(jìn)位,用ADDC指令可使高字節(jié)相加的同時加上低字節(jié)的進(jìn)位。該指令執(zhí)行結(jié)果影響標(biāo)志位CY、OV、AC、P。影響方法同不帶進(jìn)位的加法指令?!纠?.17】設(shè)(A)=79H,(R0)=54H,(CY)=1,則執(zhí)行指令“ADDCA,R0”后,其和為:0111100101010100

+0000000111001110即(A)=CEH,(CY)=0(無進(jìn)位),(OV)=1,(AC)=0,(P)=1。(3)加1指令(INC)該指令用于將操作數(shù)的內(nèi)容加1。該指令除影響奇偶標(biāo)志位P外,不會對其他任何標(biāo)志位產(chǎn)生影響?!纠?.18】設(shè)(A)=07H,(R0)=20H,(R3)=45H,(20H)=09H,(DPTR)=00FFH,寫出執(zhí)行下列指令后各存儲單元的內(nèi)容。INCAINCR3INC@R0INCDPTR結(jié)果(A)=08H,(R3)=46H,(R0)=20H,(20H)=0AH,(DPTR)=0100H。(4)帶借位減法指令(SUBB)帶借位減法指令(SUBB)功能是將累加器A中內(nèi)容減去源操作數(shù)的內(nèi)容及進(jìn)位CY的值,結(jié)果送入累加器A中。該指令影響標(biāo)志位CY、OV、AC、P。兩個數(shù)相減時,可通過對CY的檢測判斷運算結(jié)果是否有借位,如最高位有借位時,CY為1,否則為0。如低3位向高4位有借位時AC為1,否則AC為0。若運算結(jié)果A中“1”的個數(shù)為奇數(shù)時,P為1,否則P為0。【例3.19】設(shè)(A)=0D9H,(R2)=37H,(CY)=1,則執(zhí)行指令“SUBBA,R2”后,其差為:1101100100110111

-0000000110100001即(A)=0A1H,(CY)=0,(AC)=0,(OV)=0,(P)=1,表示最高位無借位,若為有符號數(shù),則結(jié)果未溢出。(5)減1指令(DEC)功能:用于將操作數(shù)的內(nèi)容減1。與INC指令相同,僅影響奇偶標(biāo)志位P。【例3.20】設(shè)(A)=07H,(R0)=20H,(R3)=47H,(20H)=09H,(DPTR)=1000H,寫出執(zhí)行下列指令后各存儲單元的內(nèi)容。DECADECR3DEC@R0DECDPTR結(jié)果(A)=06H,(R3)=46H,(R0)=20H,(20H)=08H,(DPTR)=0FFFH。(6)乘法指令(MUL)功能:將累加器A的內(nèi)容和寄存器B的內(nèi)容相乘,結(jié)果是16位二進(jìn)制數(shù)。其中高8位保存在寄存器B中,低8位保存在累加器A中。若乘積大于0FFH,溢出標(biāo)志OV=1,否則為0。例如,設(shè)(A)=C5H,(B)=08H,則執(zhí)行指令“MULAB”后,結(jié)果為(B)=03H,(A)=28H,表示積(BA)=0328H,OV=1。(7)除法指令(DIV)功能:用累加器A的內(nèi)容(被除數(shù))除以寄存器B的內(nèi)容(除數(shù))。指令執(zhí)行后,商保存在累加器A中,余數(shù)保存在寄存器B中。相除之后,標(biāo)志位CY一定為0,OV只是在除數(shù)B=0時為1,其他情況下都為0。例如,設(shè)(A)=96H,(B)=10H,則執(zhí)行指令“DIVAB”后,結(jié)果為(B)=06H,(A)=09H,標(biāo)志位CY=0,OV=0。(8)十進(jìn)制調(diào)整指令(DA)“DAA”是一條對累加器A中的BCD碼進(jìn)行調(diào)整的指令。應(yīng)用時必須跟在ADD或ADDC指令后面。因為當(dāng)兩個壓縮的BCD碼按二進(jìn)制作加法運算時,其結(jié)果不一定是壓縮的BCD碼,所以必須用DA指令進(jìn)行調(diào)整。【例3.21】設(shè)(A)=07H,(R2)=56H,其中78H和56H都為壓縮BCD碼。執(zhí)行指令:ADDA,R2DAA結(jié)果如下:01111000

+0101011011001110和調(diào)整:+01100110100110100從上例可以看出,執(zhí)行第一條指令后累加器A的值為0CEH,高低4位都大于9,已不是BCD碼,因此需要給高低4位分別加6進(jìn)行調(diào)整,即給累加器A加66H得到正確的BCD碼。3.2.3邏輯操作與移位指令(如表3-3所示)(1)邏輯與指令(ANL)“與”指令是將源操作數(shù)與目的操作數(shù)按位相與,其結(jié)果送入目的操作數(shù)中?!芭c”指令可以屏蔽操作數(shù)的某些位,即使操作數(shù)某些位清零,其他位保持不變。例如,設(shè)(A)=10010111B,則執(zhí)行“ANLA,#00110110B”指令后,A的值為00010110B??梢钥闯?,對于累加器A,與零相與的位被清零,與1相與的位保持不變。(2)邏輯或指令(ORL)“或”指令是將源操作數(shù)與目的操作數(shù)按位相或,其結(jié)果送入目的操作數(shù)中?!盎颉敝噶羁梢允共僮鲾?shù)的數(shù)據(jù)位置1,即使操作數(shù)某些位置1,其他位保持不變。例如,設(shè)(A)=10010111B,則執(zhí)行“ORLA,#00110110B”指令后,A的值為10110111B。可以看出,對于累加器A,與1相或的位被置1,與0相或的位保持不變。(3)邏輯異或指令(XRL)“異或”指令是將源操作數(shù)與目的操作數(shù)按位相異或,即不同為1,相同為0,其結(jié)果送入目的操作數(shù)中。“異或”指令可以使操作數(shù)的數(shù)據(jù)位取反,即使操作數(shù)某些位取反,其他位保持不變。例如,設(shè)(A)=10010111B,則執(zhí)行“ORLA,#00110110B”指令后,A的值為10100001B??梢钥闯觯瑢τ诶奂悠鰽,與1相異或的位被取反,與0相異或的位保持不變。(4)累加器清零與取反指令(CLR與CPL)累加器清零指令CLRA的功能是將累加器A的內(nèi)容清零。累加器取反指令CPLA的功能是將累加器A的內(nèi)容按位取反,即累加器A中各位1變0,0變1。例如,設(shè)(A)=10010111B,則執(zhí)行指令“CPLA”后,(A)=01101000B。(5)移位指令①循環(huán)左移指令。循環(huán)左移指令RLA的功能是將累加器A的內(nèi)容循環(huán)左移一位。如圖3-4所示,累加器A的最高位移入最低位,同時其他各位依次左移一位。其結(jié)果相當(dāng)于將累加器A的內(nèi)容乘2。圖3-4左循環(huán)移位指令示意圖A7A0圖3-5帶進(jìn)位左循環(huán)移位指令示意圖A7A0CY圖3-6右循環(huán)移位指令示意圖圖3-7帶進(jìn)位右循環(huán)移位指令示意圖②帶進(jìn)位循環(huán)左移指令。帶進(jìn)位循環(huán)左移指令RLCA的功能是將累加器A的內(nèi)容和進(jìn)位標(biāo)志一起循環(huán)左移一位。如圖3-5所示,累加器A的最高位移入進(jìn)位位CY,CY位移入累加器A的最低位,同時其他各位依次左移一位。其結(jié)果相當(dāng)于將進(jìn)位位CY連同累加器A的內(nèi)容乘2。③循環(huán)右移指令。循環(huán)右移指令RRA的功能是將累加器A的內(nèi)容循環(huán)右移一位。如圖3-6所示,累加器A的最低位移入最高位,同時其他各位依次右移一位。其結(jié)果相當(dāng)于將累加器A的內(nèi)容除2。③帶進(jìn)位循環(huán)右移指令。帶進(jìn)位循環(huán)右移指令RRCA的功能是將累加器A的內(nèi)容和進(jìn)位標(biāo)志一起右循環(huán)移一位。如圖3-7所示,累加器A的最低位移入進(jìn)位位CY,CY位移入累加器A的最高位,同時其他各位依次右移一位。其結(jié)果相當(dāng)于將進(jìn)位位CY連同累加器A的內(nèi)容除2?!纠?.22】設(shè)(A)=01001101B,(CY)=1,執(zhí)行下列指令:RLA;(A)=10011010RRA;(A)=10100110RLCA;(A)=10011011,(CY)=0RRCA;(A)=10100110,(CY)=1通過對操作數(shù)左右移位N次,還可使操作數(shù)擴大或縮小2n倍。如將(A)=00001000B分別循環(huán)左移(RLA)和循環(huán)右移(RRA)兩次,則累加器A的值分別是20H和02H,即分別擴大和縮小了4倍。3.2.4控制轉(zhuǎn)移類指令(如表3-4所示)(1)無條件轉(zhuǎn)移指令無條件轉(zhuǎn)移指令是指當(dāng)程序執(zhí)行到這條指令時,程序?qū)o條件地轉(zhuǎn)移到指令所指向的地址單元取指令運行。①短轉(zhuǎn)移指令A(yù)JMP。②長轉(zhuǎn)移指令LJMP。③相對轉(zhuǎn)移指令SJMP。④間接轉(zhuǎn)移指令JMP@A+DPTR。【例3.23】設(shè)命令程序存放在起始地址為JPTB的轉(zhuǎn)移指令表中,試編一程序,使計算機按照命令編號NUM的值轉(zhuǎn)去執(zhí)行相應(yīng)的命令程序。MOVDPTR,#JPTB;指向跳轉(zhuǎn)表首地址MOVA,NUM;跳轉(zhuǎn)表項數(shù)RLA;項數(shù)乘2JMP@A+DPTR;散會轉(zhuǎn)至轉(zhuǎn)移表JPTB:AJMPCASE0;命令程序AJMPCASE1AJMPCASE2AJMPCASE3┇(2)有條件轉(zhuǎn)移指令有條件轉(zhuǎn)移指令是指根據(jù)指令中給出的條件進(jìn)行判斷,若條件成立,則程序轉(zhuǎn)向指定的目的地址執(zhí)行,否則順序執(zhí)行程序。有條件轉(zhuǎn)移指令均為相對尋址指令,且其目標(biāo)地址都在相對于該指令的下一條指令為-128~+127的區(qū)域內(nèi)。①累加器判零指令(JZ與JNZ)JZ指令的功能是判斷累加器A的值。若累加器A的值為0,則程序轉(zhuǎn)移到目標(biāo)地址;否則,順序執(zhí)行程序。JNZ指令的功能是判斷累加器A的值。若累加器A的值不為0,則程序轉(zhuǎn)移到目標(biāo)地址;否則,順序執(zhí)行程序。②比較轉(zhuǎn)移指令(CJNE)這組比較轉(zhuǎn)移指令的功能是將目的操作數(shù)的內(nèi)容和源操作數(shù)的內(nèi)容進(jìn)行比較。若不相等,則程序轉(zhuǎn)移到目標(biāo)地址;否則,順序執(zhí)行程序。③減1條件轉(zhuǎn)移指令(DJNZ)這組指令的功能是先將操作數(shù)的內(nèi)容減1,然后判斷結(jié)果。如果不為0,則轉(zhuǎn)移到目標(biāo)地址;否則,順序執(zhí)行程序。一般用于循環(huán)程序的設(shè)計。(3)空操作指令NOP

該指令除使PC內(nèi)容加1外,不執(zhí)行任何操作,常用來產(chǎn)生一個T機的延遲。(4)調(diào)用與返回指令①短調(diào)用指令A(yù)CALLACALL指令的目標(biāo)地址是11位。CPU執(zhí)行該指令時,先將該指令的下一條指令的16位地址(斷點值)壓入堆棧,然后將PC加2后的指令高5位地址作為子程序始址的高5位以及把該指令中的11位地址作為子程序始址的低11位,再轉(zhuǎn)入該子程序執(zhí)行。轉(zhuǎn)移范圍為2KB②長調(diào)用指令LCALLLCALL指令的目標(biāo)地址是16位。可在64KB程序存儲器區(qū)域范圍內(nèi)調(diào)用任何一個子程序。CPU執(zhí)行該指令時,先將該指令的下一條指令的16位地址壓入堆棧保存,然后將子程序的入口地址送入PC,從而開始執(zhí)行子程序。③子程序返回指令RET該指令使CPU從子程序返回到調(diào)用指令的下一條指令。其主要操作是把堆棧中的中斷地址恢復(fù)到PC中,從而使程序返回到斷點處繼續(xù)執(zhí)行。④中斷返回指令RETI該指令與RET相似,主要用于中斷服務(wù)程序的末尾。3.2.5位操作類指令(如表3-5所示)(1)位數(shù)據(jù)傳送指令(MOV)功能:將源操作數(shù)位地址單元的值傳送給目標(biāo)操作數(shù)指向的位地址單元中,源操作數(shù)內(nèi)容不變?!纠?.24】

MOVC,07H;將內(nèi)部RAM20H單元的最高位的值送入CY中 MOVP1.0,C;將CY的值送入P1口的第0位(2)位修正指令①CLRC指令功能是使進(jìn)位標(biāo)志位內(nèi)容CY清零;②CLRbit指令功能是使位地址單元內(nèi)容清零;③CPLC指令功能是使進(jìn)位標(biāo)志位內(nèi)容取反;④CPLbit指令功能是使位地址單元內(nèi)容取反;⑤SETBC指令功能是使進(jìn)位標(biāo)志位內(nèi)容置1;⑥SETBbit指令功能是使位地址單元內(nèi)容置1。(3)位邏輯運算指令①ANLC,bit指令功能是把源操作數(shù)位的內(nèi)容與目標(biāo)操作數(shù)CY的內(nèi)容進(jìn)行與運算,結(jié)果送入CY中。②ANLC,/bit指令功能是對源操作數(shù)位取反后,再與目標(biāo)操作數(shù)進(jìn)行與運算,結(jié)果存入CY中,但不改變源操作數(shù)本身的值。③ORLC,bit指令功能是把源操作數(shù)位的內(nèi)容與目標(biāo)操作數(shù)CY的內(nèi)容進(jìn)行或運算,結(jié)果送入CY中。④ORLC,/bit指令是對源操作數(shù)位取反后,再與目標(biāo)操作數(shù)進(jìn)行或運算,結(jié)果存入CY中,但不改變源操作數(shù)本身的值。(4)位條件轉(zhuǎn)移類指令位判斷轉(zhuǎn)移指令都是條件轉(zhuǎn)移指令,轉(zhuǎn)移的目標(biāo)地址都是用相對偏移量表示的,轉(zhuǎn)移范圍相對于該指令的下一條指令-128~+127范圍內(nèi)。使用這些指令編程時,只用一個標(biāo)號或16位數(shù)來表示轉(zhuǎn)移目標(biāo)地址。①JC指令功能:若進(jìn)位標(biāo)志CY為1,則轉(zhuǎn)移到目標(biāo)地址執(zhí)行程序,否則順序執(zhí)行程序;②JNC指令功能:若進(jìn)位標(biāo)志CY為0,則轉(zhuǎn)移到目標(biāo)地址執(zhí)行程序,否則順序執(zhí)行程序;③JB指令功能:若位地址單元內(nèi)容為1,則轉(zhuǎn)移到目標(biāo)地址執(zhí)行程序,否則順序執(zhí)行程序;④JNB指令功能:若位地址單元內(nèi)容為0,則轉(zhuǎn)移到目標(biāo)地址執(zhí)行程序,否則順序執(zhí)行程序;⑤JBC指令功能:若進(jìn)位標(biāo)志CY為1,則轉(zhuǎn)移到目標(biāo)地址執(zhí)行程序,且將CY清零,否則順序執(zhí)行程序。3.3.1匯編語言的構(gòu)成(1)機器語言、匯編語言和高級語言①機器語言。機器語言是一種能被機器直接識別和執(zhí)行的語言,用二進(jìn)制數(shù)“0”和“1”形式或十六進(jìn)形式制表示。它存在于計算機存儲器內(nèi),直接指揮機器的運行。②匯編語言。匯編語言是在機器指令的基礎(chǔ)上,用助記符表示指令的操作碼,用人們習(xí)慣的數(shù)字或符號表示指令的操作數(shù)或操作數(shù)的地址。③高級語言。高級語言是一種面向過程或面向問題的語言,一般總是獨立于具體的機器。在進(jìn)行程序設(shè)計時,程序員可以不了解機器的具體結(jié)構(gòu)和內(nèi)部操作過程,而把主要精力放在掌握該語言的語法規(guī)則和程序的結(jié)構(gòu)設(shè)計等方面。不同類型的計算機,若配置了同一種高級語言,那么用這種語言編制的程序就可以在不同的機器上運行。也就是說高級語言的移植性較好。(2)匯編語言程序的組成:程序由指令構(gòu)成。①指令即3.2節(jié)指令系統(tǒng)所介紹的111條指令。每條指令都有與之對應(yīng)的機器代碼,通過匯編將指令翻譯成機器代碼由CPU執(zhí)行,完成相應(yīng)的操作。指令是匯編語言語句的主體,也是人們進(jìn)行匯編語言程序設(shè)計的基本語句。3.3匯編語言程序設(shè)計②偽指令a.起始地址偽指令ORG格式:ORG16位地址功能:規(guī)定跟在它后面的源程序經(jīng)過匯編后所產(chǎn)生的目標(biāo)程序存儲的起始地址。例如:ORG0200HSTART:MOVA,#65H┇ENDORG偽指令規(guī)定了START為0200H,程序匯編后的機器碼從0200H開始依次存放。b.匯編結(jié)束偽指令END格式:END功能:匯編語言源程序的結(jié)束標(biāo)志,匯編程序遇到END時即認(rèn)為源程序到此為止,匯編過程結(jié)束,在END后面所寫的程序,匯編程序都不予理睬。因此,在一個源程序中只能有一個END命令,而且必須放在整個程序末尾。c.賦值偽指令EQU格式:字符名稱EQU數(shù)據(jù)或匯編符號功能:將EQU右邊的數(shù)據(jù)或匯編符號賦值給左邊的字符名稱。字符名稱被賦值后,就可以在程序中代表數(shù)據(jù)或匯編符號使用。例如:ORG0200HRESEQUR1COUNTEQU40HMOVA,RES;A(R1)MOVR2,COUNT;R2(40H)┇END

d.?dāng)?shù)據(jù)地址賦值偽指令DATA格式:字符名稱DATA表達(dá)式功能:與EQU相似,即將DATA右邊表達(dá)式的值賦給左邊的字符名稱。例如:ORG0200HADDEDATA35HMOVA,ADDE;A(35H)┇ENDe.定義字節(jié)偽指令DB格式:標(biāo)號:DBn1,n2,…,nN功能:將DB右邊的單字節(jié)數(shù)據(jù)依次存放到以左邊標(biāo)號為起始地址的連續(xù)單元中。單字節(jié)數(shù)據(jù)可以采用二進(jìn)制,十進(jìn)制和ASCⅡ碼等多種形式表式。通常用于定義常數(shù)表。例如:

ORG0200HSTART:MOVA,#20HTAB:DB21H,33H,10100000B,“A”┇END此程序中,由DB偽指令將21H存放在TAB(0202H)單元中,33H存放在TAB+1單元中...。見圖3-8。

ROMTAB+3→0205HTAB+2→0204HTAB+1→0203HTAB→0202H0201H0200H“A”10100000B33H21H20H74H圖3-8DB指令示意圖ROMTAB+3→0503HTAB+2→0502HTAB+1→0501HTAB→0500H80H00H13H12H圖3-9DW指令示意圖f.定義字偽指令DW格式:[標(biāo)號:]DWnn1,nn2,…,nnN功能:與DB指令類似,都是在內(nèi)存的某個區(qū)域內(nèi)定義數(shù)據(jù)。不同的是DW指令定義的是字(16位),而DB指令定義的是字節(jié)(8位)。即DW指令功能是把指令右邊的雙字節(jié)數(shù)據(jù)依次存入指定的連續(xù)存儲單元中。其數(shù)據(jù)的高字節(jié)存放到低地址單元,低字節(jié)存放到高地址單元。例如:

ORG0200HSTART:MOVA,20H┇ORG0500HTAB:DW1213H,80HEND這一程序匯編結(jié)束后數(shù)據(jù)存放情況為:(0500H)=12H,(0501H)=13H,(0502H)=00H,(0503H)=80H,見圖3-9。g.定義存儲區(qū)偽指令DS格式:[標(biāo)號:]DS表達(dá)式功能:從指定地址開始預(yù)留一定數(shù)量的內(nèi)存單元,以備源程序執(zhí)行過程中使用。預(yù)留單元的數(shù)量由表達(dá)的值決定。例如:

ORG0200HDS05HDB30H,40H┇END

匯編后,從0200H單元開始留出5個字節(jié)的存儲單元,然后從0205H單元開始存放30H和40H。見圖3-10。ROM0206H40H0205H30H0204H0203H0202H0201H0200H圖3-10DS指令示意圖h.位地址賦值指令BIT格式:字符名稱BIT位地址功能:把BIT右邊的位地址賦給它左邊的字符名稱。被定義的位地址在源程序中可用字符名稱來表示。例如:ORG 0200HA1 BIT 01HA2 BIT 30H.2MOV C,A1 ;Cy←(01H)MOV A2,C ;30H.2←Cy┇ END3.3.2匯編語言程序設(shè)計和匯編(1)程序設(shè)計步驟①分析問題,確立算法②制訂程序流程圖a.起/止框:圓角矩形框,表示一個程序的開始或結(jié)束。b.任務(wù)框(也叫執(zhí)行框):矩形框,表示要處理的任務(wù)。c.判斷框:菱形框,表示要判斷的因素。d.流程線(也叫指向線):帶有箭頭的線段“↓或→”,表示程序的走向。e.連接點:帶數(shù)字的小圓圈“О”,用于將畫在不同地方的流程線連接起來。f.注釋框:“…[”,不是流程圖中必要的部分,不反映流程和操作,只是對流程圖中某些框的操作做必要的補充說明,以幫助人們更好地理解流程圖的作用。例如:要求累加器A與寄存器B的內(nèi)容之差的絕對值|A-B|。其流程圖見圖3-11所示。開始A≥B?A←A-B存結(jié)果A、B互換結(jié)束圖3-11|A-B|流程圖YN③分配存儲單元④編寫匯編語言源程序⑤靜態(tài)檢查⑥調(diào)試、優(yōu)化程序(2)源程序的匯編

①人工匯編②機器匯編開始3.3.3順序程序設(shè)計程序按其執(zhí)行順序或行進(jìn)路線可分為順序、分支、循環(huán)和子程序四種基本結(jié)構(gòu)。無論多么龐大復(fù)雜的程序均可看成是由這四種基本結(jié)構(gòu)組合而成的。本節(jié)先介紹順序程序設(shè)計。何為順序程序呢?先看一個簡單的例子?!纠?.24】編程序?qū)崿F(xiàn)累加器A與寄存器B的內(nèi)容互換。解:此題有多種解法。其中常用的是找一個中轉(zhuǎn)單元實現(xiàn)互換。設(shè)用工作寄存器R0作中轉(zhuǎn)單元,則互換的流程圖見圖3-12所示。程序如下: ORG0200H MOVR0,A MOVA,B MOVB,R0 END上述程序,從程序執(zhí)行看表現(xiàn)為從頭到尾嚴(yán)格地按照書寫次序一條語句一條語句地順序執(zhí)行,執(zhí)行順序與書寫順序完全一致,并且每條語句均被執(zhí)行且只執(zhí)行一次。從流程圖上看,有一個起始框、一個終止框、一至幾個執(zhí)行框,沒有判斷框。這就是順序程序。這種程序結(jié)構(gòu)非常簡單(因此也叫簡單程序),但也能解決某些實際問題,或者作為復(fù)雜程序的一個組成部分。開始A→R0B→AR0→B結(jié)束圖3-12例3.24流程圖【例3.25】【例3.26】【例3.27】3.3.4分支程序設(shè)計(1)簡單分支程序程序所分支路不多,通過條件轉(zhuǎn)移指令JZ、JNZ、JC、JNC、JB、JNB、CJNE、DJNZ等即可實現(xiàn)?!纠?.28】【例3.29】(2)多分支程序(也叫散轉(zhuǎn)程序)多分支程序轉(zhuǎn)移的支路較多,也叫散轉(zhuǎn)程序。無法使用轉(zhuǎn)移指令完成,而應(yīng)由散轉(zhuǎn)指令“JMP@A+DPTR”實現(xiàn)。【例3.30】3.3.5循環(huán)程序設(shè)計問題提出:將RAM中30H單元開始的100個單元清0。若用順序程序結(jié)構(gòu),則需100條傳送指令“MOVdirect,#00H”,程序太長會占用很多ROM空間,且是100條重復(fù)指令。怎么辦呢?若用循環(huán)程序結(jié)構(gòu)將會使程序大大縮短。這時需設(shè)計一個計數(shù)器和一個地址指針。現(xiàn)設(shè)R0為循環(huán)計數(shù)器,控制循環(huán)次數(shù),初值為100;R1為地址指針,指向RAM空間,初值為30H。則流程圖見圖3-19所示。程序如下:ORG2000HMOVR0,#100;循環(huán)計數(shù)器賦初值MOVR1,#30H;地址指針賦初值LOOP:MOV@R1,#00H;清0RAM單元INCR1;修改地址指針DJNZR0,LOOP;循環(huán)控制SJMP$;循環(huán)結(jié)束END開始R0←100R1←30H(R1)←00HR0-1=0?結(jié)束R1←R1+1YN圖3-19RAM單元清0流程圖(1)循環(huán)程序的組成①循環(huán)初始化。②循環(huán)體。③循環(huán)控制。④循環(huán)結(jié)束。(2)循環(huán)程序的分類①根據(jù)循環(huán)體執(zhí)行的先后分為兩種基本結(jié)構(gòu)。見圖3-20所示。a.先執(zhí)行,后判斷。b.先判斷,后執(zhí)行。②根據(jù)循環(huán)體的多少又分為兩種a.單重循環(huán)程序。b.多重循環(huán)程序。NY循環(huán)控制初始化循環(huán)處理循環(huán)結(jié)束完成?Y初始化循環(huán)處理循環(huán)控制循環(huán)結(jié)束完成?N(a)先處理后判斷(b)先判斷后處理圖3-20循環(huán)程序結(jié)構(gòu)示意圖(3)循環(huán)程序舉例①定時程序(也叫延時程序)【例3.31】單循環(huán)延時程序ORG2000HMOVR5,#TIME;1周期LOOP:NOP;1周期NOP;1周期

DJNZR5,LOOP;2周期END

延時時間=(4×TIME)×T機+1×T機【例3.32】雙循環(huán)延時程序。②數(shù)據(jù)極值查找程序極值查找是指在給定數(shù)據(jù)區(qū)中挑出最大值或最小值?!纠?.33】在內(nèi)部RAM中,從BLOCK單元開始有一個無符號數(shù)據(jù)塊,其長度存于LEN單元,試求出數(shù)據(jù)塊中最大的數(shù),并存入MAX單元。解:從一批無符號數(shù)據(jù)中尋找最大值的方法有很多種,最常用的方法是將數(shù)據(jù)塊中第一個數(shù)取到累加器A中,令其為初始最大值,然后把后面的每一個數(shù)與A的值相比較,哪一個數(shù)比A的值大,就用哪一個數(shù)去更新累加器A的值,所有的數(shù)比較完后,最大值就在累加器A中。設(shè)R1為地址指針,初值為數(shù)據(jù)塊首地址,R2為循環(huán)計數(shù)器,初值為數(shù)據(jù)塊的長度。則流程圖見圖3-21所示。程序如下:ORG2000HLENDATA20HMAXDATA21HBLOCKDATA22HMOVR1,#BLOCK;首地址送R1MOVR2,LEN;數(shù)據(jù)塊長度送R2MOVA,@R1;取第一個數(shù)到A中DECR2;數(shù)據(jù)長度減1INCR1;R1指向下一個數(shù)LOOP:CLRCSUBBA,@R1;用減法作比較JNCNEXT;A>(R1),轉(zhuǎn)NEXTMOVA,@R1;A<(R1),A←(R1)SJMPNEXT1NEXT:ADDA,@R1;A>(R1),恢復(fù)ANEXT1:INCR1;R1加1指向下一個數(shù)DJNZR2,LOOP;未取完數(shù)繼續(xù)循環(huán)MOVMAX,A;存最大值SJMP﹩END③數(shù)據(jù)排序程序數(shù)據(jù)排序是將數(shù)據(jù)塊中的數(shù)據(jù)按升序或降序排列。【例3.34】將片內(nèi)RAM20H~27H中的數(shù)據(jù)從小到大升序排列。解:數(shù)據(jù)升序排列常采用冒泡法。冒泡法是一種相鄰數(shù)互換的排列法方法,同上例查找極大值方法一樣,一次冒泡即找到數(shù)據(jù)塊的極大值放到數(shù)據(jù)塊最后,再一次冒泡次大數(shù)排在倒數(shù)第二位置,多次冒泡實現(xiàn)升序排列。設(shè)R7為比較次數(shù)計數(shù)器,初值為07H。F0為冒泡過程中是否有數(shù)據(jù)交換的狀態(tài)標(biāo)志,F(xiàn)0=0表示無交換發(fā)生,F(xiàn)0=1表示有互換發(fā)生,須繼續(xù)循環(huán)。R0為指向RAM單元的地址指針初值為20H。流程圖如圖3-22所示。程序如下:ORG2000HSORT:MOVR0,#20H;數(shù)據(jù)首址送R0MOVR7,#07H;各次冒泡比較次數(shù)送R7CLRF0;交換標(biāo)志清0LOOP:MOVA,@R0;取前數(shù)MOV2BH,A;存前數(shù)INCR0MOV2AH,@R0;取后數(shù)CLRCCJNEA,2AH,JAOHSJMPNEXTJAOH:SUBBA,@R0;前數(shù)減后數(shù)JCNEXT;前數(shù)小于后數(shù)不交換

MOV@R0,2BHDECR0MOV@R0,2AH;前后數(shù)交換位置INCR0SETBF0;置交換標(biāo)志位NEXT:DJNZR7,LOOP;未比較完,進(jìn)行下一次比較JBF0,SORT;交換過數(shù)據(jù)進(jìn)行下一次冒泡SJMP﹩END3.3.6子程序設(shè)計在程序設(shè)計中,常常會遇到在同一個程序中有許多相同的運算或操作。如“求Y=a2+b2+c2+d2”,就需要進(jìn)行四次平方運算。如果每次遇到這些運算或操作時,都將解決這些問題的程序重新寫一遍,將會使程序變得很長,浪費內(nèi)存。如何解決這個問題呢?可以使用子程序。(1)子程序的概念子程序是完成一定功能并能被其它程序反復(fù)調(diào)用的程序段。采用子程序后,同一個程序段就可不必每次重新書寫,而只需書寫一次。當(dāng)一個程序中需要用到子程序的功能時,只需要對子程序進(jìn)行一次調(diào)用即可。調(diào)用子程序的程序稱為主程序或調(diào)用程序。在子程序中也可以調(diào)用另外的子程序,稱為子程序嵌套。(2)子程序的調(diào)用和返回子程序調(diào)用是在主程序中通過子程序調(diào)用指令LCALL或ACALL來實現(xiàn)的。在子程序的最后有一條返回指令RET,CPU執(zhí)行返回指令RET后,由子程序返回到主程序,繼續(xù)執(zhí)行主程序。綜上所述,子程序的調(diào)用和返回實際上是暫時停止執(zhí)行主程序而轉(zhuǎn)去執(zhí)行子程序,當(dāng)子程序執(zhí)行完后再返回主程序,繼續(xù)執(zhí)行主程序。子程序的調(diào)用和返回過程見圖3-23所示。主程序調(diào)用指令調(diào)用指令斷點斷點入口地址子程序返回指令調(diào)用指令主程序斷點調(diào)用指令返回指令返回指令入口地址入口地址子程序1子程序2(a)二次調(diào)用子程序(b)二級子程序嵌套示意圖圖3-23子程序調(diào)用和返回(3)子程序在編寫和調(diào)用時應(yīng)注意以下幾點①子程序結(jié)構(gòu)獨立程序“一進(jìn)一出”,即一個入口地址和一個返回地址。入口處必須有標(biāo)號,子程序調(diào)用指令通過標(biāo)號對子程序進(jìn)行調(diào)用。出口處必須是返回指令RET。②現(xiàn)場保護(hù)和現(xiàn)場恢復(fù)主程序在運行過程中使用了一些寄存器,在子程序中可能也要用到這些寄存器。為了避免對主程序還有用的內(nèi)容被子程序覆蓋掉,在執(zhí)行子程序前必須設(shè)法保護(hù)這些寄存器的內(nèi)容,稱為現(xiàn)場保護(hù)。在執(zhí)行完子程序返回主程序前還要恢復(fù)這些寄存器的內(nèi)容,稱為現(xiàn)場恢復(fù)。一般是通過堆棧操作指令或工作存器換區(qū)指令對現(xiàn)場進(jìn)行保護(hù)和恢復(fù)。如下邊程序所示:PUSHAccPUSHPSWPUSHB;保護(hù)現(xiàn)場┇POPBPOPPSWPOPAcc;恢復(fù)現(xiàn)場RET;返回③參數(shù)傳遞為了使子程序具有通用性,子程序中的操作數(shù)不能為立即數(shù),而應(yīng)該采用存儲單元地址或寄存器的形式,即操作數(shù)應(yīng)為變量。在調(diào)用子程序前,主程序應(yīng)先把子程序所需要的有關(guān)參數(shù)放到某些約定的存儲單元或寄存器中,進(jìn)入子程序后,再從約定的單元取出有關(guān)參數(shù)加以處理,稱為入口參數(shù)。例如在一個開平方的子程序中,開平方的對象可以用累加器A,即對A中的數(shù)據(jù)開平方。累加器A中的數(shù)據(jù)可以在主程序中安排相應(yīng)的指令進(jìn)行設(shè)置。這樣處理后主程序送給累加器A一個什么樣的數(shù),子程序就對什么數(shù)開平方,而不是只能對某一個數(shù)開平方。在處理完主程序送的入口參數(shù)后子程序結(jié)束前,同樣應(yīng)把處理結(jié)果送到約定單元。返回主程序后,主程序可以從這些約定單元獲得所需結(jié)果,稱為出口參數(shù)。在MCS-51中,可通過工作寄存器R0-R7、特殊功能寄存器SFR、內(nèi)存單元或堆棧進(jìn)行參數(shù)傳遞。(4)舉例【例3.35】用程序?qū)崿F(xiàn)c=a2+b2。設(shè)a、b均小于10。a存在31H單元,b存在32H單元,結(jié)果c存入33H單元。解:程序如下:ORG2000HDAADATA31HDBBDATA32HDCCDATA33HMOVA,DAA;第一個數(shù)送AACALLSQR;第一次調(diào)用MOVR1,A;將a2存于R1MOVA,DBB;第二個數(shù)送AACALL-SQR;第二次調(diào)用ADDA,R1;A←a2+b2MOVDCC,A;存結(jié)果SJMP$SQR:MOVDPTR,#TABLE;查表求平方子程序MOVCA,@A+DPTRRETTABLE:DB0,1,4,9,16;平方表DB25,36,49,64,81END【例3.36】求兩個無符號數(shù)據(jù)塊中的最大值。數(shù)據(jù)塊的首地址分別為60H和70H,每個數(shù)據(jù)塊的第一字節(jié)都存放數(shù)據(jù)塊長度。結(jié)果存入5FH單元。解:首先通過兩次調(diào)用求最大值子程序,分別求出數(shù)據(jù)塊中的最大值,然后通過比較求出最大值。程序如下:ORG0200HMOVR1,#60H;第一個數(shù)據(jù)塊的首地址送R1ACALLMAX;調(diào)子程序MAX求第一個數(shù)據(jù)塊中的最大值MOV40H,A;第一個數(shù)據(jù)塊的最大值送40H單元暫存MOVR1,#70H;第二個數(shù)據(jù)塊的首地址送R1ACALLMAX;調(diào)子程序MAX求第二個數(shù)據(jù)塊中的最大值CJNEA,40H,NEXT;兩個數(shù)據(jù)塊的最大值相比較NEXT:JNCLP1MOVA,40HLP1:MOV5FH,A;最大值送5FHSJMP$MAX:MOVA,@R1;取數(shù)據(jù)塊長度MOVR2,A;數(shù)據(jù)塊長度送R2CLRA;設(shè)最大值的初始值為0SUBBA,@R1;A中的原最大值與數(shù)據(jù)塊中的數(shù)據(jù)相比較JNCLP3;原數(shù)據(jù)仍為最大值時轉(zhuǎn)LP3MOVA,@R1;數(shù)據(jù)塊中的數(shù)據(jù)大于原最大值時,更新最大值SJMPLP4LP3:ADDA,@R1;恢復(fù)原最大值LP4:DJNZR2,LP2;循環(huán)未結(jié)束轉(zhuǎn)LP2RETEND3.4.1查表程序設(shè)計(1)用DPTR作基地址的查表步驟①把表的首地址送DPTR;②把所查表的項數(shù)(即在表格中的位置是第幾項)送入累加器A中;③執(zhí)行查表指令MOVCA,@A+DPTR,查表的結(jié)果送入A中。(2)用PC內(nèi)容作基地址的查表步驟①將所查表的項數(shù)送入累加器A中;②將MOVCA,@A+PC指令的下一條指令到表格首地址的指令字節(jié)數(shù)加到A中;③執(zhí)行查表指令MOVCA,@A+PC,查表的結(jié)果送入A中。3.4匯編語言程序設(shè)計舉例【例3.37】用查表法求Y=x2,設(shè)自變量X的值在R0中,X的取值范圍為0~9。解:方法一:用MOVCA,@A+DPTR指令實現(xiàn)ORG2000HMOVDPTR,#TABLE;表格首地址送DPTRMOVA,R0;項數(shù)送AMOVCA,@A+DPTR;查表將平方值取到A中MOVR0,A;結(jié)果存入R0SJMP﹩TABLE:DB0,1,4,9,16;平方表DB25,36,49,64,81END方法二:用MOVCA,@A+PC指令實現(xiàn)ORG0200HMOVA,R0;項數(shù)送AADDA,#03H;加入“MOVR0,A”指令到表格首地址的字節(jié)數(shù)MOVCA,@A+PC;查表將平方值取到A中MOVR0,A;結(jié)果存入R0SJMP$TABLE:DB0,1,4,9,16;平方表DB25,36,49,64,81END【例3.38】設(shè)一位16進(jìn)制數(shù)存放在R0寄存器的低4位,將其轉(zhuǎn)換為ASCⅡ碼,轉(zhuǎn)換結(jié)果仍送回R0中。由ASCⅡ碼表可知,0~9的ASCⅡ碼為30H~39H,A~F的ASCⅡ碼為41H~46H。查表程序如下:ORG0200HMOVDPTR,#ASCTAB;表格首址送DPTRMOVA,R0;取待轉(zhuǎn)換的數(shù)ANLA,#OFH;屏蔽高4位MOVCA,@A+DPTR;查表求ASCⅡ碼MOVR0,A;存轉(zhuǎn)換結(jié)果SJMP$ASCTAB:DB30H,31H,32H,33H,34H;ASCⅡ碼表DB35H,36H,37H38H,39H,41H,42H,43H,44H,45H,46HEND【例3.39】【例3.40】3.4.2數(shù)據(jù)檢索程序設(shè)計數(shù)據(jù)檢索程序是查找數(shù)據(jù)區(qū)中是否存在一個特定數(shù)據(jù)的程序。這個特定的數(shù)據(jù)常稱為關(guān)鍵字。常用數(shù)據(jù)檢索方法是順序檢索法。即將關(guān)鍵字與數(shù)據(jù)區(qū)中的數(shù)據(jù)按從前向后的順序逐個進(jìn)行比較,判斷是否為所查找的關(guān)鍵字?!纠?.41】在20H開始的10個單元中查找是否存在關(guān)鍵字KEY,如存在將1送入30H單元,否則將-1送入30H單元解:設(shè)R0為地址指針,初值為20H。R1為循環(huán)計數(shù)器,初值為10。則流程圖如圖3-24所示。程序如下:ORG2000HKEYDATA31H;定義關(guān)鍵字MOVR0,#20H;地址指針賦初值MOVR1,#10;計數(shù)器賦初值LOOP:MOVA,@R0;取一個數(shù)據(jù)CJNEA,#KEY,NEXT;不是關(guān)鍵字轉(zhuǎn)NEXTMOV30H,#01H;是關(guān)鍵字1送30H單元SJMPEXITNEXT:INCR0DJNZR1,LOOP;未結(jié)束繼續(xù)查找MOV30H,#0FFH;未找到-1送30HEXIT:SJMPEXIT3.4.3運算程序設(shè)計(1)多字節(jié)加法進(jìn)行多字節(jié)加法運算時,應(yīng)按照由低字節(jié)向高字節(jié)的順序進(jìn)行,高字節(jié)相加時應(yīng)考慮低字節(jié)的進(jìn)位?!纠?.42】已知兩個10字節(jié)的無符號數(shù)分別存在以BLOCK1和BLOCK2為起始地址的存儲區(qū)中,求兩個數(shù)的和并把結(jié)果存放在以BLOCK1為起始地址的存儲區(qū)中。解:設(shè)R0、R1為地址指針,R0指向第一個加數(shù)并兼作“和”的指針;R1指向另一個加數(shù)。R2為循環(huán)計數(shù)器,初值為字節(jié)數(shù)10。程序如下:

ORG2000HBLOCK1DATA20HBLOCK2DATA30HMOVR0,#BLOCK1MOVR1,#BLOCK2;設(shè)置兩個地址指針初值MOVR2,#10;設(shè)置循環(huán)計數(shù)器初值CLRC;進(jìn)位標(biāo)志初值為0LOOP:MOVA,@R0;取被加數(shù)到AADDCA,@R1;相加MOV@R0,A;存結(jié)果INCR0;指向被加數(shù)高位INCR1;指向加數(shù)高位DJNZR2,LOOP;未加完則繼續(xù)CLRAADDCA,#0;加最高位的進(jìn)位MOV@R0,A;保存最高位的進(jìn)位SJMP$END

推廣:此程序還可以進(jìn)行多字節(jié)十進(jìn)制數(shù)(BCD碼)加法運算。此時只需在指令“ADDCA,@R1”之后加一條十進(jìn)制調(diào)整指令“DAA”即可。(2)多字節(jié)減法多字節(jié)減法與多字節(jié)加法類似,運算時也是從低字節(jié)開始,高字節(jié)相減時要考慮低字節(jié)的借位?!纠?.43】已知兩個10字節(jié)無符號數(shù)分別存在以BLOCK1和BLOCK2為起始地址的存儲區(qū)中,求兩個數(shù)的差并把結(jié)果存放在以BLOCK1為起始地址的數(shù)據(jù)區(qū)中。解:程序如下:

ORG2000HBLOCK1DATA20HBLOCK2DATA30HMOVR0,#BLOCK1MOVR1,#BLOCK2MOVR2,#10LOOP:MOVA,@R0;取被減數(shù)

SUBBA,@R1;相減

MOV@R0,A;存結(jié)果

INCR0INCR1DJNZR2,LOOPSJMP$

END(3)雙字節(jié)乘法在MCS-51指令系統(tǒng)中有一條8位數(shù)的乘法指令“MULAB”。在加法運算的配合下,可以實現(xiàn)雙字節(jié)乘法運算?!纠?.44】已知BLOCK1和BLOCK2開始的存儲單元內(nèi)存放雙字節(jié)的乘數(shù)和被乘數(shù),求積并將乘積存放入BLOCK3開始的4個連續(xù)單元中。解:設(shè)被乘數(shù)送入工作寄存器R5R4,乘數(shù)送入工作寄存器R3R2,乘積首地址送入工作寄存器R0。利用單字節(jié)乘法指令來實現(xiàn)雙字節(jié)乘法,算法為邊乘邊加,其原理如圖3-25所示。其中用一個子程序完成各次乘積相加。程序如下:(R4×R2)H(R4×R2)L(R5×R2)L(R5×R2)H(R4×R3)L(R4×R3)H(R0+3)(R0+2)(R0+1)(R0)R5R4×R3R2(R5×R3)L(R5×R3)H+圖3-25雙字節(jié)乘法原理圖

ORG0100HBLOCK1DATA20HBLOCK2DATA30HBLOCK3DATA40HMOVR5,BLOCK1MOVR4,BLOCK1+1;被乘數(shù)送R5R4中

MOVR3,BLOCK2MOVR2,BLOCK2+1;乘數(shù)送R3R2中

MOVR0,#BLOCK3;R0指向乘積單元首地址

MOVR7,#04H;將R0指向的4個單元清0DMO:MOV@R0,#00HINCR0DJNZR7,DMOSUBBR0,#04H;R0指向乘積單元首地址

MOVA,R4MOVB,R2MULAB;R4×R2ACALLADDM;乘積累加到相應(yīng)結(jié)果單元MOVA,R5MOVB,R2MULAB;R5×R2DECR0ACALLADDM;乘積累加到相應(yīng)結(jié)果單元

MOVA,R4MOVB,R3MULAB;R4×R3DECR0DECR0ACALLADDM;乘積累加到相應(yīng)結(jié)果單元

MOVA,R5MOVB,R3MULAB;R5×R3DECR0ACALLADDM;乘積累加到相應(yīng)結(jié)果單元

SJMP$ADDM:ADDA,@R0;A×B累加到R0指出的2個單元

MOV@R0,AMOVA,BINCR0ADDCA,@R0MOV@R0,AINCR0MOVA,@R0ADDCA,#00H;將進(jìn)位加到相鄰高位MOV@R0,ARETEND1.實訓(xùn)目的通過本次實訓(xùn),(1)進(jìn)一步掌握KeilC51uvision4的基本操作方法;(2)進(jìn)一步掌握ISIS7professional的基本操作方法;(3)掌握單片機中輸出端口的控制方法;(4)掌握延時循環(huán)程序的分析方法。2.知識要點(1)硬件電路及其工作原理硬件電路仍然采用第2章實訓(xùn)二中的圖2-15。它就是單片機最小應(yīng)用系統(tǒng)加上P1口所接8個發(fā)光二極管。所不同的是實訓(xùn)二中只要求用AT89C51編程控制接在P1.0上的發(fā)光二極管亮滅,即亮一段時間然后熄滅一段時間再亮一段時間,依此規(guī)律循環(huán)?,F(xiàn)在要求用AT89C51編程控制8只發(fā)光二極管,使各發(fā)光二極管從P1.0開始點亮并延時熄滅,然后再點亮下一個發(fā)光二極管,8只發(fā)光二極管循環(huán)點亮后再從P1.0開始重復(fù)循環(huán)。這種顯示方式下的發(fā)光二極管通俗地稱為流水燈。可見,同樣一個硬件電路采用不同的控制程序就能實現(xiàn)不同的功能,這正是單片機的奇妙之處。可以說,單片機就是讓內(nèi)內(nèi)外外都相同的一塊集成電路(MCU)通過控制程序?qū)崿F(xiàn)千千萬萬個不同的具體功能。只要你編得出程序,單片機就能完成你所需要的功能。實訓(xùn)三:單片機控制流水燈(匯編程序)

(2)參考程序匯編語言參考源程序如下所示:

ORG0000H;開機或復(fù)位后單片機總是從0000H單元開始執(zhí)行程序

AJMPMAIN;無條件跳轉(zhuǎn)到主程序處執(zhí)行

ORG0100H;主程序存放的起始地址

MAIN:MOVA,#0FEH;#0FEH送累加器AMOVP1,A;累加器A中內(nèi)容送P1口

ACALLDELAY;調(diào)延時子程序延時一段時間RLA;累加器A中內(nèi)容循環(huán)左移一位

SJMPMAIN;轉(zhuǎn)至MAIN

DELAY:MOVR2,#10;三重循環(huán)延時子程序

DL3:MOVR0,#200

DL1:MOVR1,#250

DL2:DJNZR1,DL2

DJNZR0,DL1

DJNZR2,DL3

RET

END3.實訓(xùn)器材(1)DICE-5208K開發(fā)型單片機綜合實驗儀1套。(2)PC機1臺。(3)DICE-3000仿真器1臺。(4)帶插針的導(dǎ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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論