![《單片微型計算機原理及應用》課件第2章_第1頁](http://file4.renrendoc.com/view12/M0A/29/1E/wKhkGWdQJ02AD0_vAAOajqjDfpA844.jpg)
![《單片微型計算機原理及應用》課件第2章_第2頁](http://file4.renrendoc.com/view12/M0A/29/1E/wKhkGWdQJ02AD0_vAAOajqjDfpA8442.jpg)
![《單片微型計算機原理及應用》課件第2章_第3頁](http://file4.renrendoc.com/view12/M0A/29/1E/wKhkGWdQJ02AD0_vAAOajqjDfpA8443.jpg)
![《單片微型計算機原理及應用》課件第2章_第4頁](http://file4.renrendoc.com/view12/M0A/29/1E/wKhkGWdQJ02AD0_vAAOajqjDfpA8444.jpg)
![《單片微型計算機原理及應用》課件第2章_第5頁](http://file4.renrendoc.com/view12/M0A/29/1E/wKhkGWdQJ02AD0_vAAOajqjDfpA8445.jpg)
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第2章單片機指令系統(tǒng)2.1MCS—51單片機匯編語言與指令格式2.2尋址方式2.3MCS—51單片機指令系統(tǒng)2.1MCS—51單片機匯編語言與指令格式2.1.1單片機的匯編語言由于構成計算機的電子器件特性所決定,計算機只能識別二進制代碼。這種以二進制代碼來描述指令功能的語言,稱之為機器語言,用機器語言組成的程序,稱為目標程序。計算機就是按照機器語言的指令來完成各種功能操作的,它具有程序簡捷、占用存儲空間小、執(zhí)行速度快、控制功能強等特點。2.1.2指令格式
MCS—51單片機匯編語言指令的標準格式如下:
[標號:]操作碼[目的操作數][,源操作數][;注釋]例如:LOOP:ADD#A,#10H;(A)←(A)+10H(1)方括號[]表示該項是可選項,可有可無。
(2)標號是用戶設定的符號,它實際代表該指令所在的地址。標號必須以字母開頭,其后跟1~8個字母或數字,并以“:”結尾。(3)操作碼是用英文縮寫的指令功能助記符。它確定了本條指令完成什么樣的操作功能。如:ADD表示加法操作。任何一條指令都必須有該助記符項,不得省略。
(4)目的操作數提供操作的對象,并指出一個目標地址,表示操作結果存放單元的地址,它與操作碼之間必須以一個或幾個空格分隔。如上例中A表示操作對象是累加器A的內容,并指出操作結果又回送A存放。(5)源操作數指出的是一個源地址(或立即數),表示操作的對象或操作數來自何處。它與目的操作數之間要用“,”號隔開。
(6)注釋部分是在編寫程序時,為了增加程序的可讀性,由用戶擬寫對該條指令或該段程序功能的說明。它以分號“;”開頭,可以用中文、英文或某些符號來表示,顯然它不存入計算機,只出現在源程序中。2.1.3指令中常用符號在分類介紹各類指令之前,先對描述指令的一些符號意義進行一些簡單約定:(1)Ri和Rn:R表示當前工作寄存器區(qū)中的工作寄存器,i表示0或1,即R0和R1。n表示0~7,即R0~R7,當前工作寄存器的選定是由PSW的RS1和RS0位決定的。
(2)#data:#表示立即數,data為8位常數。#data是指包含在指令中的8位立即數。
(3)#data16:包含在指令中的16位立即數。
(4)rel:相對地址,以補碼形式表示的地址偏移量,范圍為-128~+127,主要用于無條件相對短轉移指令SJMP和所有的條件轉移指令中。
(5)addr16:16位目的地址。目的地址可在全部程序存儲器的64KB空間范圍內,主要用于無條件長轉移指令LJMP和子程序長調用指令LCALL中。
(6)addr11:11位目的地址。目的地址應與下條指令處于相同的2KB程序存儲器地址空間范圍內,主要用于絕對轉移指令AJMP和子程序絕對調用指令ACALL指令中。(7)direct:表示直接尋址的地址,即8位內部數據存儲器RAM的單元地址(0~127/255),或特殊功能寄存器SFR的地址。對于SFR可直接用其名稱來代替其直接地址。
(8)bit:內部數據存儲器RAM和特殊功能寄存器SFR中的可直接尋址位地址。
(9)@:間接尋址寄存器或基地址寄存器的前綴,如@Ri,@DPTR,表示寄存器間接尋址。(10)(X):表示X中的內容。
(11)((X)):表示由X尋址的單元中的內容,即(X)作地址,該地址的內容用((X))表示。
(12)/和→符號:/表示對該位操作數取反,但不影響該位的原值?!硎局噶畈僮髁鞒?將箭頭一方的內容,送入箭頭另一方的單元中去。
2.2尋址方式
2.2.1寄存器尋址選定某寄存器,自該寄存器中讀取或存放操作數,以完成指令規(guī)定的操作,稱為寄存器尋址。例如:MOVA,R0;(A)←(R0)
該指令的功能是把工作寄存器R0中的內容傳送到累加器A中,如:R0內容為FFH,則執(zhí)該指令后A的內容也為FFH。在該條指令中,源操作數和目的操作數是由尋址R0和A寄存器得到的,故屬于寄存器尋址。該指令為單字節(jié)指令,機器代碼為E8H。2.2.2立即尋址操作數直接出現在指令中,它緊跟在操作碼的后面,作為指令的一部分與操作碼一起存放在程序存儲器內,可以立即得到并執(zhí)行,不需要另去寄存器或存儲器等處尋找和取數,故稱為立即尋址。該操作數稱為立即數,并在其前冠以“?!碧栕髑熬Y,以表示并非地址。立即數可以是8位或16位,用十六進制數表示。
例如:MOVA,#0FH;(A)←0FH
該指令的功能是將立即數0FH傳送到累加器A中,對應的機器碼為74H。它隱含了寄存器尋址累加器A方式,長一個字節(jié),占用一個存儲單元;立即數0FH緊跟在操作碼之后,成為指令代碼的一部分,長也是一個字節(jié),占用緊跟在后面的另一個存儲單元。故該指令為雙字節(jié)指令,其機器碼為74H0FH。2.2.3寄存器間接尋址由指令指出某一個寄存器的內容作為操作數地址的尋址方法,稱為寄存器間接尋址方法,簡稱寄存器間址。這里要強調的是:寄存器的內容不是操作數本身,而是操作數地址。
寄存器間接尋址使用所選定寄存器區(qū)中的R0和R1作為地址指針(對堆棧操作時,使用堆棧指針SP),來尋址片內數據存儲器RAM(00~FFH)的256個單元,但它不能訪問特殊功能寄存器SFR。寄存器間接尋址也適用于訪問外部數據存儲器,此時,用R0、R1或DPTR作為地址指針。寄存器間接尋址用符號“@”指明。圖2―1寄存器間接尋址示意圖2.2.4直接尋址指令中直接給出操作數所在的存儲器地址,以供尋址取數或存數的尋址方式稱為直接尋址。例如:MOVA,40H;(A)←(40H)
該指令的功能是把內部數據存儲器RAM40H單元內的內容送到累加器A。指令直接給出了源操作數的地址40H。該指令的機器碼為E5H40H。2.2.5變址尋址基址寄存器加變址寄存器間接尋址,簡稱變址尋址。它以數據指針DPTR或程序計數器PC作為基址寄存器,累加器A作為變址寄存器,兩者的內容相加形成16位程序存儲器地址,該地址就是操作數所在地址。例如:MOVCA,@A+DPTR;(A)←((A)+(DPTR))
該指令尋址及操作功能如圖2―2所示,該指令為單字節(jié)指令,機器代碼為93H。這種尋址方式常用于訪問程序存儲器中的常數表。圖2―2變址尋址示意圖2.2.6相對尋址相對尋址是以當前程序計數器PC值加上指令規(guī)定的偏移量rel,而構成實際操作數地址的尋址方法。它用于訪問程序存儲器,常出現在相對轉移指令中。在使用相對尋址時要注意以下兩點:
第一,當前PC值是指相對轉移指令所在地址(一般稱為源地址)加上轉移指令字節(jié)數。即:當前PC值=源地址+轉移指令字節(jié)數。例如:JZrel是一條累加器A為零就轉移的雙字節(jié)指令。若該指令地址(源地址)為2050H,則執(zhí)行該指令時的當前PC值即為2052H。
第二,偏移量rel是有符號的單字節(jié)數,以補碼表示,其相對值的范圍是-128~+127(即00H~FFH),負數表示從當前地址向上轉移,正數表示從當前地址向下轉移。所以,相對轉移指令滿足條件后,轉移的地址(一般稱為目的地址)應為:目的地址=當前PC值+rel=源地址+轉移指令字節(jié)數+rel
例如:指令JZ08H和JZ0F4H表示累加器A為零條件滿足后,從源地址(2050H)分別向下、向上轉移10個單元。其相對尋址示意如圖2―3(a)、(b)所示。這兩條指令均為雙字節(jié)指令,機器代碼分別為:60H08H和60HF4H。
圖2―3相對尋址示意圖(a)指令JZ08H尋址示意圖;(b)指令JZF4H尋址示意圖2.2.7位尋址
MCS—51系列單片機具有位尋址的功能,即指令中直接給出位地址,可以對內部數據存儲器RAM中的128位和特殊寄存器SFR中的93位進行尋址,并且位操作指令可對地址空間的每一位進行傳送及邏輯操作。例如:SETBPSW.3;(PSW.3)←1
該指令的功能是給程序狀態(tài)字PSW中的RS0置1。該指令為雙字節(jié)指令,機器代碼為D2HD3H,指令的第二字節(jié)直接給出位地址D3H(PSW.3的位地址)。
綜上所述,在MCS—51系列單片機的存儲空間中,指令究竟對哪個存儲器空間進行操作是由指令操作碼和尋址方式確定的。7種尋址方式如表2―1所示。表2―17種尋址方式及使用空間2.3MCS—51單片機指令系統(tǒng)MCS—51單片機指令系統(tǒng)分為:數據傳送類指令、算術運算類指令、邏輯運算及移位類指令、控制轉移類指令和位操作(布爾操作)指令5大類,共計111條指令。現按其分類分別介紹各條指令的格式、功能、對狀態(tài)標志的影響以及應用。2.3.1數據傳送類指令數據傳送類指令共29條,它是指令系統(tǒng)中最活躍、使用最多的一類指令。一般的操作是把源操作數傳送到目的操作數,即指令執(zhí)行后目的操作數改為源操作數,而源操作數保持不變。若要求在進行數據傳送時,不丟失目的操作數,則可以用交換型傳送指令。
數據傳送類指令不影響進位標志CY、半進位標志AC和溢出標志OV,但當傳送或交換數據后影響累加器A的值時,奇偶標志P的值則按A的值重新設定。按數據傳送類指令的操作方式,又可把傳送類指令分為3種類型:數據傳送、數據交換和堆棧操作,并使用8種助記符:MOV、MOVX、MOVC、XCH、XCHD、SWAP、PUSH及POP。表2―2給出了各種數據傳送指令的操作碼助記符和對應的操作數。表2―2數據傳送類指令助記符與操作1.內部數據存儲器間數據傳送指令
內部數據存儲器RAM區(qū)是數據傳送最活躍的區(qū)域,可用的指令數也最多,共有16條指令,指令操作碼助記符為MOV。內部RAM之間源操作數傳遞關系如圖2―4所示。為了便于理解指令功能,我們按源操作數的尋址方式逐一介紹各條指令。
(1)立即尋址。在該尋址方式下,內部RAM區(qū)數據傳送指令有如下5條指令。圖2―4內部RAM間數據傳遞關系操作碼助記符目的操作數源操作數功能注釋機器代碼(H)MOVA,#data;(A)←#data,74dataMOVdirect,#data;(direct)←#data,75directdata
MOV@Ri,#data;((Ri))←#data,76~77dataMOVRn,#data;(Rn)←#data,78~7FdataMOVDPTR,#data16;(DPTR)←#data16,90data15~8data7~0
這組指令表明,8位立即數可以直接傳送到內部數據區(qū)RAM的各個位置,并且可把16位立即數直接裝入數據指針DPTR。把立即數送入累加器A的傳送指令在2.2.2節(jié)中已作了介紹,其它指令的功能及應用舉例如下:①MOVdirect,#data;(direct)←#data#,75directdata
該指令的功能是把立即數傳送到內部數據存儲器RAM的00H~7FH,以及特殊功能寄存器SFR的各單元中去,它為三字節(jié)指令。例如把立即數40H傳送到RAM的30H單元和P1口(口地址為90H),可采用如下指令:MOV30H,#40H;(30H)←#40H,753040MOVP1,#40H;(90H)←#40H,759040②MOV@Ri,#data;((Ri))←#data,76~77data
該指令的功能是把立即數傳送到由R0和R1寄存器的內容指出的片內數據存儲器RAM的單元中去(MCS—51系列為00H~7FH,MCS—52系列為00H~FFH)。
MOVR0,#30H;(R0)←#30H,7830MOV@R0,#40H;((R0))←#40H,7640
③MOVRn,#data;(Rn)←#data,78~7Fdata
該指令的功能是把立即數傳送到內部寄存器R0~R7中去,該指令為雙字節(jié)指令,機器代碼為:④MOVDPTR,#data16;(DPTR)←#data16,90data15~8data7~0
該指令的功能是把16位立即數裝入數據指針DPTR中去。它是MCS—51系列單片機指令系統(tǒng)中唯一的一條16位數據傳送指令。該指令為三字節(jié)指令,第一字節(jié)為90H,第二字節(jié)為高8位立即數,第三字節(jié)為低8位立即數。例如:MOVDPTR,#1234H指令執(zhí)行后,DPTR寄存器的高8位寄存器DPH的內容為12H,低8位寄存器DPL內容為34H。該指令的機器代碼為90H12H34H。(2)寄存器尋址。在該尋址方式下,內部RAM區(qū)數據傳送指令有以下5條:MOVdirect,A#;(direct)←(A),F5directMOV@Ri,A;((Ri))←(A),F6~F7MOVRn,A;(Rn)←(A),F8~FFMOVA,Rn;(A)←(Rn),E8~EFMOVdirect,Rn;(direct)←(Rn),88~8Fdirect
這組指令的功能是把累加器A的內容傳送到內部數據區(qū)RAM的各個單元,或者把指定工作寄存器R0~R7中的內容傳送到累加器A或direct所指定的片內RAM的00H~7FH單元或特殊功能寄存器SFR中去。但不能用這類指令在內部工作寄存器之間直接傳送。例如:不存在MOVR1,R2這樣的指令。(3)直接尋址。在該尋址方式下,內部RAM區(qū)數據傳送指令有如下4條指令:MOVA,direct;(A)←(direct),E5directMOVRn,direct;(Rn)←(direct),A8~AFdirectMOV@Ri,direct;((Ri))←(direct),A6~A7directMOVdirect2,direct1;(direct2)←(direct1),85direct1direct2
這組指令將直接地址所規(guī)定的內部RAM單元(片內RAM的00H~7FH,SFR的80H~FFH單元)內容傳送到累加器A,寄存器Rn,并能實現內部數據寄存器RAM之間、特殊功能寄存器SFR之間或SFR與內部RAM之間的直接數據傳遞。直接傳遞不需要通過累加器A或者工作寄存器來間接傳送,從而提高了數據傳送的效率。
例如:MOVP2,P1;(P2)←(P1),8590A0
該指令的功能是不通過其它寄存器,直接把P1口(口地址90H)的內容傳送到P2口(口地址A0H)輸出,提高了效率。該指令為三字節(jié)指令,機器代碼為85H90HA0H。(4)寄存器間接尋址。在該尋址方式下,內部RAM區(qū)數據傳送指令有以下兩條:MOVA,@Ri;(A)←((Ri)),E6~E7MOVdirect,@Ri;(direct)←((Ri)),86~87direct
這組指令把以Ri的內容作為地址進行尋址所得到單元的內容,傳送到累加器A或direct指定的片內RAM區(qū)單元。
例如:設內部RAM(30H)=40H,(40H)=10H,(10H)=00H,端口(P1)=CAH,分析以下程序執(zhí)行后各單元及寄存器、P2口的內容。
MOVR0,#30H;(R0)←30H,7830MOVA,@R0;(A)←((R0)),E6MOVR1,A;(R1)←(A),F9MOVB,@R1;(B)←((R1)),87F0MOV@R1,P1;((R1))←(P1),A790MOVP2,P1;(P2)←(P1),8590A0MOV10H,#20H;(10H)←20H,751020
2.外部數據存儲器數據傳送指令
MCS—51單片機CPU對片外擴展的數據存儲器RAM或I/O口進行數據傳送,必須采用寄存器間接尋址的方法,通過累加器A來完成。一般數據的傳送是通過P0口和P2口完成的,即片外RAM地址總線低8位由P0口送出,高8位由P2口送出,數據總線(8位)也由P0口傳送(雙向),但與低8位地址總線是分時傳送的。這類數據傳送指令共有以下4條單字節(jié)指令,指令操作碼助記符標志為MOVX。MOVXA,@DPTR;(A)←((DPTR)),E0MOVXA,@Ri;(A)←((Ri)),E2~E3MOVX@DPTR,A;((DPTR))←(A),F0MOVX@Ri,A;((Ri))←(A),F2~F3
例如:設外部RAM(0203H)=FFH,分析以下指令執(zhí)行后的結果。
MOVDPTR,#0203H;(DPTR)←0203H,900203MOVXA,@DPTR;(A)←((DPTR)),E0MOV30H,A;(30H)←(A),F530MOVA,#0FH;(A)←0FH,740FMOVX@DPTR,A;((DPTR))←(A),F0
執(zhí)行結果為:(DPTR)=0203H,(30H)=FFH,(0203H)=(A)=0FH。3.程序存儲器向累加器A傳送數據指令程序存儲器向累加器A傳送數據指令,又稱查表指令。它采用變址尋址方式,把程序存儲器(ROM或EPROM)中存放的表格數據讀出,傳送到累加器A。它共有如下兩條單字節(jié)指令,指令操作碼助記符為MOVC。MOVCA,@A+DPTR;(A)←((A)+(DPTR)),93MOVCA,@A+PC;(PC)←(PC)+1,(A)←((A)+(PC)),83
例1:在外部ROM/EPROM中,從2000H單元開始依次存放0~9的平方值:0、1、4、9、…、81,要求依據累加器A中的值(0~9)來查找所對應的平方值,分析下述程序的結果。
MOVDPTR,#2000H;(DPTR)←2000H,902000MOVA,#09H;(A)←09H,7409MOVCA,@A+DPTR;(A)←((A)+(DPTR)),93
執(zhí)行結果:(DPTR)=2000H,(A)=51H(81的十六進制數)。
后一條指令是以PC作為基址寄存器,CPU取完該指令操作碼時PC會自動加1,指向下一條指令的第一個字節(jié)地址,即此時是用(PC)+1作為基址的,目標地址為(A)+(PC)+1。另外,由于累加器A中的內容為8位無符號整數,這就使得本指令查表范圍只能在以PC當前值開始后的256個字節(jié)范圍內(即(PC)+1H~(PC)+100H),使表格地址空間分配受到限制。同時編程時還需進行偏移量的計算,即MOVCA,@A+PC指所在地址與表格存放首地址間的距離量計算,并需要一條加法指令ADD進行地址調整(關于ADD指令將在2.3.2節(jié)介紹)。偏移量計算公式為:
偏移量=表首地址-(MOVC指令所在地址+1)
例2:仍以例1外部ROM/EPROM2000H單元開始存放0~9的平方值,以PC作為基址寄存器進行查表。解:設MOVC指令所在地址(PC)=1FF0H,則偏移量=2000H-(1FF0H+1)=0FH
相應的程序如下:MOVA,#09H;(A)←09H,7409ADDA,#0FH;地址調整,240FMOVCA,@A+PC;(A)←((A)+(PC)+1),83
執(zhí)行結果為:(PC)=1FF1H,(A)=51H。4.數據交換指令數據傳送類指令一般都用來將操作數自源地址傳送到目的地址,指令執(zhí)行后,源地址的操作數不變,目的地址的操作數則修改為源地址的操作數。而數據交換指令其數據作雙向傳送,涉及傳送的雙方互為源地址、目的地址,指令執(zhí)行后各方的操作數都修改為另一方的操作數。因此,兩操作數均未沖掉、丟失。數據交換類指令共有如下5條指令:XCHA,direct;(A)(direct),C5directXCHA,@Ri;(A)((Ri)),C6~C7XCHA,Rn;(A)(Rn),C8~CFXCHDA,@Ri;(A3~0)((Ri)3~0),D6~D7SWAPA;(A7~4)(A3~0),C4
例3:設(R0)=30H,(30H)=4AH,(A)=28H,則:
執(zhí)行XCHA,@R0;結果為:(A)=4AH,(30H)=28H
執(zhí)行XCHDA,@R0;結果為:(A)=2AH,(30H)=48H
執(zhí)行SWAPA;結果為:(A)=82H5.堆棧操作類指令堆棧操作有進棧和出棧操作,即壓入和彈出數據,常用于保存或恢復現場。該類指令共有如下兩條指令:(SP)←(SP)+1((SP))←(direct)(direct)←((SP))(SP)←(SP)-1C0directPUSHdirectPOPdirectD0direct
例4:若在外部ROM/EPROM中2000H單元開始依次存放0~9的平方值,數據指針(DPTR)=3A00H,用查表指令取出2003H單元的數據后,要求保持DPTR中的內容不變。完成以上功能的程序如下:MOVA,#03H;(A)←03H,7403PUSHDPH;保護DPTR高8位入棧,C083PUSHDPL;保護DPTR低8位入棧,C082MOVDPTR,#2000H;(DPTR)←2000H,902000MOVCA,@A+DPTR;(A)←(2000H+03H),93POPDPL;彈出DPTR低8位,D082POPDPH;彈出DPTR高8位,(先進后出),832.3.2算術運算類指令算術運算類指令共有24條,可分為加法、帶進位加法、帶借位減法、加1減1,乘除及十進制調整指令共6組。它主要完成加、減、乘、除四則運算,以及增量、減量和二—十進制調整操作,對8位無符號數可進行直接運算;借助溢出標志,可對帶符號數進行2的補碼運算;借助進位標志,可進行多字節(jié)加減運算,也可以對壓縮BCD碼(即單字節(jié)中存放兩位BCD碼)進行運算。1.加法指令加法指令共有如下4條指令,操作數助記符為ADD。
ADDA,#data;(A)←(A)+#data,24dataADDA,direct;(A)←(A)+(direct),25directADDA,@Ri;(A)←(A)+((Ri)),26~27ADDA,Rn;(A)←(A)+(Rn),28~2F
這4條指令使得累加器A可以和內部RAM的任何一個單元的內容進行相加,也可以和一個8位立即數相加,相加結果存放在A中。無論是哪一條加法指令,參加運算的都是兩個8位二進制數。對用戶來說,這些8位數可當作無符號數(0~255),也可以當作帶符號數(-128~+127),即補碼數。例如:對于二進制數11010011,用戶可認為它是無符號數,即為十進制數211,也可以認為它是帶符號數,即為十進制負數-45。但計算機在作加法運算時,總按以下規(guī)定進行:(1)在求和時,總是把操作數直接相加,而無須任何變換。例如,若A=11010011B,R1=11101000B,執(zhí)行指令ADDA,R1時,其算式表達為:11010011+11101000110111011
相加后(A)=10111011B。若認為是無符號相加,則A的值代表十進制數187;若認為是帶符號補碼數相加,則A的值為十進制負數-69。
(2)在確定相加后進位標志CY的值時,總是把兩個操作數作為無符號數直接相加而得出進位CY值。如上例中,相加后CY=1。若為無符號數相加CY代表十進制數256,但若是兩個帶符號數相加,CY沒有意義。
(3)在確定相加后溢出標志OV的值時,計算機總是把操作數當作帶符號數來對待。在作加法運算時,一個正數和一個負數相加是不可能產生溢出的,只有兩個同符號數相加才有可能產生溢出,表示運算結果出錯。(4)加法指令還會影響半進位標志和奇偶標志P。在上述例子中,由于D3相加對D4沒有進位,所以AC=0,而由于運算結果A中1的數目為偶數,故P=0。例如:設(A)=49H,(R0)=6BH,
執(zhí)行指令:ADDA,R0;(A)←(A)+(R0),28
結果為:(A)=B4H,OV=1,CY=0,AC=1,P=0。2.帶進位加法指令帶進位加法指令有如下4條指令,其助記符為ADDC。ADDCA,#data;(A)←(A)+(CY)+#data,34dataADDCA,direct;(A)←(A)+(CY)+(direct),35directADDCA,@Ri;(A)←(A)+(CY)+((Ri)),36~37ADDCA,Rn;(A)←(A)+(CY)+(Rn),38~3F
例如:設(A)=C3H,數據指針低位(DPL)=ABH,CY=1
執(zhí)行指令:ADDCA,DPL;(A)←(A)+(CY)+(DPL),3582
結果為:(A)=6FH,CY=1,OV=1,AC=0,P=0。
例5:雙字節(jié)無符號數加法(R0R1)+(R2R3)→(R4R5)R0、R2、R4存放16位數的高字節(jié),R1、R3、R5存放低字節(jié)。由于不存在16位數加法指令,所以只能先加低8位,后加高8位,而在加高8位時要連低8位相加時產生的進位一起相加。假設其和不超過16位,其編程如下:MOVA,R1;取被加數低字節(jié),E9ADDA,R3;低字節(jié)相加,2BMOVR5,A;保存和低字節(jié),FDMOVA,R0;取高字節(jié)被加數,E8ADDCA,R2;兩高字節(jié)之和加低位進位,3AMOVR4,A;保存和高字節(jié),FC3.帶借位減法帶借位減法指令有如下4條指令,其助記符為SUBB。SUBBA,#data;(A)←(A)-(CY)-#data,94dataSUBBA,direct;(A)←(A)-(CY)-(direct),95directSUBBA,@Ri;(A)←(A)-(CY)-((Ri)),96~97SUBBA,Rn;(A)←(A)-(CY)-(Rn),98~9F
由于減法指令只有帶借位減法指令,因此,若要進行不帶借位位的減法操作,需先清借位位,即置CY=0。清CY有專門的指令,它屬于位操作類指令(詳見3.3.5節(jié)),指令為:CLRC;(CY)←0,C3
例如:設(A)=52H,(R0)=B4H
執(zhí)行指令:CLRC;(CY)←0,C3SUBBA,R0;(A)←(A)-(CY)-(R0),98
結果為:(A)=9EH,CY=1,AC=1,OV=1,P=1。
例6:雙字節(jié)無符號數相減(R0R1)-(R2R3)→(R4R5)。R0、R2、R4存放16位數的高字節(jié),R1、R3、R5存放低字節(jié),先減低8位,后減高8位和低位減借位。由于低位開始減時沒有借位,所以要先清零。其編程如下:MOVA,R1;取被減數低字節(jié),E9CLRC;清借位位,C3SUBBA,R3;低字節(jié)相減,9BMOVR5,A;保存差低字節(jié),FDMOVA,R0;取被減數高字節(jié),E8SUBBA,R2;兩高字節(jié)差減低位借位,9AMOVR4,A;保存差高字節(jié),FC4.加1,減1指令加1指令共有如下5條指令,助記符為INC。INCA;(A)←(A)+1,04INCdirect;(direct)←(direct)+1,05directINC@Ri;((Ri))←((Ri))+1,06~07INCRn;(Rn)←(Rn)+1,08~0FINCDPTR;(DPTR)←(DPTR)+1,A3減1指令有如下4條指令,助記符為DEC。DECA;(A)←(A)-1,14DECdirect;(direct)←(direct)-1,15directDEC@Ri;((Ri))←((Ri))-1,16~17DECRn;(Rn)←(Rn)-1,18~1F
例如:設(R0)=7EH,(7EH)=FFH,(7FH)=38H,(DPTR)=10FEH,分析逐條執(zhí)行下列指令后各單元的內容。
INC@R0;使7EH單元內容由FFH變?yōu)?0HINCR0;使R0的內容由7EH變?yōu)?FHINC@R0;使7FH單元內容由38H變?yōu)?9HINCDPTR;使DPL為FFH,DPH不變
INCDPTR;使DPL為00H,DPH為11HINCDPTR;使DPL為01H,DPH不變5.乘、除法指令乘、除法指令為單字節(jié)4周期指令,在指令執(zhí)行周期中是最長的兩條指令。
(1)乘法指令MULAB(B)←((A)×(B))15~8,(A)←((A)×(B))7~0(CY)←0A4
乘法指令的功能是把累加器A和寄存器B中的兩個8位無符號數相乘,將乘積16位數中的低8位存放在A中,高8位存放在B中。若乘積大于FFH(255),則溢出標志OV置1,否則OV清0。乘法指令執(zhí)行后進位標志CY總是清零,即CY=0。另外,乘法指令本身只能進行兩個8位數的乘法運算,要進行多字節(jié)乘法還需編寫相應的程序。例如:若(A)=4EH(78),(B)=5DH(93)執(zhí)行指令:MULAB
結果為:積為(BA)=1C56H(7254)>FFH(255),(A)=56H,(B)=1CH,OV=1,CY=0,P=0。
例7:利用單字節(jié)乘法指令進行雙字節(jié)數乘以單字節(jié)數運算。若被乘數為16位無符號數,地址為M1和M1+1(低位先、高位后),乘數為8位無符號數,地址為M2,積存入R2、R3和R4三個寄存器中。
(M1+1)(M1)×(M2)R3R4
+BAR2R3R4
參考程序如下:MOVR0,#M1;被乘數地址存于R0MOVA,@R0;取16位數低8位
MOVB,M2;取乘數
MULAB;(M1)×(M2)MOVR4,A;存積低8位
MOVR3,B;暫存(M1)×(M2)高8位
INCR0;指向16位數高8位
MOVA,@R0;取被乘數高8位MOVB,M2;取乘數
MULAB;(M1+1)×(M2)ADDA,R3;(A)+(R3)得(積)15~8MOVR3,A;(積)15~8存R3MOVA,B;積最高8位送AADDCA,#00H;積最高8位+CY得(積)23~16MOVR2,A;(積)23~16存入R2
若上述程序執(zhí)行前:(M1+1)=ABH,(M1)=CDH,(M2)=64H,則執(zhí)行后:(R2)=43H,(R3)=1CH,(R4)=14H。(2)除法指令
(A)←(A)÷(B)之商,(B)←(A)÷(B)之余數
(CY)←0,(OV)←0
除法指令的功能是把累加器A中的8位無符號整數除以寄存器B中的8位無符號整數,所得商存于累加器A中,余數存于寄存器B中,進位標志CY和溢出標志OV均被清零。若除數B中的內容為0時,除法運算沒有意義,結果為不定值,此時溢出標志OV被置為1,即OV=1,而CY仍為0。DIVAB;,84
例8:利用除法指令把累加器A中的8位二進制數轉換為3位BCD數,并以壓縮形式存放在地址M1、M2單元中。解:累加器A中的8位二進制數,先對其除以100(64H),商數即為十進制的百位數;余數部分再除以10(0AH),所得商數和余數分別為十進制十位數和個位數,即得到3位BCD數。百位數放在M1中,十位、個位數壓縮BCD數放在M2中,十位與個位數的壓縮BCD數的存放是通過SWAP和ADD指令實現的。參考程序如下:MOVB,#64H;除數100送BDIVAB;得百位數MOVM1,A;百位數存于M1中MOVA,#0AH;取除數10XCHA,B;上述余數與除數交換DIVAB;得十位數和個位數SWAPA;十位數存于A的高4位ADDA,B;組成壓縮BCD數MOVM2,A;十、個位壓縮BCD數存M2
若上述程序執(zhí)行前:(A)=A8H(168),則執(zhí)行后:(M1)=(01)BCD,(M2)=(68)BCD。6.十進制調整指令若(A)3~0>9或(AC)=1,則(A)3~0←(A)3~0+06H
DAA
若(A)7~4>9或(CY)=1,則(A)7~4←(A)7~4+06H,D4
十進制調整指令是一條對二—十進制的加法進行調整的指令。兩個壓縮BCD碼按二進制相加,必須經過本條指令調整后才能得到正確的壓縮BCD碼和數,實現十進制的加法運算。由于指令要利用AC、CY等標志才能起到正確的調整作用,因此它必須跟在加法ADD、ADDC指令后面方可使用。
例9:對BCD碼加法65+58=BDH,進行十進制調整。解:參考程序如下:
MOVA,#65H;(A)←65ADDA,#58H;(A)←(A)+58DAA;十進制調整執(zhí)行結果:(A)=(23)BCD,(CY)=1,即:65+58=123。
0110010165+010110005810111101BD+01100110加66H調整
100100011
例10:雙字節(jié)壓縮BCD碼加法。解:設R5(高)、R4(低)為被加數;R3(高)、R2(低)為加數,相加和的結果存入:R6(萬)、R5(千、百)、R4(十、個)。參考程序如下:MOVA,R4;被加數十位、個位送入AADDA,R2;十位、個位相加
DAA;和的十位、個位調整
MOVR4,A;和的十位、個位存入R4MOVA,R5;被加數千位、百位送入AADDCA,R3;千位、百位的和加低位進位DAA;和的千位、百位調整
MOVR5,A;和的千位、百位存入R5MOVA,#00H;A清零
ADDCA,#00H;求和的萬位值
MOVR6,A;和的萬位存入R6
若程序執(zhí)行前:(R5)=(98)BCD,(R4)=(76)BCD,(R3)=(54)BCD,(R2)=(32)BCD,則執(zhí)行后:(R6)=(01)BCD,(R5)=(53)BCD,(R4)=(08)BCD
。
例11:利用十進制加法調整指令DA作十進制減法調整。解:由于DA指令不能直接對減法進行十進制調整,為了進行十進制減法運算,只能用加減數的補數來進行。兩位十進制數是對100取補的,如60-30=30,也可改為補數相加:
60+(100-30)=130
丟掉進位(模)100后,就得到正確的結果。
在實際運算時,由于CPU為8位,不可能用9位二進制數表示十進制數100,但可用8位二進制數10011010(9AH)代替,因為這個二進制數經過十進制調整后就是100000000。這樣十進制無符號數的減法運算可按以下步驟進行:(1)求減數的補數(9AH-減數);(2)被減數與減數的補數相加;(3)經DA指令調整后就得到所求的十進制減法運算結果。
這里用“補數”而不是“補碼”是為了和帶符號位的補碼加以區(qū)別。由于現在操作數都是正數,沒有必要再加符號位,故稱“補數”更為合適一些。設M1、M2、M3
分別為被減數、減數和差的符號地址,相應的十進制減法運算程序如下:CLRC;CY清0MOVA,#9AH;(A)←#9AHSUBBA,M2;求減數的補數
ADDA,M1;加補數完成減法
DAA;十進制調整
MOVM3,A;差存入M3單元若程序執(zhí)行前:(M1)=(91)BCD,(M2)=(36)BCD,則程序執(zhí)行后:(M3)=(55)BCD。2.3.3邏輯運算及移位類指令邏輯運算及移位指令共有24條,其中邏輯指令有“與”、“或”、“異或”、累加器A清零和求反20條,移位指令4條。
1.邏輯“與”運算指令邏輯“與”運算指令共有如下6條,其助記符為ANL。ANLdirect,A;(direct)←(direct)∧(A),52directANLdirect,#data;(direct)←(direct)∧#data,53directdata
ANLA,#data;(A)←(A)∧#data,54dataANLA,direct;(A)←(A)∧(direct),55directANLA,@Ri;(A)←(A)∧((Ri)),56~57ANLA,Rn;(A)←(A)∧(Rn),58~5F
邏輯“與”運算指令是將兩個指定的操作數按位進行邏輯“與”的操作。例如:(A)=FAH=11111010B,(R1)=7FH=01111111B
執(zhí)行指令:ANLA,R1;(A)←11111010∧01111111
結果為:(A)=01111010B=7AH。
邏輯“與”ANL指令常用于屏蔽(置0)字節(jié)中某些位。若清除某位,則用“0”和該位相與;若保留某位,則用“1”和該位相與。
2.邏輯“或”運算指令邏輯“或”運算指令共有如下6條指令,其助記符ORL。ORLdirect,A;(direct)←(direct)∨(A),42directORLdirect,#data;(direct)←(direct)∨#data,43directdataORLA,#data;(A)←(A)∨#data,44dataORLA,direct;(A)←(A)∨(direct),45directORLA,@Ri;(A)←(A)∨((Ri)),46~47ORLA,Rn;(A)←(A)∨(Rn),48~4F
邏輯“或”指令將兩個指定的操作數按位進行邏輯“或”操作。它常用來使字節(jié)中某些位置“1”,欲保留(不變)的位用“0”與該位相或,而欲置位的位則用“1”與該位相或。例如:若(A)=C0H,(R0)=3FH,(3F)=0FH
執(zhí)行指令:ORLA,@R0;(A)←(A)∨((R0))
結果為:(A)=CFH。
又如:根據累加器A中4~0位的狀態(tài),用邏輯與、或指令控制P1口4~0位的狀態(tài),P1口的高3位保持不變。
ANLA,#00011111B;屏蔽A的高3位
ANLP1,#11100000B;保留P1的高3位
ORLP1,A;使P14~0按A4~0置位若上述程序執(zhí)行前:(A)=B5H=10110101B,(P1)=6AH=01101010B,則執(zhí)行程序后:(A)=15H=00010101B,(P1)=75H=01110101B。3.邏輯“異或”運算指令
“異或”運算是當兩個操作數不一致時結果為1,兩個操作數一致時結果為0,這種運算也是按位進行,共有如下6條指令,其助記符為XRL。XRLdirect,A;(direct)←(direct)(A),62directXRLdirect,#data;(direct)←(direct)#data,63dataXRLA,#data;(A)←(A)#data,64dataXRLA,direct;(A)←(A)(direct),65directXRLA,@Ri;(A)←(A)((Ri)),66←67XRLA,Rn;(A)←(A)(Rn),68←6F
邏輯“異或”指令常用來對字節(jié)中某些位進行取反操作,欲某位取反則該位與“1”相異或;欲某位保留則該位與“0”相異或。還可利用異或指令對某單元自身異或,以實現清零操作。例如:若(A)=B5H=10110101B,執(zhí)行下列指令:XRLA,#0F0H;A的高4位取反,低4位保留
MOV30H,A;(30H)←(A)=45HXRLA,30H;自身異或使A清零
執(zhí)行后結果:(A)=00H。
以上邏輯“與”、“或”、“異或”各6條指令有如下共同的特點:
(1)邏輯“與”ANL、“或”O(jiān)RL、“異或”XRL運算指令除邏輯操作功能不同外,三者的尋址方式相同,指令字節(jié)數相同,機器周期數相同。
(2)ANL、ORL、XRL的前兩條指令的目的操作數均為直接地址方式,可很方便地對內部RAM的00H~FFH任一單元或特殊功能寄存器的指定位進行清零、置位、取反、保持等邏輯操作。(3)ANL、ORL、XRL的后4條指令,其邏輯運算的目的操作數均在累加器A中,且邏輯運算結果保存在A中。
4.累加器A清零與取反指令
CLRA;(A)←00H,E4
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年二手車個體交易策劃合同范本
- 2025年專利權交換協(xié)議格式
- 2025年個人信用管理協(xié)議書
- 2025年二手汽車交易未過戶合同模板
- 2025年農資研發(fā)與實驗勞動合同
- 2025年體重管理服務協(xié)議
- 2025年企業(yè)員工住房公積金貸款合同
- 2025年上海市新能源汽車產業(yè)投資合作協(xié)議
- 2025年養(yǎng)殖場租賃協(xié)議正式版本
- 2025年云服務器租用合同示范
- 安全生產技術規(guī)范 第25部分:城鎮(zhèn)天然氣經營企業(yè)DB50-T 867.25-2021
- 現代企業(yè)管理 (全套完整課件)
- 走進本土項目化設計-讀《PBL項目化學習設計》有感
- 《網店運營與管理》整本書電子教案全套教學教案
- 教師信息技術能力提升培訓課件希沃的課件
- 高端公寓住宅項目營銷策劃方案(項目定位 發(fā)展建議)
- 執(zhí)業(yè)獸醫(yī)師聘用協(xié)議(合同)書
- 第1本書出體旅程journeys out of the body精教版2003版
- [英語考試]同等學力英語新大綱全部詞匯
- 2022年肝動脈化療栓塞術(TACE)
- 形式發(fā)票格式2 INVOICE
評論
0/150
提交評論