版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
指令系統(tǒng)與匯編語(yǔ)言程序設(shè)計(jì)演示文稿目前一頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)指令系統(tǒng)與匯編語(yǔ)言程序設(shè)計(jì)目前二頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)2.1概述單片機(jī)程序設(shè)計(jì)語(yǔ)言的種類匯編語(yǔ)言指令格式及常用偽指令MCS-51指令的分類MCS-51指令中常用的符號(hào)目前三頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)2.1概述單片機(jī)程序設(shè)計(jì)語(yǔ)言的種類按照語(yǔ)言的結(jié)構(gòu)及其功能可以分為三種:(1)機(jī)器語(yǔ)言(MachineLanguage)直接用機(jī)器碼(0、1代碼)編寫程序、能夠?yàn)橛?jì)算機(jī)直接執(zhí)行的機(jī)器級(jí)語(yǔ)言。機(jī)器碼是一串由二進(jìn)制代碼“0”和“1”組成的二進(jìn)制數(shù)據(jù),其執(zhí)行速度快,但是可讀性極差。機(jī)器語(yǔ)言一般只在簡(jiǎn)單的開(kāi)發(fā)裝置中使用,程序的設(shè)計(jì)、輸入、修改和調(diào)試都很麻煩。機(jī)器語(yǔ)言匯編語(yǔ)言高級(jí)語(yǔ)言目前四頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)2.1概述(2)匯編語(yǔ)言(AssemblyLanguage)
指用指令助記符代替機(jī)器碼的編程語(yǔ)言。匯編語(yǔ)言程序結(jié)構(gòu)簡(jiǎn)單,執(zhí)行速度快,程序易優(yōu)化,編譯后占用存儲(chǔ)空間小,是單片機(jī)應(yīng)用系統(tǒng)開(kāi)發(fā)中最常用的程序設(shè)計(jì)語(yǔ)言。匯編語(yǔ)言的缺點(diǎn)是可讀性比較差,只有熟悉單片機(jī)的指令系統(tǒng),并具有一定的程序設(shè)計(jì)經(jīng)驗(yàn),才能研制出功能復(fù)雜的應(yīng)用程序。單片機(jī)程序設(shè)計(jì)語(yǔ)言的種類按照語(yǔ)言的結(jié)構(gòu)及其功能可以分為三種:機(jī)器語(yǔ)言匯編語(yǔ)言高級(jí)語(yǔ)言目前五頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)2.1概述(3)高級(jí)語(yǔ)言(High-LevelLanguage)
在匯編語(yǔ)言的基礎(chǔ)上用接近人的自然語(yǔ)言的語(yǔ)句來(lái)編寫程序,例如PL/M-51、C51等,程序可讀性強(qiáng),通用性好,適用于不熟悉單片機(jī)指令系統(tǒng)的的用戶。高級(jí)語(yǔ)言是面向過(guò)程而獨(dú)立于機(jī)器的通用語(yǔ)言。缺點(diǎn)是實(shí)時(shí)性不高,結(jié)構(gòu)不緊湊,編譯后占用存儲(chǔ)空間比較大,這一點(diǎn)在存儲(chǔ)器有限的單片機(jī)應(yīng)用系統(tǒng)中沒(méi)有優(yōu)勢(shì)。單片機(jī)的匯編語(yǔ)言不但不會(huì)被高級(jí)語(yǔ)言完全取代,甚至還將繼續(xù)占據(jù)重要地位。2.1單片機(jī)程序設(shè)計(jì)語(yǔ)言的種類按照語(yǔ)言的結(jié)構(gòu)及其功能可以分為三種:機(jī)器語(yǔ)言匯編語(yǔ)言高級(jí)語(yǔ)言目前六頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)2.1概述匯編語(yǔ)言指令格式及常用偽指令1、常用單位與術(shù)語(yǔ)
位(bit):位是計(jì)算機(jī)所能表示的最小的、最基本的數(shù)據(jù)單位,通常是指一個(gè)二進(jìn)制位。字節(jié)(Byte):一個(gè)連續(xù)的8位二進(jìn)制數(shù)碼稱為一個(gè)字節(jié),即1Byte=8bit。
字(Word):通常由16位二進(jìn)制數(shù)碼組成,即1Word=2Byte。
字長(zhǎng):字長(zhǎng)是指計(jì)算機(jī)一次處理二進(jìn)制數(shù)碼位的多少。MCS-51型單片機(jī)是8位機(jī),即它的字長(zhǎng)為8位。目前七頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)2、匯編語(yǔ)言指令格式[標(biāo)號(hào):]操作碼[操作數(shù)][,操作數(shù)][;注釋]2.1概述匯編語(yǔ)言指令格式及常用偽指令其中:[]項(xiàng)是可選項(xiàng)。標(biāo)號(hào):指本條指令起始地址的符號(hào),也稱為指令的符號(hào)地址。代表該條指令在程序編譯時(shí)的具體地址。操作碼:又稱助記符,它是由對(duì)應(yīng)的英文縮寫構(gòu)成的,是指令語(yǔ)句的關(guān)鍵。它規(guī)定了指令具體的操作功能,是一條指令中不可缺少的內(nèi)容。操作數(shù):它既可以是一個(gè)具體的數(shù)據(jù),也可以是存放數(shù)據(jù)的地址。Start:MOVA,#0FH;將循環(huán)次數(shù)初值送累加器目前八頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)3、常用偽指令2.1概述匯編語(yǔ)言指令格式及常用偽指令偽指令(也稱為匯編程序的控制命令)是程序員發(fā)給匯編程序的命令,用來(lái)設(shè)置符號(hào)值、保留和初始化存儲(chǔ)空間、控制用戶程序代碼的位置。偽指令只出現(xiàn)在匯編前的源程序中,僅提供匯編用的某些控制信息,不產(chǎn)生可執(zhí)行的目標(biāo)代碼,是CPU不能執(zhí)行的指令。目前九頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)(2)結(jié)束匯編偽指令END
格式:[標(biāo)號(hào):]END[表達(dá)式]功能:放在源程序的末尾,表明源程序的匯編到此結(jié)束。2.1概述(1)定位偽指令ORG格式:ORGn其中:n為絕對(duì)地址,可以是十六進(jìn)制數(shù)、標(biāo)號(hào)或表達(dá)式。[例] ORG 1000HSTART:MOVA,#20H MOVR0,#30H┇ MOVX@DPTR,AEND3、常用偽指令匯編語(yǔ)言指令格式及常用偽指令目前十頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)(3)賦值偽指令EQU
格式:字符名稱xEQU賦值項(xiàng)n功能:將賦值項(xiàng)n的值賦予字符名稱x。2.1概述
ORG1000HLEDMAP:DB3fh,06h,5bh,4fh,66h,6dh,7dh,07hDB7fh,6fh,77h,7ch,39h,5eh,79h,71h;LEDBufEQU60h;顯示緩沖(4)定義字節(jié)偽指令DB格式:[標(biāo)號(hào):]DBx1,x2,…,xn功能:將8位數(shù)據(jù)(或8位數(shù)據(jù)組)x1,x2,…,xn順序存放在從當(dāng)前程序存儲(chǔ)器地址開(kāi)始的存儲(chǔ)單元中。2.13、常用偽指令匯編語(yǔ)言指令格式及常用偽指令目前十一頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)1、按指令字節(jié)數(shù)分類單字節(jié)指令、雙字節(jié)指令和三字節(jié)指令。2.1概述字
節(jié)執(zhí)行時(shí)
間單字節(jié)指令49條1個(gè)機(jī)器周期指令64條雙字節(jié)指令46條2個(gè)機(jī)器周期指令45條三字節(jié)指令16條4個(gè)機(jī)器周期指令2條2.1.3MCS-51指令的分類
MCS-51指令系統(tǒng)有111條指令,可按下列3種方式分類:2、按指令執(zhí)行時(shí)間分類單機(jī)器周期指令、雙機(jī)器周期指令和四機(jī)器周期指令。目前十二頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)1、按指令字節(jié)數(shù)分類
2.1概述2、按指令執(zhí)行時(shí)間分類
3、按指令功能分類
序號(hào)功能數(shù)量1數(shù)據(jù)傳送指令28條2算術(shù)運(yùn)算指令24條3邏輯運(yùn)算與移位指令25條4控制轉(zhuǎn)移指令17條5位操作指令17條2.12.1.3MCS-51指令的分類
MCS-51指令系統(tǒng)有111條指令,可按下列3種方式分類:目前十三頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)2.1.4指令中的常用符號(hào)Rn(n=0~7):表示當(dāng)前工作寄存器R0~R7中的任一個(gè)。Ri(i=0或1):表示當(dāng)前寄存器組中用于間址的R0或R1。#data:表示8位立即數(shù)。#data16:表示16位立即數(shù)。direct:表示片內(nèi)RAM的8位單元地址。addr11:表示11位目的地址,用于ACALL和AJMP指令中。
addr16:表示16位目的地址,用于LCALL和LJMP指令中。rel:用補(bǔ)碼形式表示的8位二進(jìn)制地址偏移量,取值范圍為128~+127,主要用于相對(duì)轉(zhuǎn)移指令。
2.1概述目前十四頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)
bit:表示片內(nèi)RAM的位尋址區(qū),或者是可以位尋址的SFR的位地址。
A(或ACC)、B:表示累加器、B寄存器。
C:表示PSW中的進(jìn)位標(biāo)志位Cy。@:在間接尋址方式中,是間址寄存器指針的前綴標(biāo)志。$:表示當(dāng)前的指令地址。(X):表示由X所指定的某寄存器或某單元中的內(nèi)容。((X)):表示由X間接尋址單元中的內(nèi)容。2.1.4指令中的常用符號(hào)
2.1概述2.1目前十五頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)寄存器尋址直接尋址立即數(shù)尋址寄存器間接尋址變址尋址相對(duì)尋址位尋址2.2尋址方式在指令的操作數(shù)位置上,用于表征尋找操作數(shù)的方法定義為“尋址方式”。正確地理解、掌握尋址方式,是學(xué)習(xí)、使用指令的關(guān)鍵。在MCS-51單片機(jī)中,共使用了以下7種尋址方式——目前十六頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)2.2.1寄存器尋址指令中含有一個(gè)存有操作數(shù)的寄存器Rn(n=0~7)2.2尋址方式【特點(diǎn)】寄存器尋址方式的指令大多是單字節(jié)指令。寄存器的3位代碼與操作碼OP共同占用一個(gè)指令字節(jié)。
例:MOVA,Rn;將寄存器Rn中的內(nèi)容送累加器A中MOVRn,A;將累加器A中的數(shù)據(jù)送寄存器Rn以MOVA,R7為例,使用R7寄存器,所以rrr=111,即指令的機(jī)器碼為:0EFH11101rrr操作碼OP寄存器代碼111E8H~EFHMOVA,RnROM的一個(gè)字節(jié)2.2目前十七頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)2.2.2直接尋址指令本身直接給出操作數(shù)在RAM中存放的地址。2.2尋址方式MOVA,direct;將內(nèi)存地址direct中的內(nèi)容送入累加器MOVdirect1,direct2;將內(nèi)存地址direct2的內(nèi)容送入direct1中例如:MOVA,30H;將RAM30H單元數(shù)據(jù)送累加器A【特點(diǎn)】直接尋址方式的指令為2~3字節(jié)指令。每個(gè)直接地址
自身占用一個(gè)指令字節(jié)。
程序ROMOP30H數(shù)據(jù)RAM操作數(shù)xnn+130H累加器AX目前十八頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)使用直接尋址應(yīng)注意的兩個(gè)問(wèn)題:1、當(dāng)?shù)刂非『迷赟FR區(qū)域時(shí),地址也可用寄存器名來(lái)表示。
2.2.2直接尋址2.2尋址方式如:MOVA,80H可以寫成MOVA,P0
后者用SFR中寄存器的名字取代它的物理地址80H。后者更容易閱讀和交流,所以提倡使用SFR中寄存器名稱來(lái)代替直接地址。如:MOVA,SBUF;串口數(shù)據(jù)緩沖器數(shù)據(jù)送AMOVTH1,#0FEH;為定時(shí)器1賦初值 目前十九頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)MOVA,00H;將RAM中00H單元數(shù)據(jù)送累加器AMOVA,R0;將工作寄存器R0的內(nèi)容送累加器A返回2.2.2直接尋址2.2尋址方式2、當(dāng)直接地址是在工作寄存器區(qū)中時(shí),可以使用兩種尋址方式來(lái)訪問(wèn)。如:使用了不同的尋址方式,指令的結(jié)構(gòu)與字節(jié)數(shù)也不相同。前者是:11100101(0E5H)、00000000(00H)雙字節(jié)。后者是:11101000(0E8H)
單字節(jié);最好用寄存器尋址方式來(lái)訪問(wèn)類似的還有累加器A:
INCA寄存器尋址方式(單字節(jié));
INCACC直接尋址方式(雙字節(jié));
INC0E0H直接尋址方式(雙字節(jié))。
2.2目前二十頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)2.2.3立即尋址指令中直接含有所需要的操作數(shù)data。2.2尋址方式MOVA,
#data ;將8位立即數(shù)送累加器AMOVDPTR,
#data16
;16位立即數(shù)送DPTR寄存器【特點(diǎn)】立即數(shù)尋址的指令長(zhǎng)度為2或3個(gè)字節(jié)。90H20H00HROMDPTR例:MOVDPTR,#2000Hnn+1n+2注:對(duì)于16位立即數(shù)指令,匯編時(shí)高8位在前,低8位在后。目前二十一頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)【注意】MOVA,#30H與MOVA,30H
兩者的區(qū)別。74H30Hnn+1ROM累加器AMOVA,#30HE5H30Hnn+1ROM累加器AMOVA,30HXX30HRAM2.2.3立即尋址2.2尋址方式2.2目前二十二頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)2.2.4寄存器間接尋址指令中含有保存操作數(shù)地址的寄存器(Ri或DPTR)。CPU首先從寄存器中找到操作數(shù)地址,然后再?gòu)脑摰刂分姓业讲僮鲾?shù)。2.2尋址方式MOVA,@Ri;MOVXA,@Ri;MOVX@DPTR,A 尋址范圍:
內(nèi)部RAM低128B(只能使用R0或R1作間址寄存器)、外部RAM。對(duì)于外部低256單元RAM的訪問(wèn),除可以使用DPTR外,還可以使用R0或R1作間址寄存器。下列的程序正確嗎——MOVR1,#80HMOVA,@R1目前二十三頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)MOVR0,#30H;立即數(shù)送R0寄存器MOVA,@R0;從RAM的30H單元取數(shù)送累加器AROM11100110RAMx30H30HR000H累加器A1232.2.4寄存器間接尋址【注意】MOVA,@R0和MOVA,R0指令的區(qū)別。2.22.2尋址方式MOVA,@R0執(zhí)行過(guò)程示意圖目前二十四頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)指令使用DPTR或PC中的內(nèi)容作為基地址,再與累加器A的內(nèi)容相加,其和作為操作數(shù)地址。如:MOVCA,
@A+PC
;PC內(nèi)容為基地址與A的內(nèi)容相加得 操作數(shù)地址,并將此操作數(shù)送AMOVCA,
@A+DPTR;DPTR內(nèi)容為基地址與A的內(nèi)容相加得操作數(shù)地址并將此操作數(shù)送A2.2.5變址尋址這是訪問(wèn)程序存儲(chǔ)器ROM中數(shù)據(jù)的唯一的尋址方式。變址尋址方式用于查表操作,而數(shù)據(jù)表是建立在程序存儲(chǔ)器ROM中。2.2尋址方式目前二十五頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)【例】已知ROM中的0300H-0309H為0~9的平方表,編程求A中數(shù)據(jù)的平方(設(shè)A=02H)。02H0300H81644936251694100302H累加器ADPTR0300H(DPTR)+02H(A)0302HMOVCA,@A+DPTR0300H平方表ALU解:MOVDPTR,#0300H
;指針DPTR賦表頭地址MOVCA,@A+DPTR
;從0302H單元取數(shù)4送AROM變址尋址2.22.2尋址方式目前二十六頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)相對(duì)轉(zhuǎn)移指令使用的一種尋址方式。2.2.6相對(duì)尋址
SJMPshort_lable2.2尋址方式無(wú)條件轉(zhuǎn)向短標(biāo)號(hào)short_lable地址
該指令操作碼為80H,操作數(shù)為偏移量rel(+127~-128),它由匯編程序匯編時(shí)自動(dòng)計(jì)算填入。計(jì)算公式為:rel=short_lable地址-PC值,或:rel=short_lable地址-相對(duì)轉(zhuǎn)移指令地址-相對(duì)轉(zhuǎn)移指令字節(jié)數(shù)即相對(duì)轉(zhuǎn)移指令中給出一個(gè)轉(zhuǎn)移地址的偏移量rel。在執(zhí)行中將當(dāng)前PC值(執(zhí)行當(dāng)前指令后的PC值)與偏移量rel(補(bǔ)碼)相加,形成實(shí)際轉(zhuǎn)移的目標(biāo)地址相對(duì)尋址方式。目前二十七頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)【例】ORG0100HS1:CLRAMOVR0,#45HSJMPS2SETBCSETB00HS2:MOVA,#0FH...E4H78H45H80H03HD3HD2H00H74H0FH…0100H0106H0103H0105H0108HShort_lablePC值rel值0105H+03H0108HALU03H0105HAPC2.2尋址方式2.2目前二十八頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)指令的形式同直接尋址相似,不同的是:指令中的地址是“位地址”,而不是字節(jié)地址。
MOVC,bit2.2.7位尋址 如:MOVC,02H;將位地址為02H中的內(nèi)容送Cy中 類似的還有邏輯運(yùn)算指令等。除了RAM中的位尋址區(qū)外,大多SFR(地址能夠被8整除的)都可以按位尋址,這對(duì)編程尤為重要。2.2尋址方式目前二十九頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)作為嵌入式控制器,CPU更多的是處理“開(kāi)關(guān)量”而不單純是字節(jié)結(jié)構(gòu)的數(shù)據(jù)。因此MCS-51在指令設(shè)計(jì)上刻意設(shè)計(jì)了大量的“布爾操作”即位操作,這為系統(tǒng)應(yīng)用帶來(lái)了很大的方便。MCS-51單片機(jī)控制、檢測(cè)系統(tǒng)驅(qū)動(dòng)器電動(dòng)機(jī)外設(shè)1外設(shè)2狀態(tài)信號(hào)狀態(tài)信號(hào)控制信號(hào)2.2.7位尋址2.2尋址方式目前三十頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)【舉例】:SETB90H;將P1口的D0位置1 為了增加程序的可讀性,凡在SFR中的位地址都可以使用符號(hào)來(lái)替代。如本例中,完全可以使用下面的指令格式:
SETBP1.0;將P0口的D0位置1 又如:SETBEA(SETB0AFH);開(kāi)中斷
SETBTR0(SETB8CH);啟動(dòng)定時(shí)器這種指令在編譯時(shí),是要先將符號(hào)地址進(jìn)行轉(zhuǎn)換的。2.22.2.7位尋址2.2尋址方式目前三十一頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)2.3MCS-51指令系統(tǒng)預(yù)備知識(shí):WAVE仿真開(kāi)發(fā)軟件安裝與使用數(shù)據(jù)傳送指令算邏運(yùn)算與移位指令控制轉(zhuǎn)移和位操作指令目前三十二頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)WAVE仿真開(kāi)發(fā)軟件把源程序編輯、編譯、下載、調(diào)試等操作全部集中在一個(gè)環(huán)境下進(jìn)行,支持MCS-51、PIC兩大系列、不同種類的單片機(jī)。具有軟件模擬執(zhí)行功能,除輸入、輸出操作外,均可在軟件模擬環(huán)境下完成絕大部分應(yīng)用程序的調(diào)試。
2.3.0WAVE仿真軟件的安裝與使用2.3MCS-51指令系統(tǒng)1、WAVE仿真軟件功能簡(jiǎn)介目前三十三頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)2.3MCS-51指令系統(tǒng)2、WAVE仿真軟件的安裝1)從WAVE網(wǎng)站/download.htm
(南京偉福實(shí)業(yè)有限公司)下載WAVE6000forWindows(支持LAB2000)仿真開(kāi)發(fā)軟件(ZIP壓縮文件格式),經(jīng)ZIP解壓后,運(yùn)行其中的SETUP.EXE文件即可,該安裝程序?qū)⒁龑?dǎo)用戶完成WAVE6000仿真開(kāi)發(fā)軟件的安裝過(guò)程。2)從課件郵箱下載應(yīng)用程序文件“wave6000_G”,雙擊安裝即可。2.3.0WAVE仿真軟件的安裝與使用1、WAVE仿真軟件功能簡(jiǎn)介目前三十四頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)1)安裝后,從“WAVE6000_G\BIN”子目錄下雙擊wave圖標(biāo)進(jìn)入界面;2.3MCS-51指令系統(tǒng)3、WAVE仿真軟件的使用2、WAVE仿真軟件的安裝2.3.0WAVE仿真軟件的安裝與使用1、WAVE仿真軟件功能簡(jiǎn)介2)新建一個(gè)匯編語(yǔ)言的源程序(如:f1.asm);
3)編譯、調(diào)試。目前三十五頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)完成安裝后,首次啟動(dòng)看到的界面2.3.0WAVE仿真軟件的安裝與使用2.3MCS-51指令系統(tǒng)2.3目前三十六頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)2.3.1數(shù)據(jù)傳送指令2.3MCS-51指令系統(tǒng)內(nèi)部數(shù)據(jù)傳送類指令外部數(shù)據(jù)傳送類指令堆棧操作指令數(shù)據(jù)交換指令數(shù)據(jù)傳送是編程中使用最多、最主要的操作。在傳送過(guò)程中,源地址的內(nèi)容不被改變(COPY)。傳送類指令除了以累加器A為目標(biāo)的傳送對(duì)PSW的P有影響外,其余的傳送類指令對(duì)PSW一概無(wú)影響。操作碼數(shù)據(jù)的目標(biāo)地址數(shù)據(jù)的源地址指令通式:MOV
<dest>,<src
>2.3目前三十七頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)特點(diǎn):?jiǎn)纹瑱C(jī)內(nèi)部各單元之間的內(nèi)部數(shù)據(jù)傳送,指令的源操作數(shù)和目的操作數(shù)都在單片機(jī)內(nèi)部。1、立即尋址型傳送指令2、直接尋址型傳送指令3、寄存器尋址型傳送指令4、寄存器間址型傳送指令5、內(nèi)部數(shù)據(jù)傳送類指令的使用2.3.1.1內(nèi)部數(shù)據(jù)傳送指令2.32.3.1數(shù)據(jù)傳送指令目前三十八頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)1、立即尋址型傳送指令【特點(diǎn)】源操作數(shù)是立即數(shù),處在指令的第二或第三字節(jié),所以這類指令都是多字節(jié)指令,有如下4條。
MOVA,#data;A←data(雙字節(jié)指令)MOVRn,#data;Rn←data(雙字節(jié)指令)
MOV@Ri,#data;(Ri)←data(雙字節(jié)指令)
MOVdirect,#data;direct←data(三字節(jié)指令)這類指令多用于程序的初始化。如: MOVR0,#20H ;R0←#20H MOVA,#00H ;累加器A清零2.3.1數(shù)據(jù)傳送指令2.3.1.1內(nèi)部數(shù)據(jù)傳送指令目前三十九頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)【例】已知:R0=20H,試問(wèn)單片機(jī)執(zhí)行如下指令后,累加器A、R7、20H和21H單元中的內(nèi)容各是什么。MOVA,#18HMOVR7,#28H MOV@R0,#38H MOV21H,#48H2.3.1數(shù)據(jù)傳送指令1、立即尋址型傳送指令2.3.1.1內(nèi)部數(shù)據(jù)傳送指令目前四十頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)【特點(diǎn)】指令中至少含有一個(gè)源操作數(shù)或目的操作數(shù)的地址。是2個(gè)或3個(gè)字節(jié)的指令格式,其中直接地址在第2或第3個(gè)字節(jié)上。這類指令有如下5條:2、直接尋址型傳送指令2.3.1.1內(nèi)部數(shù)據(jù)傳送指令MOVA,direct MOVdirect,A MOVRn,direct MOV@Ri,direct MOVdirect2,direct1【注意】direct為內(nèi)部RAM和SFR的地址,即direct
適用于片內(nèi)所有的地址。2.3.1數(shù)據(jù)傳送指令目前四十一頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)
MOVA,30H;內(nèi)存RAM30h單元數(shù)據(jù)送A
MOV50H,A;A中內(nèi)容送RAM的50h單元
MOVR6,31H;RAM的30h內(nèi)容送R6寄存器
MOV@Ri,30H;RAM30h內(nèi)容送Ri指定的RAM單元
MOVP1,32H;RAM32h內(nèi)容送P1口(p1:符號(hào)地址)
MOV90H,32H;(同上,試比較兩種表示方法,一個(gè)指令兩種寫法)2.3.1數(shù)據(jù)傳送指令2、直接尋址型傳送指令2.3.1.1內(nèi)部數(shù)據(jù)傳送指令目前四十二頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)【特點(diǎn)】指令中含有存放操作數(shù)的寄存器名Rn,其中(n∈0,1,2,3,4,5,6,7)。
共有如下4條:
MOVA,Rn MOVRn,A MOVdirect,RnMOVRn,direct3、寄存器尋址型傳送指令2.3.1.1內(nèi)部數(shù)據(jù)傳送指令2.3.1數(shù)據(jù)傳送指令目前四十三頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)【特點(diǎn)】指令中Ri中存放的不是操作數(shù)本身,而是操作數(shù)在RAM中的地址(i=0、1)。格式如下:
MOVA,@Ri MOV@Ri,A MOVdirect,@Ri【注意】Ri中存放操作數(shù)的地址是有所選擇的,只有
非SFR的RAM單元才能使用這種尋址方式。4、寄存器間接尋址型傳送指令2.3.1.1內(nèi)部數(shù)據(jù)傳送指令2.3.1數(shù)據(jù)傳送指令目前四十四頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)【例】已知(40h)=11h,(41h)=22h,R0=40h和R1=41h。試問(wèn):下面的指令執(zhí)行后,累加器A、RAM的40h、41h和42h單元中的內(nèi)容各是什么。MOVA,@R0MOV@R1,AMOV42H,@R12.3.1數(shù)據(jù)傳送指令4、寄存器間接尋址型傳送指令2.3.1.1內(nèi)部數(shù)據(jù)傳送指令目前四十五頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)(1)不能根據(jù)主觀意愿去“創(chuàng)造”指令。
5、內(nèi)部數(shù)據(jù)傳送類指令的使用2.3.1.1內(nèi)部數(shù)據(jù)傳送指令例如:要將R0中的數(shù)據(jù)傳送到R1中。如何使用指令去完成上述的操作?
MOVR1,R0是否可以?
回答是否定的!因?yàn)樵贛CS-51的指令系統(tǒng)中沒(méi)有此條指令!只能使用:
MOVA,R0或:
MOV01h,00h
MOVR1,A
因此,必須從MCS-51的指令表中選擇使用指令。2.3.1數(shù)據(jù)傳送指令目前四十六頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)MCS-51內(nèi)部數(shù)據(jù)傳送類指令方式圖累加器Adirect直接尋址@Ri間址Rn寄存器Data立即數(shù)2.3.1.1內(nèi)部數(shù)據(jù)傳送指令2.3.1數(shù)據(jù)傳送指令返回目前四十七頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)(2)會(huì)正確地估計(jì)指令的字節(jié)。凡是包含有立即數(shù)、直接地址的指令,都應(yīng)當(dāng)在原有的基礎(chǔ)上加1或2?!九e例】mova,@Ri ()個(gè)字節(jié) mova,direct ()個(gè)字節(jié) movdirect,data ()個(gè)字節(jié) movdirect2,direct1()個(gè)字節(jié)(3)養(yǎng)成一個(gè)好的、合理的編程習(xí)慣。(4)注意給程序進(jìn)行適當(dāng)?shù)淖⑨專@對(duì)于閱讀、編寫和修改程序都是非常重要的。(1)不能根據(jù)主觀意愿去“創(chuàng)造”指令。2.3.1數(shù)據(jù)傳送指令5、內(nèi)部數(shù)據(jù)傳送類指令的使用2.3.1.1內(nèi)部數(shù)據(jù)傳送指令目前四十八頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)1、16位數(shù)傳送指令2、外部ROM的字節(jié)傳送指令3、外部RAM的字節(jié)傳送指令2.3.1.2外部數(shù)據(jù)傳送指令【特點(diǎn)】單片機(jī)內(nèi)部與外部之間的外部數(shù)據(jù)傳送。2.3.1數(shù)據(jù)傳送指令目前四十九頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)1、16位數(shù)傳送指令MCS-51指令系統(tǒng)中唯一的一條16位數(shù)據(jù)傳送類指令。
MOVDPTR,#data16DPTR是單片機(jī)內(nèi)部SFR中的兩個(gè)寄存器DPH、DPL組合而成。其中DPH為高八位,DPL為低八位。DPTR是一個(gè)專門用于訪問(wèn)外部存儲(chǔ)器的間址寄存器。尋址能力為64K(0~65535)。2.3.1數(shù)據(jù)傳送指令2.3.1.2外部數(shù)據(jù)傳送指令目前五十頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)這類指令有兩條,都屬于變址尋址指令。
MOVCA,@A+DPTR;A←(A+DPTR)
MOVCA,@A+PC;PC←PC+1,A←(A+PC)ROM單元地址由A和DPTR或PC內(nèi)容相加獲得。該指令稱為“查表”指令。前者用DPTR作為基地址;后者是以程序計(jì)數(shù)器PC為基地址。由于PC的內(nèi)容與該指令在ROM中的位置有關(guān),并且PC的值是不能隨便修改的,所以選擇PC作基地址時(shí),往往要通過(guò)累加器A進(jìn)行“查表修正”。2、外部ROM的字節(jié)傳送指令2.3.1數(shù)據(jù)傳送指令2.3.1.2外部數(shù)據(jù)傳送指令目前五十一頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)【例】已知累加器A中存有0~9范圍內(nèi)的數(shù),試用查表指令編寫出查找出該數(shù)平方的程序。1)采用DPTR作基址寄存器:
MOVDPTR,#2000H
;指針賦值
MOVCA,@A+DPTR;查表得平方值送AROM01491625364964812000h2009h2008h2007h2006h2005h2004h2003h2002h2001h2、外部ROM的字節(jié)傳送指令2.3.1數(shù)據(jù)傳送指令2.3.1.2外部數(shù)據(jù)傳送指令目前五十二頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)2)采用PC作基址寄存器
ORG1FFBH1FFBH74data
ADDA,#data;data=02h1FFDH83H
MOVCA,@A+PC;PC=1FFE1FFEH80FEH
SJMP$2000H00H
DB0
;平方表首址2001H01H
DB12002H04H
DB42003H09H
DB92004H10H
DB162005H19H
DB25
:::2009H51H
DB81
ENDdata為MOVC指令對(duì)表頭地址之間的單元數(shù)。74hdata83h80hFEh01491625364964812000h2009h2008h2007h2006h2005h2004h2003h2002h2001h1FFFh1FFEh1FFDh1FFCh1FFBh通過(guò)A進(jìn)行修正2.3.1數(shù)據(jù)傳送指令目前五十三頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)使用MOVCA,@A+PC
指令的特點(diǎn):1)與使用MOVCA,@A+DPTR指令不同,使用前應(yīng)當(dāng)對(duì)A中的偏移量加一個(gè)“修正值”,修正值的大小為:MOVC指令與表頭之間的字節(jié)數(shù);2)程序與數(shù)據(jù)表在ROM中的位置是可以浮動(dòng)的。只要MOVC指令與表之間的距離不變,則程序可以在ROM中的任意位置上“浮動(dòng)”,程序具有可修改性。2.3.1數(shù)據(jù)傳送指令2、外部ROM的字節(jié)傳送指令2.3.1.2外部數(shù)據(jù)傳送指令目前五十四頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)實(shí)現(xiàn)外部RAM和累加器A之間的數(shù)據(jù)傳送。只能使用寄存器間址的尋址方式。在MOVX指令模式下,單片機(jī)的P0、P2口做訪問(wèn)外部數(shù)據(jù)的地址和數(shù)據(jù)的總線。其中: P0口做低8位地址和數(shù)據(jù)的復(fù)用總線; P2口做高8位地址總線。3、外部RAM的字節(jié)傳送指令2.3.1.2外部數(shù)據(jù)傳送指令MOVXA,@Ri使用Ri寄存器間址尋址范圍0~255MOVX@Ri,A在硬件電路中P2口不用。MOVXA,@DPTR
;使用DPTR間址,尋址范圍0~65535MOVX@DPTR,A
;在硬件電路中,使用P0口輸出低8位,P2口輸出高8位外部RAM地址。2.3.1數(shù)據(jù)傳送指令目前五十五頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)【例】已知外部RAM的88H單元有一個(gè)數(shù)x,試編程將x送外部RAM的1818H單元?!窘狻浚和獠縍AM中的數(shù)據(jù)是不能直接傳送的,因此必須使用兩次MOVX指令完成此操作。
ORG2000H
MOVR0,#88H;為8位指針賦值 MOVDPTR,#1818H;為16位指針賦值 MOVXA,@R0;取x到累加器A MOVX@DPTR,A;x送RAM的1818h單元 SJMP$;停機(jī) END2.3.1.2外部數(shù)據(jù)傳送指令返回2.3.1數(shù)據(jù)傳送指令目前五十六頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)堆棧操作是一種特殊的保護(hù)數(shù)據(jù)的傳送指令。堆棧:一個(gè)用來(lái)保存程序斷點(diǎn)、數(shù)據(jù)的存儲(chǔ)區(qū)域。在51單片機(jī)中,棧區(qū)可以使用片內(nèi)RAM的任意位置,具體位置由指針SP來(lái)確定(系統(tǒng)上電時(shí),SP=07h)。1)進(jìn)棧操作:
PUSHdirect;sp+1→sp,(direct)→(sp)2)出棧操作:
POPdirect
;(sp)→(direct),sp-1→sp2.3.1.3堆棧操作指令2.3.1數(shù)據(jù)傳送指令“先加后壓”、“先彈后減”目前五十七頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)
org0800h
delay:
push00h push01h
movr0,#00hLoop1: movr1,#00hLoop2: djnzr1,loop2 djnzr0,loop1
pop01h pop00h
retRAMr1r0棧底SP思考:為什么R0、R1的內(nèi)容要進(jìn)棧?【例】產(chǎn)生延時(shí)的子程序delay。2.3.1.3堆棧操作指令2.3.1數(shù)據(jù)傳送指令目前五十八頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)①PUSH、POP指令使用的尋址方式為直接尋址,所以
pushaX(有的編譯系統(tǒng)識(shí)別,將a轉(zhuǎn)換為acc)pushacc√push0e0h√pushr0Xpush00h√②進(jìn)棧操作是堆棧向上“生長(zhǎng)”的過(guò)程,即sp+1;出棧則相反。③系統(tǒng)上電時(shí),SP=07h。SP的值可以根據(jù)需要進(jìn)行修改,在確定SP值時(shí)要考慮對(duì)棧區(qū)對(duì)數(shù)據(jù)區(qū)的影響,以避免兩者沖突。如:在程序的初始化時(shí)加一條:
MOVSP,60H使用PUSH、POP指令的注意事項(xiàng)2.3.1數(shù)據(jù)傳送指令目前五十九頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)一種方便的累加器和寄存器/RAM之間的數(shù)據(jù)交換。避免了使用MOV指令交換時(shí)的不便。格式:XCH a,Rn;a?Rn
XCH a,direct;a?(direct) XCH a,@Ri;a?(Ri)
XCHD a,@Ri;a3~0?(Ri)3~0低四位交換舉例:將R1和R2的內(nèi)容交換。MOVA,R1 ;取數(shù)據(jù)送A XCHA,R0;與R0交換 MOVR2,A ;送回到R12.3.1.4數(shù)據(jù)交換指令2.3.1數(shù)據(jù)傳送指令目前六十頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)【例】已知,片外RAM20h單元、內(nèi)部RAM20h單元分別有數(shù)x和y,試編程將兩數(shù)相互交換。
movR1,#20h;指針賦初值
movxa,@R1;x→a
xcha,@R1;交換a?(20h),y→amovx@R1,a;y→(20h)片外RAM片內(nèi)RAMy
(x)片外RAMx
(y)(y)
x20h20h累加器A123跳過(guò)例22.3.1.4數(shù)據(jù)交換指令2.3.1數(shù)據(jù)傳送指令目前六十一頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)【例】已知RAM50h單元有一個(gè)0~9范圍內(nèi)的數(shù),試編程將它變成相應(yīng)的ASCII碼?!窘狻浚?~9的ASCII碼是30h~39h,兩者相差30h。方法一:對(duì)50h單元的數(shù)據(jù)高四位組裝一個(gè)30h。 movr0,#50h;指針賦值 mova,#30h;30h→A xchda,@r0;A3~0?(r0)3~0,在A中組成ASCII碼 mov@r0,a;A中的ASCII碼送回50h單元0000010150h00110101A=30h交換后A=35h12方法二:把50H的內(nèi)容直接與30H相加,形成相應(yīng)的ASCII碼(略)2.3.1數(shù)據(jù)傳送指令2.3.1.4數(shù)據(jù)交換指令目前六十二頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)功能:完成算術(shù)運(yùn)算、邏輯運(yùn)算和循環(huán)移位三大功能。特點(diǎn):大多指令都要由累加器A來(lái)存放一個(gè)源操作數(shù),并把操作結(jié)果放回累加器A中。算術(shù)運(yùn)算指令邏輯運(yùn)算指令移位指令2.32.3.2算邏運(yùn)算和移位指令目前六十三頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)2.3.2.1算術(shù)運(yùn)算指令不帶進(jìn)位的加法指令(ADD)1、加法指令:帶進(jìn)位的加法指令(ADDC)加1指令(INC)(編程舉例)2、減法指令:帶進(jìn)位的減法指令(SUBB)減1指令(DEC)3、十進(jìn)制調(diào)整指令:(DAA)4、乘法和除法指令:(MULDIV)2.3.2算邏運(yùn)算和移位指令目前六十四頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)1、加法指令(之一):不帶進(jìn)位的加法指令格式: ADDA,Rn ;A+Rn→A
ADDA,direct ;A+(direct)→A
ADDA,@Ri ;A+(Ri)→A
ADDA,#data ;A+data→A【注意】①參加運(yùn)算的數(shù)據(jù)都應(yīng)是8位的,結(jié)果也是8位并影響PSW。②根據(jù)編程者的需要,8位數(shù)據(jù)可以是無(wú)符號(hào)數(shù)(0~255),也可以是有符號(hào)數(shù)(-128~+127)。③不論編程者使用的數(shù)據(jù)是有符號(hào)數(shù)還是無(wú)符號(hào)數(shù),CPU都將它們視為有符號(hào)數(shù)(補(bǔ)碼)進(jìn)行運(yùn)算并影響PSW。2.3.2.1算術(shù)運(yùn)算指令2.3.2算邏運(yùn)算和移位指令目前六十五頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)【例】分析執(zhí)行下列指令后累加器A和PSW中各標(biāo)志的變化。 MOVA,#19HCy=0; ADDA,#66HAC=0OV=CP?CS=025A=00011001BP=1
+102data=01100110B127001111111B
1)若兩數(shù)都是無(wú)符號(hào)數(shù),則因Cy=0無(wú)溢出,25+102=127。2)若兩個(gè)數(shù)是有符號(hào)數(shù),則因OV=0無(wú)溢出。cy000CPCSAC1、加法指令(之一):不帶進(jìn)位的加法指令2.3.2.1算術(shù)運(yùn)算指令2.3.2算邏運(yùn)算和移位指令目前六十六頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)【例】分析執(zhí)行下列指令后累加器A和PSW中各標(biāo)志的變化。 MOVA,#5AHCy=0; ADDA,#6BHAC=1;
OV=CP?CS=190A=01011010BP=0
+107data=01101011B197011000101B
CPCS
AC1)若兩數(shù)是無(wú)符號(hào)數(shù),因Cy=0無(wú)溢出:90+107=1972)若兩數(shù)是有符號(hào)數(shù),因OV=1,故有溢出,兩個(gè)正數(shù)相加后變?yōu)樨?fù)數(shù),很明顯結(jié)果是不正確的。1、加法指令(之一):不帶進(jìn)位的加法指令2.3.2.1算術(shù)運(yùn)算指令2.3.2算邏運(yùn)算和移位指令目前六十七頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)格式:ADDCA,Rn ;A+Rn+Cy
→A
ADDCA,direct;A+(direct)+Cy→A
ADDCA,@Ri ;A+(Ri)+Cy
→A
ADDCA,#data;A+data+Cy
→A【注意】①這里的Cy是指令執(zhí)行前的Cy;②對(duì)PSW的影響同ADD指令。1、加法指令(之二):帶進(jìn)位的加法指令2.3.2.1算術(shù)運(yùn)算指令2.3.2算邏運(yùn)算和移位指令目前六十八頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)格式: INCA;累加器A加1
INCRn;Rn+1→Rn
INCdirect;內(nèi)存單元數(shù)據(jù)加1
INC@Ri;內(nèi)存單元數(shù)據(jù)加1
INCDPTR;dptr+1→dptr【注意】①除第一條對(duì)PSW的P有影響外,其余對(duì)PSW均無(wú)影響。
②由于上面的原因,INC指令不能作為一般的數(shù)據(jù)算術(shù)運(yùn)算使用(為什么?),而常用于修改數(shù)據(jù)指針等控制、循環(huán)語(yǔ)句中使用。1、加法指令(之三):加1指令(修改指針專用)2.3.2.1算術(shù)運(yùn)算指令2.3.2算邏運(yùn)算和移位指令目前六十九頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)【例】已知片內(nèi)M1、M2單元中存有兩個(gè)16位無(wú)符號(hào)數(shù)X1、X2(低位在前)。試寫出求解X1+X2的程序段,并將結(jié)果放入M1、M1+1單元(低8位在M1單元)。設(shè)兩數(shù)之和不會(huì)超過(guò)16位(65535)。RAMX2data8~15X2data0~7X1data8~15X1data0~7M1M1+1M2M2+11、加法指令2.3.2.1算術(shù)運(yùn)算指令2.3.2算邏運(yùn)算和移位指令目前七十頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)MOVR0,#M1;x1指針賦初值MOVR1,#M2;x2指針賦初值MOVA,@R0;取x1低8位送AADDA,@R1;x1與x2低8位相加MOV@R0,a;低8位和送m1單元INCR0 INCR1 ;修改指針MOVA,@R0;取x1的高8位送AADDCA,@R1;x1與x2的高8位和Cy相加MOV@R0,A
;結(jié)果送M1+1單元RAMX2data8~15X2data0~7X1data8~15X1data0~7M1M1+1M2M2+12.3.2算邏運(yùn)算和移位指令1、加法指令2.3.2.1算術(shù)運(yùn)算指令目前七十一頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)【例】要求在內(nèi)存40H單元開(kāi)始的16個(gè)單元建立一個(gè)數(shù)據(jù)區(qū),分別存0、1、2,……0FH;將該數(shù)據(jù)塊的數(shù)據(jù)移動(dòng)到外部存儲(chǔ)器2000H開(kāi)始的區(qū)域。片內(nèi)RAM0FH01H00H40H41H4FH……片外RAM0FH01H00H2000H2001H200FH……2.3.2算邏運(yùn)算和移位指令1、加法指令2.3.2.1算術(shù)運(yùn)算指令目前七十二頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)MOVR0,#40H;內(nèi)部RAM指針賦初值
MOVR2,#0FH;R2計(jì)數(shù)指針賦初值MOVA,#00H;第一個(gè)數(shù)據(jù)送ASTART:MOV@R0,A;開(kāi)始建立內(nèi)部RAM數(shù)據(jù)區(qū)
INCR0 ;指向下一單元
INCA;下一個(gè)數(shù)據(jù)
DJNZR2,START;是否是最后一個(gè)單元
MOVDPTR,#2000H;外部RAM指針賦初值
MOVR0,#40HMOVR2,#0FHLOOP
:MOVA,@R0;開(kāi)始傳送
MOVX@DPTR,AINCR0INCDPTRDJNZR2,LOOPSJMP$2.3.2算邏運(yùn)算和移位指令目前七十三頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)在MCS-51單片機(jī)的指令系統(tǒng)中,只有:
①帶進(jìn)位的減法SUBB
②減1DEC兩種減法指令。2、減法指令(之一)——帶進(jìn)位的減法指令2.3.2.1算術(shù)運(yùn)算指令格式:SUBBA,Rn ;A–Rn–Cy
→A
SUBBA,direct;A–(direct)–Cy
→A
SUBBA,@Ri ;A–(Ri)–Cy→A
SUBBA,#data;A–data–Cy
→A【注意】
①無(wú)論相減兩數(shù)是無(wú)符號(hào)數(shù)還是有符號(hào)數(shù),減法操作總是按有符號(hào)數(shù)來(lái)處理、影響PSW中相關(guān)的標(biāo)志(見(jiàn)舉例)。②在MCS-51的指令系統(tǒng)中沒(méi)有不帶Cy的減法,所以在使用SUBB指令前必須使用一條清除Cy的指令:CLRC。2.3.2算邏運(yùn)算和移位指令目前七十四頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)【例】分析執(zhí)行下列指令后累加器A和PSW中各標(biāo)志的變化。 CLRC MOVA,#52H01010010B=82 SUBBA,#0B4H10110100B=[-76]補(bǔ)
82a=01010010
–-76
data=10110100
158110011110=[-98]補(bǔ)
手工計(jì)算
CP
CS
AC
101
【分析】-98的結(jié)果顯然是錯(cuò)的。原因是OV=1,即產(chǎn)生了溢出。所以,對(duì)于符號(hào)數(shù)的減法在運(yùn)算后一定要檢測(cè)OV。2、減法指令(之一)——帶進(jìn)位的減法指令2.3.2.1算術(shù)運(yùn)算指令2.3.2算邏運(yùn)算和移位指令目前七十五頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)格式: DECA;累加器A減1
DECRn;Rn-1→Rn
DECdirect;內(nèi)存單元數(shù)據(jù)減1
DEC@Ri;內(nèi)存單元數(shù)據(jù)減1【注意】①除了第一條對(duì)PSW的P有影響外,其余對(duì)PSW均無(wú)影響。
②由于上面的原因,DEC指令一般不作為數(shù)據(jù)算術(shù)運(yùn)算使用(因?yàn)椴荒軐?duì)PSW的OV等位產(chǎn)生影響,它主要用于修改數(shù)據(jù)指針在循環(huán)語(yǔ)句中使用)。2、減法指令(之二)——減1指令(修改指針專用)2.3.2.1算術(shù)運(yùn)算指令2.3.2算邏運(yùn)算和移位指令目前七十六頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)CPU沒(méi)有專用的BCD碼加、減法指令,只能使用二進(jìn)制加法指令再通過(guò)十進(jìn)制調(diào)整指令實(shí)現(xiàn)BCD碼的運(yùn)算。格式:DAA;若AC=1或A3~0>9,則A+06h→A;若Cy=1或A7~4>9,則A+60h→A【注意】①DAA指令必須緊跟在加法指令之后;
②DAA指令只適用于加法指令的調(diào)整。3、十進(jìn)制調(diào)整指令2.3.2.1算術(shù)運(yùn)算指令2.3.2算邏運(yùn)算和移位指令目前七十七頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)【例】試寫出完成85+59的BCD碼的加法程序。
MOVA,#85H ADDA,#59H DAA SJMP$85a=10000101B+59dtat=01011001B1441101111
0B低4位>9,所以加06h
+00000110B
11100100B高4位>9,所以加60h
01100000B
101000100B結(jié)果為144h(1在Cy中)【注意】144H是用16進(jìn)制數(shù)來(lái)表示十進(jìn)制,即BCD碼。2.3.2.1算術(shù)運(yùn)算指令2.3.2算邏運(yùn)算和移位指令目前七十八頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)BCD減法運(yùn)算:由于DAA指令只能對(duì)BCD碼的加法進(jìn)行調(diào)整,所以遇到BCD碼的加法時(shí)就要將其減法變?yōu)榧臃ㄟ\(yùn)算,然后再使用DAA指令進(jìn)行調(diào)整。減法變加法就是使用BCD碼的補(bǔ)碼運(yùn)算法則:
將被減數(shù)-減數(shù)變?yōu)楸粶p數(shù)+減數(shù)的補(bǔ)碼。減數(shù)的補(bǔ)碼=BCD碼的模-減數(shù)其中BCD碼的模為100=99H+01H=9AH2.3.2.1算術(shù)運(yùn)算指令2.3.2算邏運(yùn)算和移位指令目前七十九頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)【例】在M1、M2中分別存有被減數(shù)91和減數(shù)36。試編程求91-36并將結(jié)果存入M3單元。
【解】:1)算法:91-36=91+(100-36)=91+(9A-36)2)編程:
CLRC;清除Cy
MOVA,#9AH;BCD碼的模100送A
SUBBA,M2;計(jì)算減數(shù)的補(bǔ)碼(結(jié)果在A中)
ADDA,M1;被減數(shù)+減數(shù)的補(bǔ)碼(結(jié)果在A中)
DAA;十進(jìn)制調(diào)整
MOVM3,A;結(jié)果送M3單元
CLRC ;清除進(jìn)位位(不要Cy)2.3.2.1算術(shù)運(yùn)算指令2.3.2算邏運(yùn)算和移位指令目前八十頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)這是MCS-51單片機(jī)唯一的一類單字節(jié)4周期指令,它相當(dāng)于4條加法指令的運(yùn)行時(shí)間。格式:MULAB;a×b=ba(b存高8位,a存低8位)
DIVAB
;a÷b=a…b(a存商,b存余數(shù))【注意】指令對(duì)標(biāo)志的影響:①
在乘法指令中對(duì)PSW的影響有Cy、OV、和P。其中:Cy←0;P取決于A中“1”的個(gè)數(shù);OV表明積的大小。當(dāng)積超過(guò)255(B≠0)時(shí),OV=1。
②在除法指令中,Cy、P與乘法相同。在執(zhí)行除法指令時(shí),若B=0時(shí)OV=1,表示除數(shù)=0除法無(wú)意義,其余情況下OV被復(fù)位。跳過(guò)舉例4、乘法和除法指令2.3.2.1算術(shù)運(yùn)算指令2.3.2算邏運(yùn)算和移位指令目前八十一頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)【例】是將內(nèi)存20H中的無(wú)符號(hào)二進(jìn)制數(shù)轉(zhuǎn)換為BCD碼,結(jié)果分別存入M、M+1、M+2單元。RAMBCD個(gè)位BCD十位BCD百位X20HMM+1M+1X÷100得百位數(shù)、余數(shù)余數(shù)÷10得十位數(shù)、余數(shù)(個(gè)位數(shù))4、乘法和除法指令2.3.2.1算術(shù)運(yùn)算指令2.3.2算邏運(yùn)算和移位指令目前八十二頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)【解】 MOVR0,#20H MOVR1,#M ;R1指向BCD碼百位 MOVB,#100 MOVA,@R0DIVAB;A÷B,商在A,余數(shù)在B MOV@R1,A ;商送RAMBCD碼單元MOVA,BMOVB,#10DIVAB INCR1 ;修改BCD碼指針
MOV@R1,A
INCR1 MOV@R1,B ;個(gè)位數(shù)送M+2單元2.3.2算邏運(yùn)算和移位指令目前八十三頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)算術(shù)運(yùn)算小結(jié)(1)指令對(duì)標(biāo)志的影響,不同類型的數(shù)據(jù)運(yùn)算后要根據(jù)對(duì)應(yīng)的標(biāo)志進(jìn)行溢出判斷;(2)DAA指令只能對(duì)加法進(jìn)行調(diào)整,且緊跟其指令,對(duì)于BCD碼的減法要首先轉(zhuǎn)換為加法模式后再使用DAA調(diào)整;(3)減法指令都是帶Cy位的減法,在使用前必須首先清除Cy位(CLRC)。2.3.2.1算術(shù)運(yùn)算指令2.3.2算邏運(yùn)算和移位指令目前八十四頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)功能:對(duì)兩個(gè)8位二進(jìn)制數(shù)進(jìn)行邏輯與、或、非以及異或操作;特點(diǎn):除了以累加器A為目標(biāo)寄存器的指令影響PSW的P位外,其余指令對(duì)PSW均無(wú)影響。
1、邏輯與運(yùn)算指令(ANL)
2、邏輯或運(yùn)算指令(ORL)
3、邏輯異或指令(XRL)
邏輯運(yùn)算特點(diǎn)小結(jié)
4、累加器清零和取反指令(CLR&CPL)2.3.2.2邏輯運(yùn)算指令2.3.2算邏運(yùn)算和移位指令目前八十五頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)1、邏輯與運(yùn)算指令格式:ANLA,Rn ;A∧Rn→AANLA,direct;A∧(direct)→A ANLA,@Ri ;A∧(Ri)→A ANLA,#data ;A∧data→A ANLdirect,A ;(direct)∧A→direct ANLdirect,#data;(direct)∧data→direct
上面的指令也可以分為兩類:1)以累加器A為目標(biāo)寄存器的邏輯運(yùn)算指令;2)以內(nèi)存單元為目標(biāo)的邏輯運(yùn)算指令。2.3.2.2邏輯運(yùn)算指令2.3.2算邏運(yùn)算和移位指令目前八十六頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn)【例】已知R0=30H和(30H)=0AAH,試問(wèn)執(zhí)行下列指令后A的結(jié)果?1)MOVA,#0FFH2)MOVA,#0FH ANLA,R0ANLA,30H
A=
11111111
A=
00001111
R0=00110000
(30H)=10101010
A∧R0=
00110000=30H
A∧(30H)=00001010屏蔽掉高四位2.3.2算邏運(yùn)算和移位指令1、邏輯與運(yùn)算指令2.3.2.2邏輯運(yùn)算指令目前八十七頁(yè)\總數(shù)一百五十八頁(yè)\編于十四點(diǎn) 3)MOVA,#0F0H4)MOVA,#80H ANLA,@R0
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 經(jīng)營(yíng)掛靠合同書參考
- 狂犬病傳染知識(shí)
- 幼兒教師師德工作個(gè)人總結(jié)5篇
- 幼兒園活動(dòng)收獲心得美文五篇
- 急診科臨床診療常規(guī)-技術(shù)操作規(guī)范標(biāo)準(zhǔn)
- 畢業(yè)典禮的致辭語(yǔ)怎么寫5篇
- 道理感悟類滿分作文范文(6篇)
- 關(guān)于中國(guó)新興產(chǎn)業(yè)發(fā)展未來(lái)問(wèn)卷調(diào)查
- 山東高速合同制員工待遇標(biāo)準(zhǔn)
- 銷售總結(jié)報(bào)告心得(10篇)
- 職業(yè)技術(shù)學(xué)校老年保健與管理專業(yè)(三年制)人才培養(yǎng)方案
- 2024年秋季人教版新教材七年級(jí)上冊(cè)語(yǔ)文全冊(cè)教案(名師教學(xué)設(shè)計(jì)簡(jiǎn)案)
- 有子女民政局常用協(xié)議離婚書格式2024年
- 中國(guó)介入醫(yī)學(xué)白皮書(2021 版)
- 2024中華人民共和國(guó)農(nóng)村集體經(jīng)濟(jì)組織法詳細(xì)解讀課件
- 代運(yùn)營(yíng)合作服務(wù)協(xié)議
- 婚內(nèi)財(cái)產(chǎn)協(xié)議書(2024版)
- 有限空間作業(yè)應(yīng)急管理制度
- 2024全國(guó)普法知識(shí)考試題庫(kù)及答案
- 化工企業(yè)中試階段及試生產(chǎn)期間的產(chǎn)品能否對(duì)外銷售
- 籃球智慧樹(shù)知到期末考試答案章節(jié)答案2024年浙江大學(xué)
評(píng)論
0/150
提交評(píng)論