《微控制器原理及應(yīng)用技術(shù)》課件第4章_第1頁
《微控制器原理及應(yīng)用技術(shù)》課件第4章_第2頁
《微控制器原理及應(yīng)用技術(shù)》課件第4章_第3頁
《微控制器原理及應(yīng)用技術(shù)》課件第4章_第4頁
《微控制器原理及應(yīng)用技術(shù)》課件第4章_第5頁
已閱讀5頁,還剩315頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第4章指令系統(tǒng)及匯編語言程序設(shè)計4.1程序設(shè)計概述4.2指令格式和尋址方式

4.3MCS51單片機指令系統(tǒng)

4.4匯編語言程序設(shè)計

4.5匯編語言應(yīng)用程序的開發(fā)與調(diào)試教學提示:指令是CPU按照人們的意圖來完成某種操作的命令,所有指令的集合就是指令系統(tǒng),它體現(xiàn)了計算機的性能,是計算機的重要組成部分,也是應(yīng)用計算機進行程序設(shè)計的基礎(chǔ)。單片機應(yīng)用系統(tǒng)的運行,是依靠合理的硬件電路設(shè)計和用戶程序設(shè)計的完美結(jié)合實現(xiàn)的,所以掌握單片機需要學習它的指令系統(tǒng)和多樣的匯編程序設(shè)計方法實現(xiàn)運算和控制功能。教學要求:本章主要介紹MCS51單片機的匯編指令的基礎(chǔ)知識,包括指令格式、尋址方式、數(shù)據(jù)傳送指令、算術(shù)運算指令、邏輯運算指令、位操作指令等。通過本章學習,學生能掌握指令的功能及使用,學會程序設(shè)計的基本方法,對于一般的題目要求,能夠提出解題辦法,畫出流程圖,編寫出匯編語言源程序。

一臺計算機只有硬件(稱為裸機)是不能工作的,必須配備各種功能的軟件,才能發(fā)揮其運算、測控等功能,而軟件中最基本的就是指令系統(tǒng)。不同類型的CPU有不同的指令系統(tǒng)。本章將介紹MCS51系列單片機的指令系統(tǒng)和匯編語言程序設(shè)計。

4.1.1指令和程序設(shè)計語言

前面已經(jīng)講述了單片機的幾個主要組成部分,這些部分構(gòu)成了單片機的硬件。所謂硬件,就是看得到、摸得到的實體。但是,只有這樣的硬件,只是有了實現(xiàn)計算和控制功能的可能性。單片機要真正地能進行計算和控制,還必須有軟件的配合。軟件主要指的是各種程序。4.1程序設(shè)計概述只有將各種正確的程序“灌入”(存入)單片機,它才能有效地工作。單片機之所以能自動地進行運算和控制,正是由于人把實現(xiàn)計算和控制的步驟一步步地用命令的形式,即一條條指令預(yù)先存入到存儲器中,單片機在CPU的控制下,將指令一條條地取出來,并加以翻譯和執(zhí)行。把要求計算機執(zhí)行的各種操作用命令的形式寫下來,這就是指令。一條指令,對應(yīng)著一種基本操作。單片機所能執(zhí)行的全部指令,就是該單片機的指令系統(tǒng),不同種類的單片機,其指令系統(tǒng)也不同。用戶為解決自己的問題用指令系統(tǒng)內(nèi)的指令所編寫的指令集合(程序)稱為源程序。程序是若干指令的有序集合,單片機的運行就是執(zhí)行這一指令序列的過程,編寫這一指令序列的過程稱為程序設(shè)計。目前,用于程序設(shè)計的語言基本上分為三種:機器語言、匯編語言和高級語言。下面對這三種語言進行簡單介紹。

1.機器語言

機器語言是面向計算機系統(tǒng)的。它是指計算機能直接識別和執(zhí)行的二進制代碼形式的指令,也稱機器指令。用機器語言組成的程序,常稱為目標程序,它是能被計算機直接執(zhí)行的唯一的一種程序。通常,無論是用何種語言編寫的計算機程序,都必須經(jīng)過編譯將它翻譯成機器語言程序才能在計算機中運行。例如:要做“10+20”的加法,機器語言(指令)如下:

機器碼注釋

0111010000001010;把10放到累加器A中

0010010000010100;A加20,結(jié)果仍放在A中

現(xiàn)在A中為“10+20”的結(jié)果,為了便于書寫和記憶,可采用十六進制表示指令。以上兩條指令可寫成:

74 0AH

2414H

顯然用機器語言(二進制代碼)編寫程序不易記憶、不易查錯、不易修改。故一般不采用機器語言來編寫程序。

2.匯編語言

為了克服機器語言難懂、難編、難記和易出錯的缺點,人們就用與機器語言實際含義相近的英文縮寫、字母和數(shù)字等助記符號來取代二進制的機器語言。如,用MOV表示數(shù)據(jù)傳送,用ADD表示運算符號“+”等,于是就產(chǎn)生了匯編語言。

用匯編語言編寫程序,每條指令的意義清晰,給程序的編寫、閱讀和修改都帶來很大的方便。匯編指令與機器指令是一一對應(yīng)的,即一條匯編語言的可執(zhí)行指令對應(yīng)著一條機器語言指令,反之亦然。因此,匯編語言可直接利用和發(fā)揮機器硬件系統(tǒng)的許多特性,如寄存器、標志位以及一些特殊指令等,這樣能提高編程的質(zhì)量和程序的運行速度,而且占用內(nèi)存量少。一般來說,某些對時間和存儲器容量要求較高的程序常用匯編語言來書寫,如系統(tǒng)軟件、實時控制系統(tǒng)、智能化儀器、儀表砑取MCS51系列單片機是用51系列單片機的指令系統(tǒng)來編程的,其匯編語言的語句格式,也就是單片機的指令格式,即:

操作碼

例如:要做“10+20”的加法,匯編語言(指令)如下:

指令注釋

MOVA,#0AH;把10放到累加器A中

ADDA,#14H;A加20,結(jié)果仍放在A中

匯編語言是面向機器的程序設(shè)計語言,與具體的計算機硬件有著密切的關(guān)系。然而,匯編語言也有它的缺點,在用它編寫程序時,必須熟悉機器的指令系統(tǒng)、尋址方式、寄存器設(shè)置和使用方法,而編出的程序也只適用于某一系列的計算機。因此,匯編語言可移植性差,不能直接移植到不同類型的計算機系統(tǒng)。

3.高級語言

高級語言(如C語言)克服了匯編語言的缺點,是一種面向問題或過程的語言。它是一種接近于自然語言和數(shù)學算法的語言,與機器的硬件無關(guān),用戶編程時不必仔細了解所用計算機的具體性能和指令系統(tǒng)。高級語言不但直觀、易學、易懂,而且通用性強,可以在不同的計算機上運行,因此可移植性好。

用高級語言編寫的程序需要由編譯程序或解釋程序?qū)⑺鼈兎g成對應(yīng)的目標程序,機器才能接受。由于高級語言指令與機器語言指令不是一一對應(yīng)的,往往一條高級語言指令對應(yīng)著多條機器語言指令。因此,這個翻譯過程要比將匯編源程序翻譯成目標程序花費的時間要長得多,產(chǎn)生的目標程序也較冗長,占用存儲空間也較大,執(zhí)行的速度也較匯編語言慢。采用高級語言編寫程序可以節(jié)省軟件開發(fā)的時間,但它不允許程序員直接利用寄存器、標志位等這些計算機硬件特性,因而也影響了許多程序設(shè)計的靈活性。4.1.2匯編概念

用匯編語言編寫的源程序,還必須經(jīng)過從匯編源程序到機器語言目標程序的“翻譯”,才能在單片機上運行,這種翻譯的過程稱為匯編。匯編可分為手工匯編和機器匯編兩類。

1.手工匯編

在匯編語言源程序設(shè)計中,簡單的程序可用手工編程,即采用鍵盤輸入的編寫方式。首先把程序用助記符指令寫出,然后通過查指令的機器代碼表,逐個把助記符指令“翻譯”成機器代碼,再進行調(diào)試和運行。通常將這種人工查表“翻譯”指令的方法稱為“手工匯編”。手工匯編都是按絕對地址對指令定位,但遇到相對轉(zhuǎn)移指令偏移量的計算時,要根據(jù)轉(zhuǎn)移的目標地址計算偏移量,不但麻煩,而且容易出錯,通常只有小程序或條件限制時才使用手工匯編。在實際的程序設(shè)計中,多采用機器匯編來自動完成匯編。

2.機器匯編

機器匯編是借助于計算機上的軟件(匯編程序)來代替手工匯編。首先,在計算機上用編輯軟件進行源程序的編輯,編輯完成后生成一個ASCII文件,文件的擴展名為“.ASM”。然后,在計算機上運行匯編程序,把匯編語言源程序翻譯成機器語言。使用計算機完成匯編后,利用計算機的串行口與單片機的通訊口把匯編成的目標代碼(機器語言)傳送到單片機的仿真器中去調(diào)試、執(zhí)行,我們稱這種方式為交叉匯編。它具有效率高,不易出錯等特點。

例4.1表4.1是一段匯編源程序,可通過查指令表的方式進行手工匯編,也可直接用匯編軟件進行機器匯編(設(shè)此段程序存放地址由2000H處開始)。表4.1匯編源程序與匯編后的機器碼

有時,在分析某些產(chǎn)品的ROM/EPROM中的程序時,要將二進制的機器代碼語言程序翻譯成匯編語言程序,該過程稱為反匯編。

4.2.1指令格式

MCS51的指令有111條,分別表征30多種基本指令功能。其匯編指令格式如下:

操作碼

在指令的一般格式中使用了可選擇符號“”,其包含的內(nèi)容可有可無。下面分別介紹各個部分的含義。4.2指令格式和尋址方式標號:是該指令的符號地址,表明該指令在程序中的位置,在其它指令中可被引用,經(jīng)常出現(xiàn)在轉(zhuǎn)移指令中,可根據(jù)需要設(shè)置。標號后要用“:”將其與操作碼分隔開。標號的命名應(yīng)符合字符集,即英文的大、小寫字母(a~z,A~Z)、數(shù)字(0~9)。標號嚴禁使用保留字符,如指令助記符、偽指令、常數(shù)等語言規(guī)范中已經(jīng)使用了的符號,且長度不能超過8個字符,首字符必須為字母。

操作碼:是指令的核心部分,操作碼的作用是用于指示機器執(zhí)行哪種操作,如加、減、乘、除、傳送等。

操作數(shù):是操作指令的作用對象,分為目的操作數(shù)和源操作數(shù),二者之間用“,”分開。操作數(shù)是一個具體的數(shù)據(jù),也可以是參與運算的數(shù)據(jù)所在的地址。操作數(shù)一般有以下幾種形式:

(1)沒有操作數(shù),操作數(shù)隱含在操作碼中,如RET指令;

(2)只有一個操作數(shù),如INCA指令;

(3)有兩個操作數(shù),如MOVA,30H指令;

(4)有3個操作數(shù),如CJNEA,#00H,10H指令。

注釋:是對該指令功能的解釋,主要是便于理解和閱讀程序,可根據(jù)需要適當添加,編譯器對注釋是不做處理的。注釋前要用“;”將其與操作指令分開。注釋換行時,行前也要加分號。從指令的二進制代碼表示的角度看,指令格式是以8位二進制(1字節(jié))為基礎(chǔ),它可分為單字節(jié)、雙字節(jié)和三字節(jié)指令。

1.單字節(jié)指令

單字節(jié)指令的二進制代碼只有一個字節(jié)。它分為兩類:一類是無操作數(shù)的單字節(jié)指令,其指令碼只有操作碼字段,操作數(shù)隱含在操作碼中;另一類是含有操作數(shù)寄存器編號的單字節(jié)指令,其指令碼由操作碼字段和用來指示操作數(shù)所在寄存器號的地址碼組成。其格式如表4.2所示。表4.2單字節(jié)指令格式

2.雙字節(jié)指令

雙字節(jié)指令的二進制代碼有兩個字節(jié),第一個字節(jié)是操作碼(或操作碼加操作數(shù)所在寄存器的地址碼),第二個字節(jié)是數(shù)據(jù)或數(shù)據(jù)所在的地址碼。其格式如表4.3所示。

表4.3雙字節(jié)指令格式

70

第一字節(jié)操作碼(地址碼)

第二字節(jié)數(shù)據(jù)或地址碼

3.三字節(jié)指令

三字節(jié)指令的二進制代碼有三個字節(jié),第一字節(jié)是操作碼,第二和第三字節(jié)是操作數(shù)或操作數(shù)地址。其格式如表4.4所示。表4.4三字節(jié)指令格式4.2.2指令中常用符號

介紹各類指令前,先對描述指令的一些符號的意義進行以下說明:

(1)Ri和Rn:R表示當前工作寄存器區(qū)中的工作寄存器。i表示0或1,即R0和R1。n表示0~7,即R0~R7。當前工作寄存器的選定是由PSW的RSl和RS0位決定的。

(2)#data:#表示立即數(shù),data為8位常數(shù)。#data是指包含在指令中的8位立即數(shù)。

(3)#data16:指包含在指令中的16位立即數(shù)。

(4)rel:表示相對地址,以補碼形式表示的地址偏移量,范圍為-128~+127,主要用于無條件相對短轉(zhuǎn)移指令SJMP和所有的條件轉(zhuǎn)移指令中。

(5)addr16:表示16位目的地址。目的地址可在全部程序存儲器的64KB空間范圍內(nèi),主要用于無條件長轉(zhuǎn)移指令LJMP和子程序長調(diào)用指令LCALL中。

(6)addr11:表示11位目的地址。目的地址應(yīng)與下一條指令處于相同的2KB程序存儲器地址空間范圍內(nèi),主要用于絕對轉(zhuǎn)移指令A(yù)JMP和子程序絕對調(diào)用指令A(yù)CALL指令中。

(7)direct:表示直接尋址的地址,即8位內(nèi)部數(shù)據(jù)存儲器RAM的單元地址(0~255),或特殊功能寄存器SFR的地址。對于SFR可直接用其名稱來代替其直接地址。

(8)bit:表示內(nèi)部數(shù)據(jù)存儲器RAM和特殊功能寄存器SFR中的可直接尋址位地址。

(9)@:指間接尋址寄存器或基地址寄存器的前綴,如@Ri,@DPTR,表示寄存器間接尋址。

(10)(X):表示X中的內(nèi)容。

(11)((X)):表示由X尋址的單元中的內(nèi)容,即(X)作地址,該地址的內(nèi)容用((X))表示。

(12)/和→:/表示對該位操作數(shù)取反,但不影響該位的原值。→表示指令操作流程,將箭頭一方的內(nèi)容,送入箭頭另一方的單元中。4.2.3尋址方式

指令通常由操作碼和操作數(shù)組成,操作數(shù)的兩個重要參數(shù)為目的操作數(shù)和源操作數(shù)。它們指出參加運算的數(shù)或該數(shù)所在的單元地址。獲得這些操作數(shù)所在地址的過程稱為尋址。MCS51單片機有7種尋址方式,即立即尋址、直接尋址、寄存器尋址、寄存器間接尋址、變址尋址、相對尋址和位尋址。

1.立即尋址

指令的源操作數(shù)是數(shù)值,這種操作數(shù)稱做立即數(shù),在指令中用“#”作為其前綴。含有立即數(shù)的指令的指令碼中,操作碼后面字節(jié)的內(nèi)容就是操作數(shù)本身,不需要到其它地址單元去取,這種尋址方式稱為立即尋址方式。

例如:機器碼助記符注釋

74FAMOVA,#0FAH;(A)←FAH

FAH是立即數(shù),74H是操作碼,指令功能是將立即數(shù)送入累加器A,即(A)=FAH。程序存儲器中指令以機器碼形式存放(機器碼由系統(tǒng)自動生成,實際編程不需要寫出),上述指令的尋址過程如圖4.1示。

圖4.1立即尋址方式示意圖在MCS51指令系統(tǒng)中還有一條16bit立即尋址指令:

例如:機器碼助記符注釋

903001MOVDPTR,#3001H;(DPH)←30H,(DPL)←01H

上述指令的功能是將16bit立即數(shù)3001H送給數(shù)據(jù)指針DPTR,即(DPTR)=3001H。

2.直接尋址

指令中直接給出操作數(shù)所在的存儲器地址,以供尋址取數(shù)或存數(shù)的尋址方式稱為直接尋址。例如:機器碼助記符注釋

E5H50HMOVA,50H;(A)←(50H)

該指令的功能是把內(nèi)部數(shù)據(jù)存儲器RAM的50H單元內(nèi)的內(nèi)容送到累加器A。指令直接給出了源操作數(shù)的地址50H。該指令的機器碼為E5H50H。

MCS51系列單片機的直接尋址可用于訪問內(nèi)部數(shù)據(jù)存儲器,也可用于訪問程序存儲器。直接尋址可訪問內(nèi)部RAM的低128個單元(00H~7FH),同時也是訪問高128個單元的特殊功能寄存器SFR的唯一方法。由于SFR占用片內(nèi)RAM(80H~FFH)的地址,對于MCS51系列單片機,片內(nèi)RAM只有128個單元,它與SFR的地址沒有重疊。為避免混淆,單片機規(guī)定:

直接尋址的指令不能訪問片內(nèi)RAM的高128個單元(80H~FFH),若要訪問這些單元只能用寄存器間接尋址指令,而要訪問SFR只能用直接尋址指令。另外,訪問SFR可在指令中直接使用該寄存器的名字來代替地址,如MOVA,80H,可以寫成MOVA,P0(因為P0口的地址為80H)。直接尋址還可直接訪問片內(nèi)221個位地址空間。

直接尋址訪問程序存儲器的指令有長轉(zhuǎn)移指令LJMPaddr16與絕對轉(zhuǎn)移指令A(yù)JMPaddr11、長調(diào)用指令LCALLaddr16與絕對調(diào)用指令A(yù)CALLaddr11,它們都直接給出了程序存儲器的16位地址(尋址范圍覆蓋64KB)或11位地址(尋址范圍覆蓋2KB)。執(zhí)行這些指令后,程序計數(shù)器PC的全部16位或低11位地址將更換為指令直接給出的地址,機器將改為訪問以所給地址為起始地址的存儲器區(qū)間。

3.寄存器尋址

指令中的操作數(shù)放在寄存器中,找到寄存器就可得到操作數(shù),這種尋址方式稱為寄存器尋址。寄存器尋址的工作寄存器包括R0~R7、累加器A、寄存器B、數(shù)據(jù)指針DPTR和Cy(作為位處理累加器)等。

例如:機器碼助記符注釋

11101011MOVA,R3;(A)←(R3)

這條指令的功能是寄存器將數(shù)據(jù)送給累加器,它為一條單字節(jié)指令,低3位011代表工作寄存器R3的地址,高5位11101代表從寄存器往累加器A送數(shù)據(jù)的操作。該指令的低3位可從000~111變化,則分別代表R0~R7。設(shè)R3中的操作數(shù)是B9H,該條指令的尋址過程如圖4.2所示。

圖4.2寄存器尋址方式示意圖

4.寄存器間接尋址

寄存器的內(nèi)容不是操作數(shù)本身,而是存放操作數(shù)的地址,要獲取操作數(shù)需要通過寄存器間接得到,這種尋址方式稱為寄存器間接尋址。

寄存器間接尋址只能使用寄存器R0或R1作為間接地址寄存器,來尋址內(nèi)部RAM(00H~FFH)中的數(shù)據(jù)。寄存器前用符號“@”表示是采用間接尋址方式。對于內(nèi)部RAM有256字節(jié)的52系列單片機,其高128字節(jié)(80H~FFH)只能采用寄存器間接尋址方式,以避免和同樣采用此區(qū)地址的SFR發(fā)生沖突。寄存器間接尋址也適用于訪問外部RAM,用DPTR作為間接尋址寄存器,可尋址64KB空間;對于外部RAM的低256字節(jié)單元,也可用R0、R1作為間接尋址寄存器。

值得注意的是,寄存器間接尋址方式不能用于尋址特殊功能寄存器。

例如:

MOVA,@R1;(A)←((R1))

該指令的功能是把R1所指的內(nèi)部RAM單元中的內(nèi)容送至累加器A。若R1的內(nèi)容為40H,而內(nèi)部RAM的40H單元中的內(nèi)容是0A6H,則指令MOVA,@R1的功能是將0A6H這個數(shù)送到累加器A,其尋址過程如圖4.3所示。

圖4.3寄存器間接尋址示意圖若R1的內(nèi)容是90H,則指令MOVA,@R1是將內(nèi)部RAM的90H單元(52子系列)的值送給A。又因為90H是特殊功能寄存器P1的地址,所以如果要尋址P1,需要采用直接尋址的方式,即MOVA,90H,這才是將P1端口的內(nèi)容送A,請注意區(qū)別。

5.變址尋址

這種尋址方式常用于訪問程序存儲器中的數(shù)據(jù)表格,它把基址寄存器(DPTR或PC)和變址寄存器A的內(nèi)容作為無符號數(shù)相加形成16位的地址,該地址單元中的內(nèi)容才是所需的操作數(shù)。

例如:

MOVCA,@A+DPTR;(A)←((DPTR)+(A))

MOVCA,@A+PC;(A)←((PC)+(A))

A中為無符號數(shù),該指令的功能是A的內(nèi)容和DPTR或當前PC的內(nèi)容相加得到程序存儲器的有效地址,把該存儲器單元中的內(nèi)容送到A。

MOVCA,@A+DPTR的指令碼是93H,其尋址過程如圖4.4所示。

圖4.4基址寄存器加變址寄存器間接尋址示意圖

6.相對尋址

程序的執(zhí)行往往需要相對轉(zhuǎn)移,即以當前指令的位置(PC值)為基準點,加上指令中給出的相對偏移量(rel)來獲得操作數(shù)所在的實際地址,這類尋址方式稱為相對尋址。它是轉(zhuǎn)移指令中用到的尋址方式。偏移量rel是符號數(shù),其范圍為-128~+127,用補碼表示為80H~7FH,實際應(yīng)用中常用符號地址代替。

例如:JCrel;若C=1,則跳轉(zhuǎn)至(PC)=(PC當前地址)+rel機器碼為40Hrel。其中第一字節(jié)為操作碼,第二字節(jié)是相對于程序計數(shù)器PC當前地址的偏移量rel。

注意:這里的PC當前地址是指執(zhí)行完JCrel指令后的PC值,而不是指向該條指令的PC值。例如:

1005H:JC80H

;若C=1,則跳轉(zhuǎn)至(PC)=1007H+80H處

;若C=0,則順序執(zhí)行(PC)=1007H

若這條雙字節(jié)的轉(zhuǎn)移指令存放在1005H,取出操作碼后,PC指向1006H,取出偏移量后PC指向1007H,故在計算偏移量相加時,PC已為1007H單元,即指向該條指令的下條指令。具體過程見后面相關(guān)指令的介紹。

7.位尋址

MCS51系列單片機具有位尋址功能,即指令中直接給出位地址,可以對內(nèi)部數(shù)據(jù)存儲器RAM中的128位和特殊寄存器SFR中的93個位進行尋址,并且位操作指令可對地址空間的每一位進行傳送及邏輯操作。

例如:SETBPSW.3;(PSW.3)←1

該指令的功能是給程序狀態(tài)字PSW中的RS0置1。該指令為雙字節(jié)指令,機器代碼為D2HD3H,指令的第二字節(jié)直接給出位地址D3H(PSW.3的位地址)。綜上所述,在MCS51系列單片機的存儲空間中,指令究竟對哪個存儲器空間進行操作是由指令操作碼和尋址方式確定的。7種尋址方式及使用空間如表4.5所示。表4.57種尋址方式及使用空間

MCS51單片機指令系統(tǒng)分為數(shù)據(jù)傳送類指令、算術(shù)運算類指令、邏輯運算及移位類指令、控制轉(zhuǎn)移類指令和位操作(布爾操作)指令5類,共計111條指令?,F(xiàn)分別介紹各類指令的格式、功能、對狀態(tài)標志的影響以及應(yīng)用。4.3MCS51單片機指令系統(tǒng)4.3.1數(shù)據(jù)傳送類指令

數(shù)據(jù)傳送類指令共29條,它是指令系統(tǒng)中最活躍、使用最多的一類指令。一般的操作是把源操作數(shù)傳送到目的操作數(shù),即指令執(zhí)行后目的操作數(shù)改為源操作數(shù),而源操作數(shù)保持不變。若要求在進行數(shù)據(jù)傳送時,不丟失目的操作數(shù),則可以用交換型傳送指令。

數(shù)據(jù)傳送類指令不影響進位標志CY、半進位標志AC和溢出標志OV,但當傳送或交換數(shù)據(jù)后影響累加器A的值時,奇偶標志P的值則按A的值重新設(shè)定。按數(shù)據(jù)傳送類指令的操作方式,傳送類指令又可分為3種類型:數(shù)據(jù)傳送、數(shù)據(jù)交換和堆棧操作,并使用8種助記符:MOV、MOVX、MOVC、XCH、XCHD、SWAP、PUSH及POP。表4.6給出了各種數(shù)據(jù)傳送指令的操作碼助記符和對應(yīng)的操作數(shù)。表4.6數(shù)據(jù)傳送類指令的操作碼助記符與對應(yīng)操作數(shù)

1.內(nèi)部數(shù)據(jù)存儲器之間的數(shù)據(jù)傳送指令

內(nèi)部數(shù)據(jù)存儲器RAM區(qū)是數(shù)據(jù)傳送最活躍的區(qū)域,可用的指令也最多,共有16條指令,指令操作碼助記符為MOV。其匯編指令與操作如表4.7所示。表4.7內(nèi)部數(shù)據(jù)存儲器之間的數(shù)據(jù)傳送指令與操作

內(nèi)部RAM之間源操作數(shù)傳遞關(guān)系如圖4.5所示。為了便于理解指令功能,按對源操作數(shù)的尋址方式逐一介紹各條指令。圖4.5內(nèi)部RAM間數(shù)據(jù)傳遞關(guān)系圖

1)立即尋址

該尋址方式下,內(nèi)部RAM區(qū)的數(shù)據(jù)傳送指令有以下5條。這里描述指令格式的次序為操作碼助記符、目的操作數(shù)、源操作數(shù)、功能注釋。以下類同,不再說明。

操作碼助記符目的操作數(shù)源操作數(shù)功能注釋

MOV@Ri,#data;((Ri))←#data

MOVRn,#data;(Rn)←#data

MOVDPTR,#data16;(DPTR)←#data16

MOVA,#data;(A)←#data

MOVdirect,#data;(direct)←#data這組指令表明,8位立即數(shù)可以直接傳送到內(nèi)部數(shù)據(jù)區(qū)RAM的各個位置,并且可把16位立即數(shù)直接裝入數(shù)據(jù)指針DPTR。其相關(guān)指令的功能及應(yīng)用舉例如下:

①MOVdirect,#data;(direct)←#data

該指令的功能是把立即數(shù)傳送到內(nèi)部數(shù)據(jù)存儲器RAM的00H~7FH,以及特殊功能寄存器SFR的各單元,它為三字節(jié)指令。

例如:把立即數(shù)60H傳送到RAM的30H單元和P1口(地址為90H),可采用如下指令:

MOV30H,#60H;(30H)←#60H

MOVP1,#60H;(90H)←#60H

②MOV@Ri,#data;((Ri))←#data該指令的功能是把立即數(shù)傳送到由R0和R1寄存器的內(nèi)容指出的片內(nèi)數(shù)據(jù)存儲器RAM的單元(MCS51系列為00H~7FH,MCS52系列為00H~FFH)。當使用R0和R1寄存器時,機器代碼分別為76H和77H,而R0、R1屬于片內(nèi)RAM中哪一組工作寄存器由PSW中的RS1和RS0決定。

例如:要把立即數(shù)60H傳送到RAM的30H單元,需用如下兩條指令:

MOVR0,#30H;(R0)←#30H

MOV@R0,#60H;((R0))←#60H

由此可見,完成同樣功能,所用指令不同,程序所占空間不同,執(zhí)行效率不同。因此,在實際編程時要注意程序的優(yōu)化。③MOVRn,#data;(Rn)←#data

該指令的功能是把立即數(shù)傳送到內(nèi)部寄存器R0~R7,該指令為雙字節(jié)指令,機器代碼為:

01111rrrdata

其中,rrr取值為000、001、…、110、111,對應(yīng)R0、R1、…、R6、R7共8個寄存器,機器代碼為78、79、…、7E、7F。但在片內(nèi)RAM中屬于哪一組的R0~R7由PSW中RSl和RS0的設(shè)置決定。該指令共對應(yīng)8條指令,但在MCS51單片機指令系統(tǒng)中,該指令只統(tǒng)計為一條。

④MOVDPTR,#data16;(DPTR)←#data16該指令的功能是把16位立即數(shù)裝入數(shù)據(jù)指針DPTR。它是MCS51系列單片機指令系統(tǒng)中唯一一條16位數(shù)據(jù)傳送指令。該指令為三字節(jié)指令,第一字節(jié)為90H,第二字節(jié)為高8位立即數(shù),第三字節(jié)為低8位立即數(shù)。

例如:MOVDPTR,#5534H;(DPTR)←5534H

指令執(zhí)行后,DPTR寄存器的高8位寄存器DPH的內(nèi)容為55H,低8位寄存器DPL的內(nèi)容為34H。該指令的機器代碼為90H55H34H。

本條指令的等效指令可寫為:

MOVDPH,#55H

MOVDPL,#34H

2)寄存器尋址

在該尋址方式下,內(nèi)部RAM區(qū)的數(shù)據(jù)傳送指令有以下5條:

MOVdirect,A;(direct)←(A)

MOV@Ri,A;((Ri))←(A)

MOVRn,A;(Rn)←(A)

MOVA,Rn;(A)←(Rn)

MOVdirect,Rn;(direct)←(Rn)

這組指令的功能是把累加器A的內(nèi)容傳送到內(nèi)部數(shù)據(jù)區(qū)RAM的各個單元,或者把指定工作寄存器R0~R7中的內(nèi)容傳送到累加器A或direct所指定的片內(nèi)RAM的00H~7FH單元或特殊功能寄存器SFR。但不能用這類指令在內(nèi)部工作寄存器之間直接傳送。例如,不存在MOVR1,R2這樣的指令。

3)直接尋址

在該尋址方式下,內(nèi)部RAM區(qū)的數(shù)據(jù)傳送指令有如下4條指令:

MOVA,direct;(A)←(direct)

MOVRn,direct;(Rn)←(direct)

MOV@Ri,direct;((Ri))←(direct)

MOVdirect2,directl;(direct2)←(directl)這組指令將直接地址規(guī)定的內(nèi)部RAM單元(片內(nèi)RAM的00H~7FH,SFR的80H~FFH單元)的內(nèi)容傳送到累加器A、寄存器Rn,并能實現(xiàn)內(nèi)部數(shù)據(jù)寄存器RAM之間、特殊功能寄存器SFR之間或SFR與內(nèi)部RAM之間的直接數(shù)據(jù)傳遞。直接傳遞不需要通過累加器A或者工作寄存器來間接傳送,從而提高了數(shù)據(jù)傳送的效率。

例如:MOVP2,P1;(P2)←(P1)

該條指令的功能是不通過其它寄存器,直接把P1口(端口地址為90H)的內(nèi)容傳送到P2口(端口地址為A0H)輸出,提高了效率。該指令為三字節(jié)指令,機器代碼為85H90HA0H。

4)寄存器間接尋址

在該尋址方式下,內(nèi)部RAM區(qū)的數(shù)據(jù)傳送指令有以下兩條:

MOVA,@Ri;(A)←((Ri))

MOVdirect,@Ri;(direct)←((Ri))

這組指令把以Ri的內(nèi)容作為地址進行尋址所得到單元的內(nèi)容,傳送到累加器A或direct指定的片內(nèi)RAM區(qū)單元。間接尋址可訪問片內(nèi)數(shù)據(jù)存儲器的低128個單元(00H~7FH)和高128個單元(80H~FFH,對52子系列),但不能用于尋址特殊功能寄存器SFR。例4.2試判斷下列程序的執(zhí)行結(jié)果。

序號指令

①MOV30H,#40H

②MOV40H,#10H

③MOVP1,#0CAH

④MOVPSW,#00H

⑤MOVR0,#30H

⑥MOVA,@R0

⑦MOVR1,A

⑧MOVB,@R1⑨MOV@R1,P1

⑩MOVP3,P1

操作過程的解釋:

第①條:將8位立即數(shù)01000000B=40H送給片內(nèi)RAM地址為30H單元中。即表示成(30H)←40H或(30H)=40H。

第②條:將立即數(shù)10H送給片內(nèi)RAM的40H單元中,即(40H)=10H。

第③條:P1是符號,代表片內(nèi)SFR地址90H,實際是將立即數(shù)CAH送給P1,即90H地址中。(P1)=CAH等價于(90H)=CAH。#0CAH中的0為數(shù)據(jù)CAH的引導零(在計算機上編譯時用)。

第④條:PSW是符號,代表片內(nèi)SFR地址D0H,實際是(PSW)=00H。再將00H展開為二進制數(shù)00000000(B),其中位標志(RS1)=0(B)、(RS0)=0(B),指通用寄存器R0~R7當前處在0組,其對應(yīng)的地址為00H~07H,即R0=00H(R0不加括號表示地址),其余依此類推。

第⑤條:(R0)=30H,結(jié)合上述第4條可知,此時R0對應(yīng)0區(qū)的地址為00H,即(R0)=(00H)=30H。故立即數(shù)30H最終被送到片內(nèi)RAM地址00H中。

第⑥條:(A)=((R0))=(30H)=40H(結(jié)合第⑤條、第①條)。累加器A是符號,代表片內(nèi)SFR地址E0H,即(A)=E0H,故立即數(shù)40H最終被送到片內(nèi)SFR地址E0H中。

第⑦條:(R1)=(A)=40H。而已知0組的R1地址為01H,故將累加器A存放的數(shù)據(jù)40H送到片內(nèi)RAM地址01H中。

第⑧條:(B)=((R1))=(40H)=10H(結(jié)合第⑦條、第②條)。寄存器B是符號,代表片內(nèi)SFR地址F0H,即B=F0H,故片內(nèi)RAM的40H中存放的數(shù)據(jù)10H最終被送到片內(nèi)SFR地址F0H中。另外,該指令的實際形式是MOVF0H,@R1。

第⑨條:((R1))=(40H)=(P1)=CAH(結(jié)合第⑧條、第③條)。即片內(nèi)SFR地址90H中存放的數(shù)據(jù)CAH最終被送到片內(nèi)RAM地址40H中。該指令的實際形式是:MOV@R1,90H。

第⑩條:(P3)=(P1)=CAH,P3是符號,代表片內(nèi)SFR地址B0H,即P3=B0H,P1=90H。故片內(nèi)SFR地址90H中存放的數(shù)據(jù)CAH最終被送到片內(nèi)SFR地址B0H中。該指令的實際形式是MOVB0H,90H。

執(zhí)行結(jié)果:(30H)=40H,(40H)=CAH,(P1)=(90H)=CAH,(P3)=(B0H)=CAH,(R0)=(00H)=30H,(R1)=(01H)=40H,(A)=(E0H)=40H,(B)=(F0H)=10H。

2.外部數(shù)據(jù)存儲器數(shù)據(jù)傳送指令

該類指令在累加器A與外部數(shù)據(jù)存儲器RAM之間傳送一個字節(jié)的數(shù)據(jù),采用間接尋址方式尋址外部數(shù)據(jù)存儲器。其匯編指令與操作如表4.8所示。表4.8外部數(shù)據(jù)存儲器數(shù)據(jù)傳送指令的匯編指令與操作

前兩條指令將外部RAM的數(shù)據(jù)傳送到累加器,后兩條指令是將累加器數(shù)據(jù)傳送到外部RAM。CPU與外部RAM的數(shù)據(jù)交換只能通過累加器A進行,包括讀數(shù)據(jù)和寫數(shù)據(jù)兩種操作,指令特征是MOVX。其中MOVXA,@Ri和MOVX@Ri,A兩條指令,隱含著外部RAM地址的高8位,而該高8位地址是由P2寄存器輸出的,低8位地址由Ri寄存器的內(nèi)容提供,即真正外部RAM地址(16位)為(P2)(Ri)。例4.3試分析以下指令的執(zhí)行結(jié)果。

MOVDPTR,#9000H;(DPTR)=9000H

MOVXA,@DPTR;(A)=((DPTR))=(9000H)

即將外部RAM9000H地址單元的內(nèi)容讀出傳送到累加器A中。

例4.4

試分析下列指令的執(zhí)行結(jié)果。

MOVP2,#80H;(P2)=80H,作為外部RAM的高8位地址

MOVR0,#20H;(R0)=20H,作為外部RAM的低8位地址

MOVXA,@R0;(A)←((P2)(R0))=(8020H)即將外部RAM8020H地址單元的內(nèi)容讀出傳送到累加器A中。例4.5試分析下列指令的執(zhí)行結(jié)果。

MOVDPTR,#9000H;(DPTR)=9000H

MOVA,#10H;(A)=10H

MOVX@DPTR,A;((DPTR))=(9000H)=(A)=10H

即將數(shù)據(jù)10H寫入到外部RAM9000H地址中。

例4.6

試分析下列指令的執(zhí)行結(jié)果。

MOVP2,#90H;(P2)=90H

MOVR1,#10H;(R1)=10H

MOVA,#30H;(A)=30H

MOVX@R1,A;((P2)(R1))=(9010H)=(A)=30H

即將數(shù)據(jù)30H寫入到外部RAM9010H地址中。

另外,訪問外部RAM讀/寫時,相應(yīng)單片機硬件使其讀信號(RD)或?qū)懶盘?WR)有效(為低電平)。

3.程序存儲器數(shù)據(jù)傳送指令

程序存儲器向累加器A傳送數(shù)據(jù)指令,又稱查表指令。它采用變址尋址方式,把程序存儲器(ROM或EPROM)中存放的表格數(shù)據(jù)讀出,傳送到累加器A。其匯編指令及操作如表4.9所示。表4.9程序存儲器數(shù)據(jù)傳送指令的匯編指令與操作

兩條指令的功能是把作為變址寄存器的累加器A中的內(nèi)容與基址寄存器(DPTR或PC)的內(nèi)容進行16位無符號數(shù)的加法操作,得到程序存儲器某單元地址,再把該地址單元的內(nèi)容送入累加器A,執(zhí)行指令后基址寄存器DPTR的內(nèi)容不變,PC的內(nèi)容為(PC)+1。由于執(zhí)行16位加法,從低8位產(chǎn)生的進位將傳送到高位去,不影響任何標志位。MOVC的含義為傳送常數(shù),稱為查表指令。該指令可以訪問由(DPTR)指向表格首址,(A)作為表項序號的0~255項表格。其中,表格可以設(shè)置在64KB程序存儲器的任何位置。在變址過程中,并不改變基址寄存器的內(nèi)容,變址后的地址被自動裝入“程序地址寄存器”。

例4.7試分析下列指令的執(zhí)行結(jié)果(若程序存儲器9020H的內(nèi)容為54H)。

MOVDPTR,#9010H;(DPTR)=9010H

MOVA,#10H;(A)=10H

MOVCA,@A+DPTR;(A)=((A)+(DPTR))=(9020H)讀程序存儲器

MOVX@DPTR,A;(9010H)=(9020H)寫入外部數(shù)據(jù)存儲器即將程序存儲器(地址9020H在0000H開始的4K空間之外,故一定是外部程序存儲器而非單片機內(nèi)部程序存儲器)9020H地址單元的內(nèi)容讀出后送到外部數(shù)據(jù)存儲器9010H地址中(寫入)。其中,程序存儲器地址9010H是指表格的首地址,表項的序號為10H,則實際查表的地址為9010H+10H=9020H。最后結(jié)果為外部數(shù)據(jù)存儲器9010H單元的內(nèi)容,為54H。

指令MOVCA,@A+DPTR,以16位寄存器DPTR作為基址寄存器,因此可以很方便地把一個16位地址送到DPTR,實現(xiàn)在整個64KB個程序存儲器單元到累加器A的數(shù)據(jù)傳送。而指令MOVCA,@A+PC,以16位寄存器PC作為基址寄存器,加上地址偏移量(累加器A中的8位內(nèi)容),形成操作數(shù)的地址,從該地址取出數(shù)據(jù)或常數(shù)送入累加器A中。該指令的表格位置設(shè)置有一定限制,它只能設(shè)在查表指令操作碼下的256個字節(jié)范圍之內(nèi),且注意如果MOVC指令與表格之間有n個字節(jié)距離時,則需先在累加器A上加上相應(yīng)的立即數(shù)n(十六進制數(shù))。例4.8試分析下列指令的執(zhí)行結(jié)果。

MOVA,#02H;(A)=02H,表明查表格中表項的序號02H

ADDA,#01H;(A)=(A)+01H=03H,其中01H為偏移量

;即MOVC指令與表格TAB之間有1個字節(jié)距離

MOVCA,@A+PC

RET

TAB:DB30H;對應(yīng)表格中表項序號為00H

DB31H;對應(yīng)表格中表項序號為序號為01H

DB32H;對應(yīng)表格中表項序號為序號為02H即查表后將程序存儲器表格中表項序號為02H處的常數(shù)32H取出并送入累加器A中。

例4.97段LED顯示碼按照0~9的順序放在以TAB標識的表首地址的數(shù)據(jù)表中,對每個要顯示的十進制數(shù)碼,就用其單字節(jié)BCD碼作為偏移量,加上表首地址,就可得到各個數(shù)碼的顯示碼。設(shè)要顯示的數(shù)碼6的BCD碼已經(jīng)放在內(nèi)部RAM的60H單元中,7段顯示碼放在程序中以TAB標號的表中。以下程序段執(zhí)行查表操作,將待顯示的數(shù)據(jù)的7段顯示碼從字型碼表中查出,并存放在63H單元。

MOVDPTR,#TAB

MOVA,60H

MOVCA,@A+DPTR

MOV63H,A

……

TAB:DB××H,××H,……

4.數(shù)據(jù)交換指令

數(shù)據(jù)傳送類指令一般都用來將操作數(shù)自源地址傳送到目的地址,指令執(zhí)行后,源地址的操作數(shù)不變,目的地址的操作數(shù)則修改為源地址的操作數(shù)。而數(shù)據(jù)交換指令的數(shù)據(jù)作雙向傳送,涉及傳送的雙方互為源地址、目的地址,指令執(zhí)行后自身的操作數(shù)都已修改為對方的操作數(shù)。因此,兩操作數(shù)均未沖掉、丟失。其匯編指令與操作如表4.10所示。表4.10數(shù)據(jù)交換指令的匯編指令與操作該類指令前3條是字節(jié)交換指令,表明累加器A的內(nèi)容可以和內(nèi)部RAM區(qū)中任何一個單元內(nèi)容進行交換。第4條是半字節(jié)交換指令,指令執(zhí)行后,只將A的低4位和Ri間址單元的低4位交換,而各自的高4位內(nèi)容保持不變。第5條指令是把累加器A的低半字節(jié)與高半字節(jié)進行交換。有了交換指令,使許多數(shù)據(jù)傳送更為高效、快捷,且不會丟失信息。

例4.10設(shè)(R0)=30H,(30H)=4AH,(A)=28H,試分析下列指令的執(zhí)行結(jié)果。

XCHA,@R0;結(jié)果為:(A)=4AH,(30H)=28H

XCHDA,@R0;結(jié)果為:(A)=48H,(30H)=2AH

SWAPA;結(jié)果為:(A)=84H

5.堆棧操作類指令

前已敘述,堆棧是用戶自己設(shè)定的內(nèi)部RAM中的一塊專用存儲區(qū),按照“先進后出”規(guī)律存取數(shù)據(jù),使用時一定要先設(shè)堆棧指針,堆棧指針缺省時,默認為SP=07H。

堆棧類操作指令用于對堆棧執(zhí)行數(shù)據(jù)傳送,共有兩條指令。其匯編指令與操作如表4.11所示。表4.11堆棧操作類指令的匯編指令與操作

PUSH指令是入棧指令,也稱壓棧指令,將direct地址中的操作數(shù)傳送到堆棧中。CPU執(zhí)行指令時分兩步:第一步先將SP中的棧頂?shù)刂芳?,指向一個空的堆棧單元作為新的棧頂;第二步將direct單元中的數(shù)據(jù)送入該空的棧頂單元。

POP指令是出棧指令,也稱彈出指令,將堆棧中的操作數(shù)傳送到direct單元。執(zhí)行該指令同樣分兩步:第一步先將當前SP所指棧頂單元中的數(shù)據(jù)送到direct所指單元中;第二步將SP中的地址減1,(SP)-1成為當前的新的棧頂單元。例4.11設(shè)(SP)=60H,(ACC)=30H,(B)=70H,試分析下列指令的執(zhí)行結(jié)果。

PUSHACC;(SP)←(SP)+1,(SP)=61H,(61H)←(ACC)

PUSHB;(SP)←(SP)+1,(SP)=62H,(62H)←(B)

結(jié)果:(61H)=30H,(62H)=70H,(SP)=62H。

進棧指令用于保護CPU現(xiàn)場。

例4.12設(shè)(SP)=62H,(62H)=70H,(61H)=30H,試分析下列指令的執(zhí)行結(jié)果。

POPDPH;(DPH)←((SP)),(SP)=(SP)-1

POPDPL;(DPL)←((SP)),(SP)=(SP)-1

結(jié)果:(DPTR)=7030H,(SP)=60H。

出棧指令用于恢復(fù)CPU現(xiàn)場。

堆棧類操作指令不影響標志位。它主要應(yīng)用于中斷服務(wù)程序中臨時保護數(shù)據(jù)及保護現(xiàn)場和恢復(fù)現(xiàn)場,即執(zhí)行中斷服務(wù)之前,先將必要的單元數(shù)據(jù)壓入堆棧保存,執(zhí)行完后,再將數(shù)據(jù)彈出。例4.13

……

MOVSP,#50H;以50H單元作為棧頂?shù)刂?/p>

……

INT0:;中斷服務(wù)子程序

PUSHACCPUSHB入棧操作

……

POPBPOPACC出棧操作

RETI上述程序段中,給SP賦值50H,作為棧頂?shù)刂?,在INT0子程序中,先將累加器A、B寄存器的數(shù)據(jù)入棧,放置時,SP指針先加1,指向51H單元,將A中的數(shù)據(jù)放入,然后SP再加1,指向52H,將B中的數(shù)據(jù)放入。程序結(jié)束時,將壓入堆棧的數(shù)據(jù)彈出,記住“先進后出、后進先出”原則,先彈出52H的數(shù)據(jù)到B,然后SP減1,指針指向51H,彈出數(shù)據(jù)到A,SP再減1。以上指令結(jié)果不影響程序狀態(tài)字寄存器PSW標志。注意:堆棧操作類指令是直接尋址指令,且必須是字節(jié)操作,要特別注意指令的書寫格式。比如,上例中累加器用ACC,而工作寄存器R0~R7要用直接地址00H~07H。4.3.2算術(shù)運算類指令

算術(shù)運算類指令包含了加、減、乘、除以及十進制調(diào)整等指令,使51單片機具有較強的運算能力。該類指令大多是雙操作數(shù)指令,累加器A總是存放第一操作數(shù),并作為目的地址存放操作結(jié)果。第二操作數(shù)可以是立即數(shù),或某工作寄存器Rn、內(nèi)存單元、間接尋址單元的內(nèi)容。運算操作將影響標志寄存器PSW中的某些位,如溢出標志位OV、進位標志位Cy、輔助進位AC、奇偶標志位P等。程序中通過監(jiān)視這些標志位,可方便地進行相關(guān)運算操作,如進位標志位用于多字節(jié)加法、減法運算等,溢出標志位用于實現(xiàn)補碼運算,輔助進位用于BCD碼運算等。

1.加法類指令

(1)加法指令,其匯編指令與操作如表4.12所示。表4.12加法指令的匯編指令與操作

參與運算的兩個操作數(shù)都是8位二進制數(shù),源地址的操作數(shù)和累加器A的操作數(shù)相加,和存放于A中。指令的執(zhí)行將影響標志寄存器PSW的位AC、Cy、OV、P。當和的第3位向第4位有進位時(即半字節(jié)進位),將AC置1,否則為0;當和的最高位(第7位)有進位時,將Cy置1,否則為0;和數(shù)中有奇數(shù)個1時,P為1,否則為0;OV位的值取決于最高位D7是否有進位和次高位D6位是否有進位,即OV=D7⊕D6。

圖4.6例4.14的ADD指令執(zhí)行示意圖例4.14設(shè)(A)=53H,(R5)=FCH,執(zhí)行ADDA,R5指令后的結(jié)果及相關(guān)標志位如圖4.6所示。

標志位Cy=1,OV=D7⊕D6=0。

運算結(jié)果是否正確,則需要考慮是將操作數(shù)看作無符號數(shù)還是符號數(shù),無符號整數(shù)相加時,若Cy位為1,說明和數(shù)有溢出(大于255)。有符號整數(shù)相加時,若OV位為1,說明和數(shù)大于+127或小于-128,即超過一個字節(jié)(8位)補碼所能表示的范圍,此時表示結(jié)果有錯。否則,OV=0。

在執(zhí)行加法指令中,操作數(shù)為帶符號數(shù)還是不帶符號數(shù),是編程者根據(jù)參加運算數(shù)據(jù)的性質(zhì)規(guī)定的。例4.15試分析下列指令的執(zhí)行結(jié)果。

序號指令注釋

①MOVPSW,#00H;其中標志(Cy)=0、(OV)=0、(AC)=0、(P)=0

②MOVA,#41H;(A)=41H

③ADDA,#7FH;(A)=(A)+7FH=B0H,且標志變化情況為(AC)=1,

;(Cy)=0,(OV)=1,(P)=0

(2)帶進位加法指令,其匯編指令與操作如表4.13所示。表4.13帶進位加法指令的匯編指令與操作

這組指令的功能是將A中的操作數(shù)、另一個操作數(shù)與Cy相加,結(jié)果存放于A中。此處的Cy是指令執(zhí)行前的值,而不是指令執(zhí)行中產(chǎn)生的值。其對標志位的影響與不帶進位加法指令的相同。此種加法指令常用于多字節(jié)相加。

例4.16設(shè)(A)=85H,(20H)=0FFH,CY=1,試分析下列指令的執(zhí)行結(jié)果。ADDCA,20H

執(zhí)行結(jié)果:(A)=85H,CY=1,AC=1,OV=0,P=1。

(3)加1指令,其匯編指令與操作如表4.14所示。表4.14加1指令的匯編指令與操作加1指令使指定的單元的內(nèi)容增加1,只有第一條指令I(lǐng)NCA能對奇偶標志位P產(chǎn)生影響,其余幾條不會對任何標志位產(chǎn)生影響。第五條指令是對數(shù)據(jù)指針進行16位加1運算,為地址加1提供了方便。

例4.17設(shè)(A)=0FFH,(R3)=0FH,(30H)=0F0H,(R0)=40H,(40H)=00H,試分析下列指令的執(zhí)行結(jié)果。

INCA;(A)←(A)+1

INCR3;(R3)←(R3)+1

INC30H;(30H)←(30H)+1

INC@R0;(R0)←((R0))+1執(zhí)行結(jié)果:(A)=00H,(R3)=10H,(30H)=0F1H,(40H)=01H,PSW狀態(tài)不改變。

由此例看出,加1指令可以非常靈活地運用于有遞增需要的場合。

(4)十進制調(diào)整指令,其匯編指令與操作如表4.15所示。

表4.15十進制調(diào)整指令的匯編指令與操作

當BCD碼按二進制數(shù)相加后,需用該指令對結(jié)果進行校正,才能得到正確的BCD碼的和值。一個字節(jié)可包含兩個BCD碼,稱為壓縮的BCD碼,調(diào)整過程如下:若累加器A的低四位字節(jié)(A)0~3>9或(AC)=1,則(A)0~3=(A)0~3+06H;

同時,若累加器A的高四位(A)4~7>9或(Cy)=1,則(A)4~7=(A)4~7+60H。

除此之外,累加器原數(shù)不變。

注意:①DA指令只能與加法指令(ADD或ADDC)配對出現(xiàn),它不能簡單地把累加器中的16進制數(shù)變換成BCD碼數(shù),實際是做十進制數(shù)加法運算。

②在調(diào)整之前參與加法運算的兩個數(shù)必須是壓縮BCD碼數(shù)(一個字節(jié)存放兩位BCD碼),和數(shù)也為壓縮BCD碼數(shù)。③不能用DA指令對十進制減法運算結(jié)果進行調(diào)整。

④十進制調(diào)整指令僅對進位位Cy產(chǎn)生影響,不影響OV標志位。

例4.18兩個4位BCD碼相加,設(shè)加數(shù)、被加數(shù)已經(jīng)按壓縮BCD碼從高位到低位存放在內(nèi)存單元中,被加數(shù)存于RAM的32H、31H,加數(shù)存于38H、39H,和存于5EH、5FH,設(shè)和不會溢出。

ORG0100H

MOVA,31H;被加數(shù)的BCD碼的低2位送A

ADDA,39H;與加數(shù)的BCD碼的低2位相加

DAA;作十進制調(diào)整

MOV5FH,A;低2位和值存于60H

MOVA,32H;被加數(shù)的高2位送A

ADDCA,38H;與加數(shù)的高2位相加

DAA;作十進制調(diào)整

MOV5EH,A;高2位和值存于61H

END

2.減法類指令

(1)帶借位減法指令,其匯編指令與操作如表4.16所示。表4.16帶借位減法指令的匯編指令與操作

帶借位減法指令是從累加器A中減去進位標志Cy的值和指定的變量的值,結(jié)果存放于A中,將影響標志位Cy、AC、OV、P。若第7位有借位,則Cy=1,否則為0;若第3位有借位,則AC=1,否則為0;若操作數(shù)被視為符號數(shù),當有溢出時,OV=1,否則為0;減法結(jié)果中的1的個數(shù)為奇數(shù)時,P=1,否則為0。

例4.19設(shè)(A)=0C9H,(R2)=54H,CY=1,試分析下列指令的執(zhí)行結(jié)果。SUBBA,R2

執(zhí)行結(jié)果:(A)=74H,CY=0,AC=0,OV=1,P=0。

MCS51的減法指令,只有帶進位減法這一種形式,沒有不帶進位減法的形式,但可以通過兩條指令組合來實現(xiàn)純減法功能。即

CLRC

SUBBA

(2)減1指令,其匯編指令與操作如表4.17所示。

表4.17減1指令的匯編指令與操作

減1指令是將指定的地址或單元中的內(nèi)容減1,結(jié)果仍存放于原單元中,不影響標志位。

例4.20試分析下列指令的執(zhí)行結(jié)果。

MOVR0,#7FH;(R0)=7FH

MOV7EH,#00H;(7EH)=00H

MOV7FH,#40H;(7FH)=40H

DEC@R0;((R0))=(7FH)=(7FH)-1=3FH

DECR0;(R0)=(R0)-1=7FH-1=7EH

DEC@R0;((R0))=(7EH)=(7EH)-1=FFH

若原字節(jié)為00H,減1后將變?yōu)镕FH,不影響標志(除DECPSW指令外)。

3.乘法指令

乘法指令的匯編指令與操作如表4.18所示。表4.18乘法指令的匯編指令與操作

乘法指令是將累加器A和寄存器B中的兩個無符號整數(shù)相乘,所得積的高8位存于B,低8位存于A。該操作將會對OV、Cy和P標志位產(chǎn)生影響:當乘積結(jié)果大于255(0FFH)時,溢出標志OV=1,否則為0;進位標志Cy總是被清零;當累加器A中1的個數(shù)為奇數(shù)時,奇偶校驗標志位P=1,否則為0。例4.21試編寫程序完成100d×55d,將結(jié)果存放于60H(高8位)、61H(低8位)。

ORG0030H

MOVA,#100;十進制被乘數(shù)賦值給A

MOVB,#55;十進制乘數(shù)賦給B

MULAB;兩數(shù)相乘(A)×(B)=5500

MOV60H,B;積的高8位送RAM的60H

MOV61H,A;積的低8位送RAM的61H

END

執(zhí)行結(jié)果:(60H)=15H,(61H)=7CH,轉(zhuǎn)換為十進制是5500。

4.除法指令

除法指令的匯編指令與操作如表4.19所示。表4.19除法指令的匯編指令與操作

除法指令是將累加器A中的8位無符號整數(shù)除以寄存器B中的8位無符號整數(shù),所得商的整數(shù)部分存放在A中,余數(shù)部分存放在B中。該操作對Cy和P標志位的影響同乘法指令。當B中的值為00H,則執(zhí)行結(jié)果是不確定的值,且置溢出標志OV為1,表明該次除法是無意義的;其余情況均清零Cy。例4.22試編寫程序完成240d÷55d,將結(jié)果存放于50H(商)、51H(余數(shù))。

ORG0030H

MOVA,#0F0H;將0F0H(240)送累加器A

MOVB,#37H;將37H(55)送寄存器B

DIVAB;執(zhí)行除法指令

MOV50H,A;將執(zhí)行除法后的商送內(nèi)部RAM的50H單元

MOV51H,B;余數(shù)送51H

END

執(zhí)行結(jié)果:(50H)=04H(商),(51H)=14H(余數(shù))。4.3.3邏輯運算及移位類指令

邏輯運算及移位類指令共有24條,其中邏輯指令有“與”、“或”、“異或”、累加器A清零和求反20條,移位指令4條。

1.邏輯“與”運算指令

邏輯“與”運算指令的匯編指令與操作如表4.20所示。

表4.20“與”運算指令的匯編指令與操作

邏輯“與”運算指令是將兩個指定的操作數(shù)按位進行邏輯“與”的操作。例4.23設(shè)(A)=07H,(R0)=0FDH,試分析下列指令的執(zhí)行結(jié)果。ANLA,R0

執(zhí)行結(jié)果:(A)=05H。

例4.24設(shè)(A)=FAH=11111010B,(R1)=7FH=01111111B,試分析下列指令的執(zhí)行結(jié)果。

ANLA,R1;(A)=11111010∧01111111

執(zhí)行結(jié)果為:(A)=01111010B=7AH。

邏輯“與”ANL指令常用于屏蔽(置0)字節(jié)中某些位。若清除某位,則用“0”和該位相與;若保留某位,則用“1”和該位相與。

例4.25設(shè)(P1)=D5H=11010101B,屏蔽P1口高4位。

執(zhí)行指令:ANLP1,#0FH;(P1)←(P1)∧00001111

執(zhí)行結(jié)果為:(P1)=05H=00000101B。

2.邏輯“或”運算指令

邏輯“或”運算指令的匯編指令與操作如表4.21所示。表4.21“或”運算指令的匯編指令與操作

邏輯“或”運算指令將兩個指定的操作數(shù)按位進行邏輯“或”操作。它常用來使字節(jié)中某些位置“1”,欲保留(不變)的位用“0”與該位相或,而欲置位的位,則用“1”與該位相或。

例4.26設(shè)(P1)=05H,(A)=33H,試分析下列指令的執(zhí)行結(jié)果。

ORLP1,A

執(zhí)行結(jié)果:(P1)=37H。例4.27若(A)=C0H,(R0)=3FH,(3F)=0FH,試分析下列指令的執(zhí)行結(jié)果。

ORLA,@R0;(A)←(A)∨((R0))

執(zhí)行結(jié)果為:(A)=CFH。

例如:根據(jù)累加器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.邏輯“異或”運算指令

邏輯“異或”運算指令的匯編指令與操作如表4.22所示。

表4.22“異或”運算指令的匯編指令與操作

邏輯“異或”運算指令常用來對字節(jié)中某些位進行取反操作,欲使某位取反則該位與“1”相異或;欲使某位保留,則該位與“0”相異或。還可利用異或指令對某單元自身異或,以實現(xiàn)清零操作。

例4.28若(A)=B5H=10110101B,試分析下列指令的執(zhí)行結(jié)果。

XRLA,#0F0H;A的高4位取反,低4位保留

MOV30H,A;(30H)←(A)=45H

XRLA,30H;自身異或使A清零

執(zhí)行結(jié)果:(A)=00H。以上邏輯“與”、“或”、“異或”各6條指令有如下共同的特點:

(1)邏輯“與”ANL、“或”O(jiān)RL、“異或”XRL運算指令除邏輯操作功能不同外,三者的尋址方式相同,指令字節(jié)數(shù)相同,機器周期數(shù)相同。

(2)ANL、ORL、XRL的前兩條指令的目的操作數(shù)均為直接地址方式,可很方便地對內(nèi)部RAM的00H~FFH任意單元或特殊功能寄存器的指定位進行清零、置位、取反、保持等邏輯操作。當direct為端口P0~P3地址時,這些指令均為“讀-修改-寫”指令。

(3)ANL、ORL、XRL的后4條指令,其邏輯運算的目的操作數(shù)均在累加器A中,且邏輯運算結(jié)果保存在A中。

4.累加器A清零與取反指令

累加器A清零與取反指令的匯編指令與操作見表4.23所示。表4.23累加器A清零與取反指令的匯編指令與操作

第1條是對累加器A清零指令,第2條是把累加器A的內(nèi)容取反后再送入A中保存的對A求反指令,它們均為單字節(jié)指令。若用其它方法達到清零或取反的目的,則至少需用雙字節(jié)指令。

5.移位指令

移位指令有循環(huán)左移、帶進位循環(huán)左移、循環(huán)右移和帶進位循環(huán)右移4條指令,移位只能對累加器A進行,其指令如下:

循環(huán)左移:

RLA;(An+1)←(An),(A0)←(A7)帶進位位循環(huán)左移:

RLCA;(An+1)←(An),(CY)←(A7),(A0)←(CY)

循環(huán)右移:

RRA;(An)←(An+1),(A7)←(A0)

帶進位位循環(huán)右移:

RRCA;(An)←(An+1),(CY)←(A0),(A7)←(CY)

以上移位指令操作,可用圖4.7表示。

另外,在前述數(shù)據(jù)傳送類指令中有一條累加器A的內(nèi)容半字節(jié)交換指令:

SWAPA;(A)7~4=(A)3~0

它實際上相當于執(zhí)行循環(huán)左移指令4次。該指令在BCD碼的變換中非

溫馨提示

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

評論

0/150

提交評論