




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第3章 MCS-51單片機指令系統(tǒng) 和匯編語言程序示例3.1 MCS-51單片機指令系統(tǒng)概述3.2 尋址方式3.3 數(shù)據(jù)傳送類指令3.4 算術(shù)運算類指令3.5 邏輯運算及移位指令3.6 控制轉(zhuǎn)移類指令3.7 子程序調(diào)用與返回指令3.8 位操作類指令3.9 匯編程序格式與偽指令3.10 匯編程序設(shè)計示例3.1 MCS-51單片機指令系統(tǒng)概述3.1.1 指令、指令系統(tǒng)的概念 指令:能完成特定功能的命令。 指令描述的兩種基本形式:機器語言和匯編語言 指令系統(tǒng):計算機能夠執(zhí)行的全部操作所對應(yīng)的指令集合。 編寫程序?qū)嶋H上是從指令系統(tǒng)中挑選一個指令子集的過程。 指令的屬性 指令一般有功能、時間和空間三種屬
2、性。 功能屬性是指每條指令都對應(yīng)一個特定的操作功能; 時間屬性是指一條指令執(zhí)行所用的時間,一般用機器 周期來表示; 空間屬性是指一條指令在程序存儲器中存儲所占用的 字節(jié)數(shù)。3.1.2 MCS-51單片機指令系統(tǒng)及其指令格式 MCS-51單片機指令系統(tǒng)具有功能強、指令短、執(zhí)行快等特點,共有111條指令。從功能上可劃分成數(shù)據(jù)傳送、算術(shù)操作、邏輯操作、程序轉(zhuǎn)移位操作等五大類;從空間屬性上分為單字節(jié)指令(49條)、雙字節(jié)指令(46條)和最長的三字節(jié)指令(只有16條)。從時間屬性上可分成單機器周期指令(64條)、雙機器周期指令(45條)和只有乘、除法兩條4個機器周期的指令。可見,MCS-51單片機指令系
3、統(tǒng)在存儲空間和執(zhí)行時間方面具有較高的效率。 指令系統(tǒng)中的指令描述了不同的操作,不同操作對應(yīng)不同的指令。但結(jié)構(gòu)上,每條指令通常由操作碼和操作數(shù)兩部分組成。操作碼表示計算機執(zhí)行該指令將進行何種操作,操作數(shù)表示參加操作的數(shù)的本身或操作數(shù)所在的地址。MCS-51單片機的指令有無操作數(shù)、單操作數(shù)、雙操作數(shù)三種情況。匯編語言指令有如下的格式: 標號: 操作碼助記符 目的操作數(shù),源操作數(shù) ;注釋 為便于后面的學習,在這里先對描述指令的一些符號的約定意義作以說明: (1) Ri和Rn:表示當前工作寄存器區(qū)中的工作寄存器,i取0或1,表示R0或R1。n取07,表示R0R7。 (2) #data:表示包含在指令中
4、的8位立即數(shù)。 (3) #data16:表示包含在指令中的16位立即數(shù)。 (4) rel:以補碼形式表示的8位相對偏移量,范圍為-128127,主要用在相對尋址的指令中。 (5) addr16和addr11:分別表示16位直接地址和11位直接地址。 (6) direct:表示直接尋址的地址。 (7) bit:表示可位尋址的直接位地址。 (8) (X):表示X單元中的內(nèi)容。 (9) (X):表示以X單元的內(nèi)容為地址的存儲器單元內(nèi)容,即(X)作地址,該地址單元的內(nèi)容用(X)表示。 (10) / 和符號:“/”表示對該位操作數(shù)取反,但不影響該位的原值?!啊北硎静僮髁鞒蹋瑢⒓惨环降膬?nèi)容送入箭頭所指另
5、一方的單元中去。 3.2 尋 址 方 式 尋址方式:CPU尋找操作數(shù)或操作數(shù)地址的方法。 尋址方式越多,計算機指令功能越強,靈活性越大。MCS-51采用7種尋址方式:3.2.1 立即尋址 操作數(shù)直接出現(xiàn)在指令中,緊跟在操作碼的后面,作為指令的一部分與操作碼一起存放在程序存儲器中,可以立即得到并執(zhí)行,不需要經(jīng)過別的途徑去尋找,故稱為立即尋址。匯編指令中,在一個數(shù)的前面冠以#符號作前綴,就表示該數(shù)為立即尋址。 指令:MOV A,#5AH機器碼:74H 5AH3.2.2 寄存器尋址 在指令選定的某寄存器中存放或讀取操作數(shù),以完成指令規(guī)定的操作,稱為寄存器尋址。 例如:MOVA,R7指令中源操作數(shù)和目
6、的操作數(shù)都是寄存器尋址。該指令的功能是把工作寄存器R7中的內(nèi)容傳送到累加器A中,如R7中的內(nèi)容為30H,則執(zhí)行該指令后A的內(nèi)容也為30H。 指令:MOV A,R7機器碼:EFH3.2.3 寄存器間接尋址 由指令指出某一寄存器的內(nèi)容作為操作數(shù)地址的尋址方法,稱為寄存器間接尋址。這里需要強調(diào)的是:寄存器中的內(nèi)容不是操作數(shù)本身,而是操作數(shù)的地址,到該地址單元中才能得到操作數(shù)。寄存器起地址指針的作用。指令:MOV A,R1機器碼:E7H3.2.4 直接尋址 指令中直接給出操作數(shù)所在的存儲器地址,以供取數(shù)或存數(shù)的尋址方式稱為直接尋址。 指令:MOV A,3FH機器碼:E5H 3FH MCS-51系列單片
7、機的直接尋址可用于訪問片內(nèi)、外數(shù)據(jù)存儲器,也可用于訪問程序存儲器。直接尋址可訪問片內(nèi)RAM的低128個單元(00H7FH),同時也是用于訪問高128個單元的特殊功能寄存器SFR的唯一方法。 由于52子系列的片內(nèi)RAM有256個單元,其高128個單元與SFR的地址是重疊的。為了避免混亂,單片機規(guī)定:直接尋址的指令不能訪問片內(nèi)RAM的高128個單元(80HFFH),若要訪問這些單元只能用寄存器間接尋址指令,而要訪問SFR只能用直接尋址指令。訪問SFR可在指令中直接使用該寄存器的名字來代替地址,如MOV A,80H,可以寫成MOV A,P0,因為P0口的地址為80H。 3.2.5 變址尋址圖3.2
8、變址尋址示意圖 基址寄存器加變址寄存器間接尋址,簡稱變址尋址。指令:MOV A,A+DPTR機器碼:93H3.2.6 相對尋址訪問程序存儲器,出現(xiàn)在相對轉(zhuǎn)移指令中。相對尋址是將程序計數(shù)器 PC中的當前值與指令第二字節(jié)所給出的偏移量相加,其和為跳轉(zhuǎn)指令的轉(zhuǎn)移地址。偏移量范圍為-128 一+127。例如 SJMP 20H ;機器碼為80H 20H。在使用相對尋址時要注意以下兩點: (1) 當前PC值是指相對轉(zhuǎn)移指令的存儲地址加上該指令的字節(jié)數(shù)。例如:JZ rel 是一條累加器A為零就轉(zhuǎn)移的雙字節(jié)指令。若該指令的存儲地址為2050H,則執(zhí)行該指令時的當前PC值即為2052H。即當前PC值是對相對轉(zhuǎn)移
9、指令取指結(jié)束時的值。 (2) 偏移量rel是有符號的單字節(jié)數(shù)。以補碼表示,其值的范圍是-128+127(00HFFH),負數(shù)表示從當前地址向前轉(zhuǎn)移,正數(shù)表示從當前地址向后轉(zhuǎn)移。所以,相對轉(zhuǎn)移指令滿足條件后,轉(zhuǎn)移的地址(目的地址)為: 目的地址=當前PC值+rel = 指令存儲地址+指令字節(jié)數(shù)+rel3.2.7 位尋址 位尋址是在位操作指令中直接給出位操作數(shù)的地址,可以對片內(nèi)RAM中的128位和特殊功能寄存器SFR中的93位進行尋址。 例如指令MOV C,24H.0;機器碼為A2H 20H,相當于MOV C,20H。3.3 數(shù)據(jù)傳送類指令3.3.1 訪問片內(nèi)數(shù)據(jù)存儲器的一般數(shù)據(jù)傳送指令 該類指令
10、的功能是實現(xiàn)數(shù)在片內(nèi)RAM單元之間、寄存器之間、寄存器與RAM單元之間的傳送。所有指令具有統(tǒng)一的格式,其格式如下: MOV ,;目的操作數(shù)單元源操作數(shù)(或單元) 操作碼助記符都是MOV,目的操作數(shù)和源操作數(shù)不同尋址方式的組合就派生出該類的全部指令。因此,記憶這類指令的關(guān)鍵在于掌握兩個操作數(shù)的各種尋址方式的組合關(guān)系。圖3.3 訪問片內(nèi)RAM的一般傳送指令操作關(guān)系圖 表3.1 訪問片內(nèi)RAM的一般傳送指令表 例1 設(shè)內(nèi)部RAM(30H)=40H,(40H)=10H,(10H)=00H(P1)=CAH,分析以下程序執(zhí)行后各單元及寄存器、P2口的內(nèi)容。MOV R0,#30H;(R0)30HMOV A,
11、R0;(A)(R0)MOV R1,A;(R1)(A)MOV B,R1;(B)(R1)MOV R1,P1;(R1)(P1)MOV P2,P1;(P2)(P1)MOV 10H,#20H;(10H)20H 執(zhí)行上述指令后的結(jié)果為:(R0)=30H,(R1)=(A)=40H,(B)=10H,(40H)=(P1)=(P2)=CAH,(10H)=20H。3.3.2 片內(nèi)特殊傳送指令 1堆棧操作指令 堆棧操作有進棧和出棧,即壓入和彈出數(shù)據(jù),常用于保存或恢復現(xiàn)場。進棧指令用于保存片內(nèi)RAM單元(低128字節(jié))或特殊功能寄存器SFR的內(nèi)容;出棧指令用于恢復片內(nèi)RAM單元(低128字節(jié))或特殊功能寄存器SFR的內(nèi)
12、容。 該類指令共有如下兩條指令:(SP)(SP)-1 修改指針,指向新棧頂(direct)(SP)+ 1) 把棧頂?shù)臄?shù)據(jù)彈出到直接尋址單元中去PUSH direct ;POP direct ;(SP)direct 把直接地址單元的內(nèi)容壓入SP所指單元內(nèi)(SP)(SP)+ 1 修改指針,使其指向棧頂上的一個存數(shù)單元 這兩條指令都是雙字節(jié)指令,機器碼分別為:C0 direct 和D0 direct。 例2 若在外部程序存儲器中2000H單元開始依次存放09的平方值,數(shù)據(jù)指針(DPTR)=3A00H,用查表指令取得2003H單元的數(shù)據(jù)后,要求保持DPTR中的內(nèi)容不變。完成上述功能的程序如下:MOV
13、A,#03H;(A)03HPUSH DPH;保護DPTR高8位入棧PUSH DPL;保護DPTR低8位入棧MOV DPTR,#2000H;(DPTR)2000HMOVC A,A+DPTR;(A)(2000H+03H)POP DPL ;彈出DPTR低位POP DPH ;彈出DPTR高位執(zhí)行結(jié)果:(A)09H,(DPTR)=3A00H。 2數(shù)據(jù)交換指令 數(shù)據(jù)傳送指令一般都是將操作數(shù)自源地址單元傳送到目的地址單元,指令執(zhí)行后,源地址單元的操作數(shù)不變,目的地址單元的操作數(shù)則修改為源地址單元的操作數(shù)。交換指令數(shù)據(jù)作雙向傳送,涉及傳送的雙方互為源地址、目的地址,指令執(zhí)行后每方的操作數(shù)都修改為另一方的操作數(shù)
14、。因此,兩操作數(shù)均未沖掉、丟失。數(shù)據(jù)交換指令共有如下5條指令:例3 設(shè)(R0) = 30H,30H = 4AH,(A) = 28H,則執(zhí)行XCH A, R0后,結(jié)果為(A) = 4AH,(30H) = 28H。執(zhí)行XCHD A,R0后,結(jié)果為(A) = 2AH,(30H) = 48H。執(zhí)行SWAP A后,結(jié)果為(A) = 82H。3.3.3 片外數(shù)據(jù)存儲器數(shù)據(jù)傳送指令 MCS-51單片機CPU對片外擴展的數(shù)據(jù)存儲器RAM或I/O口進行數(shù)據(jù)傳送,必須采用寄存器間接尋址的方法,通過累加器A來完成。這類指令共有以下條單字節(jié)指令,指令操作碼助記符都為MOVX。指令助記符 操作功能注釋 機器碼(H)MO
15、VX A,DPTR ; (A)(DPTR) E6MOVX A,Ri ; (A)(Ri) E2、E3MOVX DPTR ,A ; (DPTR)(A) F0MOVX Ri,A ; (Ri)(A) F2、F3例4 設(shè)外部RAM(0203H)= FFH,分析以下指令執(zhí)行后的結(jié)果。MOV DPTR,#0203H ;(DPTR)0203HMOVX A,DPTR ;(A)(DPTR)MOV 30H,A ;(30H)(A)MOV A,#0FH ;(A)0FHMOVX DPTR,A ;(DPTR)(A)執(zhí)行結(jié)果為:(DPTR)=0203H,(30H)=FFH,(0203H)=(A)=0FH。3.3.4 訪問程序
16、存儲器的數(shù)據(jù)傳送指令 訪問程序存儲器的數(shù)據(jù)傳送指令又稱作查表指令,采用基址寄存器加變址寄存器間接尋址方式,把程序存儲器中存放的表格數(shù)據(jù)讀出,傳送到累加器A。共有如下兩條單字節(jié)指令,指令操作碼助記符為MOVC。指令助記符 操作功能注釋 機器碼(H)MOVC A, A+DPTR ;(A)(A)+(DPTR) 93MOVC A, A+PC ;(PC)(PC)+1,(A)(A)+(PC) 83 前一條指令采用DPTR作基址寄存器,16位地址送到DPTR,實現(xiàn)在整個64 KB程序存儲器單元到累加器A的數(shù)據(jù)傳送。 后一條指令以PC作為基址寄存器,CPU取完該指令操作碼時PC會自動加1,指向下一條指令的第一
17、個字節(jié)地址,即此時是用(PC)+1作為基址的。累加器A中的內(nèi)容為8位無符號數(shù),本指令查表范圍只能在256個字節(jié)范圍內(nèi)(即(PC)+1H(PC)+100H),使表格地址空間分配受到限制。同時編程時還需要進行偏移量的計算,即MOVC A,A+PC指令所在地址與表格存放首地址間的距離字節(jié)數(shù)的計算,并需要一條加法指令進行地址調(diào)整。偏移量計算公式為:偏移量 = 表首地址-(MOVC指令所在地址+1) 例5 從片外程序存儲器2000H單元開始存放09的平方值,以PC作為基址寄存器進行查表得9的平方值。 設(shè)MOVC指令所在地址(PC)=1FF0H,則偏移量=2000H-(1FF0H+1)=0FH。 相應(yīng)的程
18、序如下:MOV A,#09H ;(A)09HADD A,#0FH ;用加法指令進行地址調(diào)整MOVC A,A+PC ;(A)(A)+(PC)+1)執(zhí)行結(jié)果為:(PC)=1FF1H,(A)=51H。如果用以DPTR為基址寄存器的查表指令,其程序如下:MOV DPTR, 2000H;置表首地址MOV A, 09HMOVC A, A+DPTR練習題試分析以下程序的執(zhí)行結(jié)果。(DPL)=_,(B)=_。 MOV SP,#3AHMOV DPL,#20HMOV B,#30HPUSH DPLPUSH BPOP DPLPOP B3.4 算術(shù)運算類指令3.4.1 加、減法指令圖3.4 加減法指令形式結(jié)構(gòu)圖(a)
19、加減法指令關(guān)系圖;(b) 加1、減1指令關(guān)系圖 算術(shù)運算結(jié)果將影響CY、半進位標志AC、溢出標志OV。加減法運算結(jié)果將影響CY、AC、OV,乘除運算只影響CY,OV。只有加1和減1指令不影響這三種標志。表3.2 加減法指令表 例6 設(shè)(A) = 49H,(R0)=6BH,分析執(zhí)行指令ADD A,R0后的結(jié)果。 結(jié)果為:(A)=B4H,OV=1,CY=0,AC=1,P=0。 例7 設(shè)(A)=C3H,數(shù)據(jù)指針低位(DPL)=ABH,CY=1,分析執(zhí)行指令ADDC A,DPL后的結(jié)果。 結(jié)果為:(A)=6FH,CY=1,AC=0,P=0。 例8 設(shè) (A) = 52H,(R0)=B4H,分析執(zhí)行如下
20、指令后的結(jié)果 CLR C ;是位操作指令,是進位位清零 SUBB A,R0 結(jié)果為:(A)=9EH,CY=1,AC=1,OV=1,P=1。 例9 設(shè) (R0) = 7EH,(7EH)=FFH,(7FH)=38H,(DPTR)=10FEH,分析逐條執(zhí)行下列指令后各單元的內(nèi)容。INC R0 ;使7EH單元內(nèi)容由FFH變?yōu)?0HINC R0 ;使R0的內(nèi)容由7EH變?yōu)?FHINC R0 ;使7FH單元內(nèi)容由38H變?yōu)?9HINC DPTR ;使DPL為FFH,DPH不變INC DPTR ;使DPL為00H,DPH為11HINC DPTR ;使DPL為01H,DPH不變3.4.2 十進制調(diào)整指令若(A
21、)309或(AC)=1,則(A)30(A)30+06H若(A)749或(CY)=1,則(A)74(A)74+06HDA A ; 若AC=1,CY=1同時發(fā)生,或者高4位雖等于9但低4位修正后有進位,則A應(yīng)加66H修正。 十進制調(diào)整指令是一條對二-十進制的加法進行調(diào)整的指令。它是一條單字節(jié)指令,機器碼為D4H。兩個壓縮BCD碼按二進制相加,必須在加法指令ADD、ADDC后,經(jīng)過本指令調(diào)整后才能得到正確的壓縮BCD碼和數(shù),實現(xiàn)十進制的加法運算。 例10 對BCD碼加法65 + 58DBH,進行十進制調(diào)整。 參考程序如下:MOV A,#65H ;(A)65ADD A,#58H ;(A)(A)+58D
22、A A ;十進制調(diào)整 使用時應(yīng)注意:DA指令不能對減法進行十進制調(diào)整。做減法運算時,可采用十進制補碼相加,然后用 DA A指令進行調(diào)整。例如 70 - 20 = 70 + 20補 = 70 +(100 - 20)= 70 + 80 = 1 50 機內(nèi)十進制補碼可采用:x補 = 9AH -x。 例11 設(shè)片內(nèi)RAM 30H,31H單元中分別存放著兩位BCD碼表示的被減數(shù)和減數(shù),兩數(shù)相減的差仍以BCD碼的形式存放在32H單元中??捎孟旅娴某绦?qū)崿F(xiàn):CLR CMOV A,#9AHSUBB A,31H ;求減數(shù)的十進制補碼ADD A,30H ;作十進制補碼加法DA A ;進行BCD調(diào)整MOV 32H,
23、A ;將BCD碼的差送存32H單元3.4.3 乘、除法指令MUL AB;(B)(A)(B)158(A)(A)(B)70CY0機器碼:A4H 乘法指令的功能是把累加器A和寄存器B中的兩個8位無符號數(shù)相乘,將乘積16位數(shù)中的低8位存放在A中,高8位存放在B中。若乘積大于FFH(255),則溢出標志OV置1,否則OV清零。乘法指令執(zhí)行后進位標志CY總是零,即CY=0。2除法指令DIV AB;(A)(A)(B)之商,(B)(A)(B)之余數(shù)(CY)0,(OV)0機器碼:84H 除法指令的功能是把累加器A中的8位無符號整數(shù)除以寄存器B中的8位無符號整數(shù),所得商存于累加器A中,余數(shù)存于寄存器B中,進位標志
24、位CY和溢出標志位OV均被清零。若B中的內(nèi)容為0時,溢出標志OV被置1,即OV=1,而CY仍為0。3.5 邏輯運算及移位指令圖3.5 邏輯指令形式結(jié)構(gòu)圖 與加、減法指令尋址方式相同的邏輯指令;(b) 與加、減法指令尋址方式不同的邏輯指令表3.3 邏輯操作指令表表3.3 邏輯操作指令表 例12 (P1)=C5H=11000101B,屏蔽P1口高4位而保留低4位。 執(zhí)行指令:ANL P1,#0FH 結(jié)果為:(P1)=05H=00000101B。 邏輯“或”指令常用來使字節(jié)中某些位置“1”,其它位保持不變。則欲置位的位用1與該位相或,保留不變的位用0 與該位相或。 例13 若(A)=C0H,(R0)
25、=3FH,(3FH)=0FH, 執(zhí)行指令:ORL A,R0 結(jié)果為:(A)=CFH=11001111B。 邏輯異或指令常用來使字節(jié)中某些位進行取反操作,其它位保持不變。欲某位取反該位與1相異或;欲某位保留則該位與0 相異或。還可利用異或指令對某單元自身異或,以實現(xiàn)清零操作。 例14 若(A)=B5H=10110101B,執(zhí)行下列操作: XRL A,#0F0H ; A的高4位取反,低4位保留, (A)=01000101B=45H MOV 30H,A ;(30H)=45H XRL A,30H ;自身異或使A清零 用移位指令還可以實現(xiàn)算術(shù)運算,左移一位相當于原內(nèi)容乘以2,右移一位相當于原內(nèi)容除以2,
26、但這種運算關(guān)系只對某些數(shù)成立(請讀者自行思考)。例15 設(shè)(A)=5AH=90,且CY=0,則執(zhí)行指令RL A后,(A)=B4H=180。執(zhí)行指令 RR A后,(A)=2DH=45。執(zhí)行指令 RLC A后,(A)=B4H=180。執(zhí)行指令 RRC A后,(A)=2DH=45。練習題數(shù)據(jù)拆分與拼裝 要求:從(30H)=x7x6x5x4x3x2x1x0中取出高5位,從(31H)=y7y6y5y4y3y2y1y0中取出低3位,拼裝后存入40H中,(40H)=y2y1y0 x7x6x5x4x3。編寫程序?qū)崿F(xiàn)。 ORG 0000H MOV A,30H SWAP A ;(X3X2X1X0 X7X6X5X4
27、) RL A ;X2X1X0X7X6X5X4X3 MOV 40H,A ANL 40H,#00011111B MOV A,31H MOV B,#20H MUL A,B ANL A,11100000B ORL 40H,A END3.6 控制轉(zhuǎn)移類指令3.6.1 無條件轉(zhuǎn)移指令表3.4 無條件轉(zhuǎn)移指令 1LJMP(長轉(zhuǎn)指令) LJMP指令執(zhí)行后,程序無條件地轉(zhuǎn)向16位目標地址(addr16)處執(zhí)行,不影響標志位。由于指令中提供16位目標地址,所以執(zhí)行這條指令可以使程序從當前地址轉(zhuǎn)移到64 KB程序存儲器地址空間的任意地址,故得名為長轉(zhuǎn)移。該指令的缺點是執(zhí)行時間長,字節(jié)多。例:LJMP 0000H (
28、對應(yīng)機器碼:020000) 在程序“跑飛”時,利用 “軟件陷阱”方法使程序 重頭執(zhí)行。 020000 020000 2AJMP(絕對轉(zhuǎn)移指令) AJMP的機器碼是由11位直接地址addr11和指令操作碼00001,按下列分布組成的: a10 a9 a8 0 0 0 0 1 a7 a6 a5 a4 a3 a2 a1 a0 該指令執(zhí)行后,程序轉(zhuǎn)移的目的地址是由AJMP指令所在位置的地址PC值加上該指令字節(jié)數(shù)2,構(gòu)成當前PC值。取當前PC值的高5位與指令中提供的11位直接地址形成轉(zhuǎn)移的目的地址,即 PC15 PC14 PC13 PC12 PC11a10 a9 a8 a7 a6 a5 a4 a3 a2
29、 a1 a0轉(zhuǎn)移目的地址(PC) 由于11位地址的范圍是0000000000011111111111,即2 KB范圍,而目的地址的高5位是由PC當前值,所以程序可轉(zhuǎn)移的位置只能是和PC當前值在同一2 KB范圍內(nèi)。本指令轉(zhuǎn)移可以向前也可以向后,指令執(zhí)行后不影響狀態(tài)標志位。 例如:若AJMP指令地址(PC)=2300H。執(zhí)行指令AJMP 0FFH后,結(jié)果為:轉(zhuǎn)移目的地址(PC)=20FFH,程序向前轉(zhuǎn)到20FFH單元開始執(zhí)行。 又如:若AJMP指令地址(PC)=2FFFH。執(zhí)行指令AJMP 0FFH后,結(jié)果為:轉(zhuǎn)移目的地址(PC)=30FFH,程序向后轉(zhuǎn)到30FFH單元開始執(zhí)行。 由上可見:若ad
30、dr11相同,則AJMP指令的機器碼相同,但轉(zhuǎn)移的目的地址卻可能不同,這是因為轉(zhuǎn)移的目的地址是由PC當前值的高5位與addr11共同決定的。判斷AJMP目標的合法性 0000H AJMP 0111H 07FEH AJMP 0C10H 0100H AJMP 0B11H 3SJMP(相對短轉(zhuǎn)指令) 指令的操作數(shù)rel用8位帶符號數(shù)補碼表示,占指令的一個字節(jié)。因為8位補碼的取值范圍為-128+127,所以該指令的轉(zhuǎn)移范圍是:相對PC當前值向前轉(zhuǎn)128字節(jié),向后轉(zhuǎn)127字節(jié)。即轉(zhuǎn)移目的地址= SJMP指令所在地址+2+rel 如在2100H單元有SJMP指令,若rel = 5AH(正數(shù)),則轉(zhuǎn)移目的地
31、址為215CH(向后轉(zhuǎn));若rel = F0H(負數(shù)),則轉(zhuǎn)移目的地址為20F2H(向前轉(zhuǎn))。 用匯編語言編程時,指令中的相對地址rel往往用欲轉(zhuǎn)移至的地址的標號(符號地址)表示。機器匯編時,能自動算出相對地址值;但手工匯編時,需自己計算相對地址值rel。rel的計算公式如下: 向前轉(zhuǎn)移:rel = FEH - (SJMP指令地址與目的地址差的絕對值) 向后轉(zhuǎn)移:rel = FEH - (SJMP指令地址與目的地址差的絕對值) -2 若rel = FEH,即目的地址就是SJMP指令的地址,在匯編指令中的偏移地址可用 $ 符號表示。若在程序的末尾加上SJMP $(機器碼為80 FEH),則程序就
32、不會再向后執(zhí)行,造成單指令的無限循環(huán),進入等待狀態(tài)。 4JMP A+DPTR(相對長轉(zhuǎn)移指令) 它是以數(shù)據(jù)指針DPTR的內(nèi)容為基址,以累加器A的內(nèi)容為相對偏移量,在64 KB范圍內(nèi)無條件轉(zhuǎn)移。該指令的特點是轉(zhuǎn)移地址可以在程序運行中加以改變。例如,當DPTR為確定值,根據(jù)A的不同值就可以實現(xiàn)多分支的轉(zhuǎn)移。該指令在執(zhí)行后不會改變DPTR及A中原來的內(nèi)容。例16 根據(jù)累加器A的值,轉(zhuǎn)不同處理程序的入口。 MOV DPTR,#TABLE ;表首地址送DPTR JMP A+DPTR ;根據(jù)A值轉(zhuǎn)移 TABLE:AJMP TAB1 ;當(A)=0時轉(zhuǎn)TAB1執(zhí)行 AJMP TAB2 ;當(A)=2時轉(zhuǎn)TA
33、B2執(zhí)行 AJMP TAB3 ;當(A)=4時轉(zhuǎn)TAB3執(zhí)行3.6.2 條件轉(zhuǎn)移指令 條件轉(zhuǎn)移指令是當某種條件滿足時,程序轉(zhuǎn)移執(zhí)行;條件不滿足時,程序仍按原來順序執(zhí)行。轉(zhuǎn)移的條件可以是上一條指令或更前一條指令的執(zhí)行結(jié)果(常體現(xiàn)在標志位上),也可以是條件轉(zhuǎn)移指令本身包含的某種運算結(jié)果。由于該類指令采用相對尋址,因此程序可在以當前PC值為中心的-128+127范圍內(nèi)轉(zhuǎn)移。該類指令共有8條,可以分為累加器判零條件轉(zhuǎn)移指令、比較條件轉(zhuǎn)移指令和減1條件轉(zhuǎn)移指令三類。表3.5中列出了這些指令。表3.5 條件轉(zhuǎn)移指令 1判零條件轉(zhuǎn)移指令 判零條件轉(zhuǎn)移指令以累加器A的內(nèi)容是否為0作為轉(zhuǎn)移的條件。JZ指令是為0
34、轉(zhuǎn)移,不為0則順序執(zhí)行;JNZ指令是不為0轉(zhuǎn)移,為0則順序執(zhí)行。累加器A的內(nèi)容是否為0,是由這條指令以前的其它指令執(zhí)行的結(jié)果決定的,執(zhí)行這條指令不作任何運算,也不影響標志位。 2比較轉(zhuǎn)移指令 比較轉(zhuǎn)移指令共有4條。這組指令是先對兩個規(guī)定的操作數(shù)進行比較,根據(jù)比較的結(jié)果來決定是否轉(zhuǎn)移。若兩個操作數(shù)相等,則不轉(zhuǎn)移,程序順序執(zhí)行;若兩個操作數(shù)不等,則轉(zhuǎn)移。比較是進行一次減法運算,但其差值不保存,兩個數(shù)的原值不受影響,而標志位要受到影響。利用標志位CY作進一步的判斷,可實現(xiàn)三分支轉(zhuǎn)移。 CJNE執(zhí)行流程例18 當從P1口輸入數(shù)據(jù)為01H 時,程序繼續(xù)執(zhí)行,否則等待,直到P1口出現(xiàn)01H。參考程序如下:
35、 MOV A,#01H ;立即數(shù)01H送AWAIT: CJNE A,P1,WAIT ; (P1)01H,則等待 3減1條件轉(zhuǎn)移指令 DJNZ Rn ,rel; (Rn) (Rn) -1 ;若(Rn)=0,則(PC) (PC)+2 ;若(Rn)0,則(PC) (PC)+2+rel DJNZ direct ,rel功能:每執(zhí)行一次本指令,先將指定的 Rn 或 direct 的內(nèi)容減 1 ,再判別其內(nèi)容是否為 0 。若不為 0 ,轉(zhuǎn)向目標地址;若為 0 ,則執(zhí)行 DJNZ下面的指令。這類指令在計數(shù)循環(huán)結(jié)構(gòu)程序設(shè)計時很有用。例:從 P1.7引腳輸出 5 個方波 MOV R2,#10LOOP: CPL
36、P1.7 DJNZ R2,LOOP 例19 將內(nèi)部RAM從DATA單元開始的10個無符號數(shù)相加,相加結(jié)果送SUM單元保存。 設(shè)相加結(jié)果不超過8位二進制數(shù),則相應(yīng)的程序如下: MOV R0,#0AH ;設(shè)置循環(huán)次數(shù) MOV R1,#DATA ;R1作地址指針,指向數(shù)據(jù)塊首地址 CLR A ;A清零LOOP: ADD A,R1 ;加一個數(shù) INC R1 ;修改指針,指向下一個數(shù) DJNZ R0,LOOP ;R0減1,不為0循環(huán) MOV SUM,A ;存10個數(shù)相加的和3.7 子程序調(diào)用與返回指令3.7.1 子程序調(diào)用指令子程序調(diào)用指令有長調(diào)用和絕對調(diào)用兩條,它們都是雙周期指令。 LCALL和ACA
37、LL指令類似于轉(zhuǎn)移指令LJMP和AJMP,不同之處在于它們在轉(zhuǎn)移前要把執(zhí)行完該指令的PC內(nèi)容自動壓入堆棧后,才將子程序入口地址addr16(或addr11)送PC,實現(xiàn)轉(zhuǎn)移。 LCALL與LJMP一樣提供16位地址,可調(diào)用64 KB范圍內(nèi)的子程序。由于該指令為3字節(jié),所以執(zhí)行該指令時首先應(yīng)執(zhí)行(PC)(PC)+3,以獲得下一條指令地址,并把此時的PC內(nèi)容壓入堆棧(先壓入低字節(jié),后壓入高字節(jié))作為返回地址,堆棧指針SP加2指向棧頂,然后把目的地址addr16送入PC。該指令執(zhí)行不影響標志位。 ACALL與AJMP一樣提供11位地址,只能調(diào)用與PC在同一2 KB范圍內(nèi)的子程序。由于該指令為2字節(jié)指
38、令,所以執(zhí)行該指令時應(yīng)執(zhí)行(PC)(PC)+2以獲得下一條指令地址,并把該地址壓入堆棧作為返回地址。該指令機器碼的構(gòu)成也與AJMP類似,只不過操作碼第一字節(jié)其高半字節(jié)的最后一位是1,機器碼的組成如下:a10 a9 a8 1 0 0 0 1 a7 a6 a5 a4 a3 a2 a1 a0 被調(diào)用子程序的目的地址也是由執(zhí)行 ACALL指令的當前PC值的高5位與指令中提供的11位直接地址形成。3.7.2 返回指令 返回指令共兩條:一條是對應(yīng)兩條調(diào)用指令的子程序返回指令RET,另一條是對應(yīng)從中斷服務(wù)程序的返回指令RETI。 從上述兩條指令的功能操作看,都是從堆棧中彈出返回地址送PC,堆棧指針減2,但它
39、們是兩條不同的指令。其有下面兩點不同: (1) 從使用上,RET指令必須作子程序的最后一條指令;RETI必須作中斷服務(wù)程序的最后一條指令。 (2) RETI指令除恢復斷點地址外,還恢復CPU響應(yīng)中斷時硬件自動保護的現(xiàn)場信息。執(zhí)行RETI指令后,將清除中斷響應(yīng)時所置位的優(yōu)先級狀態(tài)觸發(fā)器,使得已申請的同級或低級中斷申請可以響應(yīng);而RET指令只能恢復返回地址。3.7.3 空操作指令 NOP ;(PC)(PC)+1 空操作指令是一條單字節(jié)單周期指令。它控制 CPU不做任何操作,僅僅是消耗這條指令執(zhí)行所需要的一個機器周期的時間,不影響任何標志位,故稱為空操作指令。NOP指令在設(shè)計延時程序、拼湊精確延時時
40、間及在程序等待或修改程序等場合是很有用的。3.8 位操作類指令 位操作類指令在單片機指令系統(tǒng)中占有重要地位,這是因為單片機在控制系統(tǒng)中主要用于控制線路通、斷,繼電器的吸合與釋放等。 位操作也稱布爾變量操作,它是以位(bit)作為單位來進行運算和操作的。MCS-51單片機內(nèi)部有一個功能相對獨立的布爾處理機,它有借用進位標志CY作為位累加器,有位存儲器(即位尋址區(qū)中的各位),指令系統(tǒng)中有17條專門進行位處理的指令集。位處理指令可以完成以位為對象的數(shù)據(jù)轉(zhuǎn)送、運算、控制轉(zhuǎn)移等操作。 在位操作指令中,位地址的表示有以下不同的方法(以下均以程序狀態(tài)字寄存器PSW的第5位F0標志為例說明): (1) 直接位
41、地址表示,如D5H。 (2) 點表示(說明是什么寄存器的什么位),如PSW.5,說明是PSW的第5位。 (3) 位名稱表示,如直接用F0表示。 (4) 用戶定義名稱表示,如用戶定義用FLG這一名稱來代替F0,則在指令中允許用FLG表示F0標志位。表3.6 條件轉(zhuǎn)移指令 例20 利用位操作指令,模擬圖3.6所示硬件邏輯電路的功能。參考程序如下: PR2: MOV C,P1.1 ;(CY) (P1.1) ORL C, P1.2 ;(CY) (P1.1) (P1.2)=AANL C,P1.0 ;(CY)(P1.0)A CPL C ;(CY)(P1.0)A=B MOV F0,C ;F0內(nèi)暫存B MOV
42、 C,P1.3 ;(CY)(P1.3) ANL C,/P1.4 ;(CY)(P1.3)(P1.4)=D ORL C,F(xiàn)0 ;(CY)BD MOV P1.5,C ;運算結(jié)果送入P1.5 RET圖3.6 硬件邏輯電路圖3.9 匯編程序格式與偽指令 1匯編程序格式 匯編程序是指令系統(tǒng)的一個子集,只要指令按格式書寫就構(gòu)成了程序的基本格式。在程序中指令書寫具有如下格式: 標號: 操作碼助記符 源操作數(shù),目的操作數(shù) ;注釋 標號用在指令的前邊,必須跟:,表示符號地址。一般在程序中有特定用途的地方加標號,如轉(zhuǎn)移目標執(zhí)行指令的前面需加標號,并不是所有指令前面都需要加標號。 2偽指令 偽指令不要求計算機做任何操
43、作,也沒有對應(yīng)的機器碼,不產(chǎn)生目標程序,不影響程序的執(zhí)行,僅僅是能夠幫助進行匯編的一些指令。它主要用來指定程序或數(shù)據(jù)的起始位置,給出一些連續(xù)存放數(shù)據(jù)的地址或為中間運算結(jié)果保留一部分存儲空間以及表示源程序結(jié)束等等。不同版本的匯編語言,偽指令的符號和含義可能有所不同,但基本用法是相似的。下面介紹幾種常用的偽指令。 1) 設(shè)置目標程序起始地址偽指令ORG 格式:符號: ORG 地址(十六進制表示) 該偽指令的功能是規(guī)定其后面的目標程序或數(shù)據(jù)塊的起始地址。它放在一段源程序(主程序、子程序)或數(shù)據(jù)塊的前面,說明緊跟在其后的程序段或數(shù)據(jù)塊的起始地址就是ORG后面給出的地址。例如: ORG 2000HSTA
44、RT:MOV A,#7FH 2) 結(jié)束匯編偽指令END 格式:符號: END END是匯編語言源程序的結(jié)束標志,表示匯編結(jié)束。在END以后所寫的指令,匯編程序都不予處理。一個源程序只能有一個END命令,否則就有一部分指令不能被匯編。如果END前面加標號的話,則應(yīng)與被結(jié)束程序段的起始點的標號一致,以表示結(jié)束的是哪一個程序段。 3) 定義字節(jié)偽指令DB 格式:標號: DB 項或項表 其中項或項表指一個字節(jié)數(shù)據(jù),用逗號分開的字節(jié)數(shù)據(jù)串,或以引號括起來的字符串。該偽指令的功能是把項或項表的數(shù)據(jù)(字符串按字符順序以ASCII碼)存入從標號地址開始的連續(xù)存儲單元中。例如: ORG 2000HTAB1: D
45、B 30H,8AH,7FH,73 DB 5,A,BCD 由于ORG 2000H,所以TAB1的地址為2000H,因此,以上偽指令經(jīng)匯編后,將對2000H開始的連續(xù)存儲單元賦值:(2000H)=30H(2001H)=8AH(2002H)=7FH(2003H)=49H ;十進制數(shù)73以十六進制數(shù)存放(2004H)=35H ;35H是數(shù)字5的ASCII碼(2005H)=41H ;41H是字母A的ASCII碼(2006H)=42H ;42H是字符串BCD中B的ASCII碼(2007H)=43H ;43H是字符串BCD中C的ASCII碼(2008H)=44H ;44H是字符串BCD中D的ASCII碼 4
46、) 定義字偽指令DW 格式:標號: DW 項或項表 DW偽指令與DB相似,但用于定義字的內(nèi)容。項或項表指所定義的一個字(兩個字節(jié))或用逗號分開的字串。匯編時,機器自動按高8位先存入,低8位在后的格式排列。例如: ORG 1500HTAB2: DW 1234H,80H 匯編以后:(1500H)=12H,(1501H)=34H,(1502H)=00H, (1503H)=80H 5) 預留存儲空間偽指令DS 格式:標號: DS 表達式 該偽指令的功能是從標號地址開始,保留若干個字節(jié)的內(nèi)存空間以備存放數(shù)據(jù)。保留的字節(jié)單元數(shù)由表達式的值決定。例如: ORG 1000H DS 20H DB 30H,8FH
47、 匯編后從1000H開始,預留32(20H)個字節(jié)的內(nèi)存單元,然后從1020H開始,按照下一條DB指令賦值,即(1020H)=30H,(1021H)=8FH。 6) 等值偽指令EQU 格式:標號: EQU 項 該偽指令的功能是將指令中的項的值賦予EQU前面的標號。項可以是常數(shù)、地址標號或表達式。例如:TAB1: EQU 1000HTAB2: EQU 2000H 匯編后TAB1、TAB2分別具有值1000H、2000H。 用EQU偽指令對某標號賦值后,該標號的值在整個程序中不能再改變。 7) 位地址定義偽指令BIT 格式:標號: BIT 位地址 該偽指令的功能是將位地址賦予BIT前面的標號,經(jīng)賦
48、值后可用該標號代替BIT后面的位地址。例如:PLG:BIT F0AI: BIT P1.0 經(jīng)以上偽指令定義后,在程序中就可以把FLG和AI作為位地址來使用。3.10 匯編程序設(shè)計示例3.10.1 算術(shù)、邏輯處理程序 例21 將一個雙字節(jié)數(shù)存入片內(nèi)RAM。 設(shè)該待存雙字節(jié)數(shù)高字節(jié)在工作寄存器R2中,低字節(jié)在累加器A中,要求高字節(jié)存入片內(nèi)RAM的36H單元,低字節(jié)存入35H單元,則相應(yīng)的參考程序如下:MOV R0,#35H ;R0作指向片內(nèi)RAM單元的地址指針,先指向35H 單元MOV R0,A ;低字節(jié)存入35H單元INC R0 ;使R0指向36H單元XCH A,R2 ;R2與A的內(nèi)容交換,待存
49、高字節(jié)交換到A中MOV R0,A ;高字節(jié)存入36H單元,A的內(nèi)容未受影響XCH A,R2 ;R2與A的內(nèi)容再次交換,兩者的內(nèi)容恢復原狀 例22 多字節(jié)無符號數(shù)相加。 設(shè)被加數(shù)與加數(shù)分別在以ADR1與ADR2為初址的片內(nèi)數(shù)據(jù)存儲器區(qū)域中,自低字節(jié)起,由低到高依次存放;它們的字節(jié)數(shù)為L,要求加得的和放回被加數(shù)的單元。流程框圖如圖3.7所示。圖3.7 例22的程序流程框圖 參考程序如下: MOV R0,#ADR1 MOV R1,#ADR2 MOV R2,#L CLR CLOOP: MOV A,R0;通過R0間址,取得被加數(shù)的一 ;個字節(jié) ADDC A,R1;通過R1間址,取得加數(shù)的一個字 ;節(jié),與
50、被加數(shù)的相應(yīng)字節(jié)相加 MOV R0,A ;加得的和通過R0間址放回原被;加數(shù)單元INC R0 ;修改指針,指向下一個相加的數(shù)INC R1DJNZ R2,LOOP;循環(huán)實現(xiàn)多字節(jié)數(shù)相加 例23 將R1、R2、R3、R4四個工作寄存器中的BCD碼數(shù)據(jù)依次相加,要求中間計算結(jié)果與最后的和都仍為BCD碼,且存入片內(nèi)RAM。 設(shè)四個工作寄存器中的BCD碼數(shù)據(jù)相加后其和仍為2位BCD碼,無溢出;(R1)+(R2)后的和存入片內(nèi)RAM的30H單元,再加(R3)后的和存入31H單元,總的和存入32H單元。則主程序為:ORG 0050HMOV R0,#30H MOV A,R1ADD A,R2 ;(R1)+(R2
51、)ACALL SUB ;調(diào)用子程序進行BCD調(diào)整,并存和ADD A,R3 ;(R1)+(R2)+(R3)ACALL SUBADD A,R4 ;(R1)+(R2)+(R3)+(R4)ACALL SUB 子程序為: ORG 01A0H ;十進制調(diào)整與存和子程序 SUB:MOV R7,A ;保護累加器A的內(nèi)容,以便返回主程序繼續(xù)使用 DA A MOV R0,A ;把當前和調(diào)整成BCD碼后存入R0所指單元 INC R0 ;調(diào)整地址指針 MOV A,R7 ;恢復累加器A的內(nèi)容,使A中仍為調(diào)用子程序時的和 RET ;返主 例24 使雙字節(jié)數(shù)依次右移1位。 設(shè)該雙字節(jié)數(shù)的高字節(jié)已在工作寄存器R2中,低字節(jié)已
52、在累加器A中,則下列程序可滿足要求: SETB C ;C預置1 XCH A,R2 ;R2與A內(nèi)容交換,高字節(jié)進A JB A.7,ELSE ;A.7(原R2第7位)為1轉(zhuǎn),否則C清零 CLR C ELSE:RRC A ;A(原R2內(nèi)容)帶C循環(huán)右移1位,移位后原R2第7位的值 ;保持不變,原R2零位則進C XCH A,R2 ;移位后原R2內(nèi)容自A交換回R2,A內(nèi)容自R2交換回A, ;準備移位 RRC A ;低字節(jié)帶C(原R2零位)循環(huán)右移1位,A.0則移入C后丟失 依次右移1位相當于原數(shù)除以2。程序中開始時將C置1,以后又根據(jù)R2第7位是否為1而進行分支,目的是用C的值使R2第7位保持不變,使該
53、程序段可適合于處理帶符號的雙字節(jié)數(shù)。 例25 多字節(jié)數(shù)求補。 設(shè)該多字節(jié)數(shù)由低字節(jié)到高字節(jié)依次存放在片內(nèi)RAM的以30H為起始地址的區(qū)域中,求補后放回原處,則相應(yīng)的程序為: ORG 1000H MOV R2,#LH ;R2作循環(huán)計數(shù)器,放置待處理字節(jié)數(shù) MOV R0,#30H ;R0作為地址指針,指向待處理首數(shù)的地址 MOV A,R0 ;自片內(nèi)RAM 30H單元取最低字節(jié) CPL A ;最低字節(jié)取反 ADD A,#1 ;求補時最低字節(jié)取反后再加1 MOV R0,A ;最低字節(jié)取反后送存 DEC R2 ;已處理一個字節(jié),待處理字節(jié)數(shù)減1NEXT:INC R0 ;調(diào)整地址指針,指向下一個字節(jié) MO
54、V A,R0 ;取下一個字節(jié) CPL A ;非最低字節(jié)求補時只需取反 ADDC A,#0 ;本條指令真正用意是計及處理前一個字節(jié)時可能有的進位 MOV R0,A ;本字節(jié)處理后送存 DJNZ R2,NEXT ;循環(huán)處理多字節(jié)求補 例26 統(tǒng)計自P1口輸入的字串中正數(shù)、負數(shù)、零的個數(shù)。 設(shè)R0、R1、R2三個工作寄存器分別為統(tǒng)計正數(shù)、負數(shù)、零的個數(shù)的計數(shù)器。完成本任務(wù)的流程框圖如圖3.8所示。圖3.8 例26流程框圖 參考程序如下: START:CLR A MOV R0,A MOV R1,A MOV R2,A ENTER:MOV A,P1 ;自P1口取一個數(shù) JZ ZERO ;該數(shù)為0,轉(zhuǎn)ZER
55、O JB P1.0,NEG ;該數(shù)為負,轉(zhuǎn)NEG INC R0 ;該數(shù)不為0、不為負,則必為正數(shù),R0內(nèi)容加1 SJMP ENTER ;循環(huán)自P1口取數(shù) ZERO: INC R2 ;零計數(shù)器加1 SJMP ENTER NEG: INC R1 ;負數(shù)計數(shù)器加1 SJMP ENTER 例27 雙字節(jié)無符號數(shù)乘法子程序設(shè)計。 算法:兩個雙字節(jié)無符號數(shù)分別放在R7、R6和R5、R4中。由于MCS-51單片機指令中只有8位數(shù)的乘法指令MUL,用它來實現(xiàn)雙字節(jié)數(shù)乘法時,可把乘數(shù)分解為: (R7)(R6) = (R7) 28 + (R6) (R5)(R4) = (R5) 28+(R4)則這兩個數(shù)的乘積可表示
56、為: (R7)(R6)(R5)(R4) = (R7) 28 + (R6) (R5) 28 + (R4) = (R7) (R5) 216 + (R7) (R4) 28 + (R6) (R5) 28 + (R6) (R4) = (R04) (R03) (R02) (R01) 顯然,我們將(R6) (R4)放入(R02) (R01)中,將(R7) (R4)和(R6) (R5)累加到(R03) (R02)中,再將(R7) (R5) 累加到(R04) (R03)中即可得到乘積結(jié)果。 入口:(R7 R6)=被乘數(shù),(R5 R4)=乘數(shù),(R0)=乘積的低位字節(jié)地址指針。 出口:(R0)=乘積的高位字節(jié)地址
57、指針,指向32位積的高8位。 工作寄存器:R3、R2存放部分積,R1存放進位位。程序清單如下:MUL1:MOV A,R6 ;取被乘數(shù)的低字節(jié)到A MOV B,R4 ;取乘數(shù)的低字節(jié)到B MUL AB ;(R6) (R4) MOV R0,A ;R01存乘積低8位 MOV R3,B ;R3暫存(R6) (R4)的高8位 MOV A,R7 ;取被乘數(shù)的高字節(jié)到A MOV B,R4 ;取乘數(shù)的低字節(jié)到B MUL AB ;(R7) (R4) ADD A,R3 ;(R7) (R4)低8位加(R3) MOV R3,A ;R3暫存28部分項低8位 MOV A,B ;(R7) (R4)高8位送AADDC A,#
58、00H ;(R7) (R4)高8位加進位位CY MOV R2,A ;R2暫存28部分項高8位 MOV A,R6 ;取被乘數(shù)的低字節(jié)到A MOV B,R5 ;取乘數(shù)的高字節(jié)到B MUL AB ;(R6) (R5) ADD A,R3 ;(R6) (R5)低8位加(R3) INC R0 ;調(diào)整R0地址為R02單元 MOV R0,A ;R02存放乘積158位結(jié)果 MOV R1,#00H ;清暫存單元 MOV A,R2 ADDC A,B ;(R6) (R5)高8位加(R2)與CY MOV R2,A ;R2暫存28部分項高8位 JNC NEXT ;28項向216項無進位則轉(zhuǎn)移 INC R1 ;有進位則R1
59、置1標記NEXT:MOV A,R7 ;取被乘數(shù)高字節(jié) MOV B,R5 ;取乘數(shù)高字節(jié) MUL AB ;(R7) (R5) ADD A,R2 ;(R7) (R5)低8位加(R2) INC R0 ;調(diào)整R0地址為R03單元 MOV R0,A ;R03存放乘積2316位結(jié)果 MOV A,B ADDC A,R1 ;(R7) (R5)高8位加28項進位 INC R0 ;調(diào)整R0地址為R04單元 MOV R0,A ;R04存放乘積3124位結(jié)果 RET3.10.2 數(shù)制轉(zhuǎn)換程序 例28 將某8位二進制數(shù)轉(zhuǎn)換為BCD碼。 設(shè)8位二進制數(shù)已在A中,轉(zhuǎn)換后存于片內(nèi)RAM的20H、21H單元。程序如下: MOV
60、 B,#100 DIV AB ;該8位二進制數(shù)除100,在A中得商,也即轉(zhuǎn)換為BCD碼后 ;的百位數(shù) MOV R0,#21H ;R0指向21H單元 MOV R0,A ;百位數(shù)存入片內(nèi)RAM的21H單元 DEC R0 ;調(diào)整R0指向20H單元 MOV A,#10 XCH A,B ;該8位二進制數(shù)除100所得余數(shù)自B交換到A,A中的10 ;交換進B DIV AB ;除100所得余數(shù)進一步除10,在A中得轉(zhuǎn)換為BCD碼后的 ;十位數(shù);在B中得余數(shù),也即轉(zhuǎn)換為BCD碼后的個位數(shù) SWAP A ;A中BCD碼的十位數(shù)調(diào)整到A的高半字節(jié),原高半字節(jié)的 ;零則調(diào)整到低半字節(jié) ADD A,B ;A中高半字節(jié)的
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年西寧從業(yè)資格證貨運考試試題
- 建筑設(shè)計咨詢合同
- 2025年拉薩道路運輸從業(yè)資格證考試內(nèi)容是什么
- 2025年陽泉年貨運從業(yè)資格證考試答案
- 變壓器安裝承包合同
- 中小學老師聘用合同
- 安裝工程分包合同范本與安裝工程合作合同6篇
- 2025年雙鴨山貨運從業(yè)資格證考試模擬考試題庫
- PVA膜產(chǎn)業(yè)分析報告
- 養(yǎng)殖用地變更合同范本
- 借哪吒精神燃開學斗志 開學主題班會課件
- 2025年初中主題班會課件:好習慣成就好人生
- 學校教職工代表大會全套會議會務(wù)資料匯編
- 中華人民共和國監(jiān)察法宣貫培訓
- 2025年山東傳媒職業(yè)學院高職單招高職單招英語2016-2024歷年頻考點試題含答案解析
- 2025年春新教科版物理八年級下冊課件 第10章 流體的力現(xiàn)象 1 在流體中運動
- 《愛耳日課件》課件
- GB/T 45107-2024表土剝離及其再利用技術(shù)要求
- 幼兒園安全教育課件:《危險的小圓珠》
- 2020華夏醫(yī)學科技獎知情同意報獎證明
- 素描石膏幾何體
評論
0/150
提交評論