MSC-51指令系統(tǒng)新ppt課件
第二章 MCS-51指令系統(tǒng),物理系,1,重點(diǎn)內(nèi)容,1.尋址方式,2.111條指令,3.偽指令,4.程序設(shè)計(jì),2,高級(jí)語(yǔ)言:,§2-1 指令系統(tǒng)概述,一、指令和程序設(shè)計(jì)語(yǔ)言 指令:CPU根據(jù)人的意圖來(lái)執(zhí)行某種操作的命令。 程序:按照人們的要求完成某項(xiàng)特定任務(wù)所編排的指令操作序列。,匯編語(yǔ)言:,機(jī)器語(yǔ)言:,程序設(shè)計(jì)語(yǔ)言:,用二進(jìn)制代碼表示指令和數(shù)據(jù)。,用助記符表示指令操作功能,用標(biāo)號(hào)表示操作對(duì)象。,獨(dú)立于機(jī)器,面向過(guò)程,接近自然語(yǔ)言和數(shù)學(xué)表達(dá)式.,3,現(xiàn)在描述計(jì)算機(jī)指令系統(tǒng)及實(shí)際應(yīng)用中主要采用匯編語(yǔ)言形式。 采用機(jī)器語(yǔ)言編寫的程序稱之為目標(biāo)程序 采用匯編語(yǔ)言編寫的程序稱之為源程序。 匯編語(yǔ)言程序不能被計(jì)算機(jī)直接識(shí)別并執(zhí)行,必須經(jīng)過(guò)一個(gè)中間環(huán)節(jié)把它翻譯成機(jī)器語(yǔ)言程序,這個(gè)中間過(guò)程叫做匯編。 匯編有兩種方式:機(jī)器匯編和手工匯編。 機(jī)器匯編是用專門的匯編程序,在計(jì)算機(jī)上進(jìn)行翻譯; 手工匯編是編程員把匯編語(yǔ)言指令逐條翻譯成機(jī)器語(yǔ)言指令。,4,指令 = 操作碼 + 操作數(shù) 操作碼表示了該指令所能執(zhí)行的操作功能。 操作數(shù)表示參加操作的數(shù)的本身或操作數(shù)所在的地址。 MCS-51指令格式:,操作碼 目的操作數(shù),源操作數(shù),二、指令格式,5,指令一般有功能、時(shí)間和空間三種屬性。 功能屬性是指每條指令都對(duì)應(yīng)一個(gè)特定的操作功能; 時(shí)間屬性指一條指令執(zhí)行所用的時(shí)間,一般用機(jī)器周期來(lái)表示; 空間屬性是指一條指令在程序存儲(chǔ)器中存儲(chǔ)所占用的字節(jié)數(shù)。 這三種屬性在使用中最重要的是功能,但時(shí)間、空間屬性在有些場(chǎng)合也要用到。,如一些實(shí)時(shí)控制應(yīng)用程序中,有時(shí)需要計(jì)算一個(gè)程序段的確切執(zhí)行時(shí)間或編寫軟件延時(shí)程序,都要用到每條指令的時(shí)間屬性;在程序存儲(chǔ)器的空間設(shè)計(jì),或相對(duì)轉(zhuǎn)移指令的偏移量計(jì)算時(shí)就要用到指令的空間屬性。,6,從空間屬性上分為單字節(jié)指令(49條)、雙字節(jié)指令(46條)和最長(zhǎng)的三字節(jié)指令(只有16條)。 從時(shí)間屬性上可分成單機(jī)器周期指令(64條)、雙機(jī)器周期指令(45條)和只有乘、除法兩條4個(gè)機(jī)器周期的指令。 可見,MCS-51單片機(jī)指令系統(tǒng)在存儲(chǔ)空間和執(zhí)行時(shí)間方面具有較高的效率。,7,單字節(jié)指令 雙字節(jié)指令 三字節(jié)指令,INC A ADD A,#22H MOV 5EH,4FH,機(jī)器碼指令格式,8,三 尋址方式 尋找操作數(shù)存放單元的地址的方式,共7種方式。 1、立即數(shù)尋址 所要找的操作數(shù)是一二進(jìn)制數(shù)或十進(jìn)制數(shù),出現(xiàn)在指令中,用“#”作前綴 MOV A,#20H 2、寄存器尋址 操作數(shù)存放在工作寄存器R0 R7中,或寄存器A、B中。 MOV A,R2 3、直接尋址 指令中直接給出操作數(shù)的地址。直接尋址可訪問(wèn)128B的RAM單元和特殊功能寄存器。直接尋址的地址占一字節(jié),所以,一條直接尋址方式的指令至少占內(nèi)存兩個(gè)單元。 MOV A,30H 或 MOV 30H,DPH,9,;書放在甲抽屜中 ;甲抽屜的鑰匙放在乙抽屜中 ;取書,,A中,20H,MOV 30H,#20H,MOV R0,#30H,MOV A,R0,此例中,20H就當(dāng)成是那本書;30H就當(dāng)成是甲抽屜; R0就當(dāng)成是乙抽屜,執(zhí)行的結(jié)果就是將20H這個(gè)立即數(shù)裝入A中。期間也經(jīng)歷了兩次尋址,即間接尋址。,4、寄存器間接尋址 指令中寄存器的內(nèi)容作為操作數(shù)存放的地址,在工作上間接尋址寄存器前用“”表示前綴。 例如: “一本書放在甲抽屜中,上了鎖;其開鎖的鑰匙放在乙抽屜中,乙抽屜也上了鎖。問(wèn)如何才能取到哪本書?” 這就是一個(gè)間接尋址的問(wèn)題,要經(jīng)過(guò)兩次尋址才能找到哪本書。而寄存器間接尋址也是同樣。 例如:,10,(1)R0, R1可尋址內(nèi)部RAM 00 7FH 共128B單元內(nèi)容,不能尋址特殊功能寄存器。 MOV A, R0 MOV A, R1 (2)R0, R1可尋址外部RAM 00 0FFH 共256B單元內(nèi)容。 MOVX A, R0 MOVX A, R1 (3)DPTR尋址外部數(shù)據(jù)存儲(chǔ)器的64KB空間 MOVX A, DPTR ;A(DPTR) MOVX DPTR, A ;(DPTR)A,11,5、變址尋址 操作數(shù)地址 = 變地址 + 基地址 基地址寄存器 DPTR 或 PC 變址寄存器 A 該尋址方式常用于訪問(wèn)程序存儲(chǔ)器,查表。 如 MOVC A,A + DPTR,12,6、相對(duì)尋址 把指令中給定的地址偏移量與本指令所在單元地址(PC內(nèi)容)相加得到真正有效的操作數(shù)所存放的地址。 例如 “李同學(xué)20歲,張同學(xué)比李同學(xué)大3歲,問(wèn)張同學(xué)多少歲?” 這就是一個(gè)相對(duì)尋年齡的問(wèn)題,而相對(duì)尋址與此類似。 如 JC 60H ;設(shè)(PC) = 2000H為基址,相對(duì)偏移量為60H; ; 則當(dāng)C = 1時(shí),轉(zhuǎn)移的目的地址 = 2000H + 2 + 60H 相對(duì)尋址只出現(xiàn)在相對(duì)轉(zhuǎn)移指令中。,13,14,7.位尋址 位尋址范圍: 20H2FH的16個(gè)字節(jié)單元中的128位; 部分特殊功能寄存器中的各位 位地址表示: (1)直接使用位地址:對(duì)于20H2FH的16個(gè)單元共128位的位地址分布是00H7FH。 (2)單元地址.位地址 20H.1 (3)對(duì)于特殊功能寄存器,可以直接用寄存器名字加位數(shù)或位名表示, 如PSW.3 , 位名:CY, AC。,15,16,一、指令分類 111條指令,共分五大類: 數(shù)據(jù)傳送類;(29條) 算術(shù)運(yùn)算類;(24條) 邏輯運(yùn)算類;(24條) 控制轉(zhuǎn)移類;(17條) 位操作類:(17條),§2-2 MCS-51 指令系統(tǒng),17,指令中操作數(shù)的描述符號(hào): Rn 工作寄存器R0 R7 Ri 間接尋址寄存器R0、R1 Direct 直接地址,包括內(nèi)部128B RAM單元地址、 26個(gè)SFR地址。 #data 8位常數(shù) #data 16 16位常數(shù) addr 16 16位目的地址 addr 11 11位目的地址 rel 8位帶符號(hào)的偏移地址 DPTR 16位外部數(shù)據(jù)指針寄存器 bit 可直接位尋址的位,18,A 累加器 B 寄存器B C 進(jìn)、借位標(biāo)志位,或位累加器 間接寄存器或基址寄存器的前綴 / 指定位求反 (x) x中的內(nèi)容 (x) x中的地址中的內(nèi)容 當(dāng)前指令存放的地址,19,二、數(shù)據(jù)傳送類指令 1、內(nèi)部RAM數(shù)據(jù)傳送類 1)一般數(shù)據(jù)傳送指令,20,回憶前述操作數(shù)描述符:A,direct,Rn,Ri,#data,DPTR等。 經(jīng)排列組合可寫出下列指令: MOV A,Rn ;(A) (Rn)以下類似。,MOV A,direct MOV A,Ri MOV A,#data MOV Rn,A MOV Rn,direct MOV Rn,#data,21,MOV direct,Rn MOV direct,direct MOV direct,Ri MOV direct,#data MOV Ri,A MOV Ri, direct MOV Ri,#data MOV DPTR,#data16 ;唯一的16位數(shù)據(jù)傳送指令。 上述指令不影響任何標(biāo)志位,但PSW的P位除外。,(direct),(A),MOV direct,A ;,22,上述指令不影響任何標(biāo)志位,但PSW的P位除外。 注意:MOV Rn,Rn MOV Ri, Ri MOV Rn, Ri MOV #data, A 等等指令是非法指令。,哇!好容易出錯(cuò)啊!,23,(2) (direct),2)棧操作指令 PUSH direct POP direct 不影響任何標(biāo)志位。 PUSH direct 指令執(zhí)行中,機(jī)器自動(dòng)進(jìn)行兩步操作: (1) (SP)+ 1,例1、設(shè)(SP) = 09H,(DPTR)= 0123H,分析: 執(zhí)行 PUSH DPL PUSH DPH 后,各單元中的內(nèi)容。,(SP),(SP),24,POP direct 指令執(zhí)行中,機(jī)器也自動(dòng)進(jìn)行兩步操作: (1)(direct) (SP) (2)(SP) (SP) 1 例2、設(shè)(SP)= 0BH,(0BH)= 01H,(0AH)= 23H 執(zhí)行 POP DPH POP DPL 后,各單元中的內(nèi)容。,25,結(jié)論:1)PUSH 與 POP 操作過(guò)程剛好相反; 2)進(jìn)、出棧規(guī)則: 先進(jìn)后出,后進(jìn)先出。應(yīng)注意指令書寫先后順序; 3)可用于“保護(hù)斷點(diǎn),保護(hù)現(xiàn)場(chǎng)”。,26,3、字節(jié)交換指令 XCH A,Rn XCH A,direct 整字節(jié)交換 XCH A,Ri XCHD A,Ri SWAP A 半字節(jié)交換 不影響任何標(biāo)志位。,27,2、 外部RAM數(shù)據(jù)傳送 MOVX A,Ri MOVX A, DPTR MOVX Ri, A MOVX DPTR,A 執(zhí)行過(guò)程中會(huì)使/WR、/RD有效。,28,例3、試編寫一程序段,實(shí)現(xiàn)將外RAM 0FAH單元中的內(nèi)容傳送到外RAM 04FFH單元中。,解: MOV DPTR,#04FFH MOV R0,#0FAH MOVX A,R0 MOVX DPTR, A,29,3、 查表指令 與ROM之間的數(shù)據(jù)傳送。 MOVC A,A + DPTR MOVC A, A + PC 執(zhí)行后會(huì)使/PSEN有效。 MOVC 含義是傳送常數(shù)。 以DPTR 為基地址的指令,可在ROM 的64KB范圍內(nèi)查表; 而以PC為基地址的指令只能在(PC)+ 1為中心上、下256B范圍內(nèi)查表。,30,例4、設(shè)(A)= 一個(gè)BCD碼常數(shù),試用查表法獲得其相應(yīng)的ASCII碼。,解法II: MOVC A,A+PC TAB:DB 30H,31H,32H,33H DB 34H,35H,36H,37H ······,解法I: MOV DPTR,#TAB MOVC A,.A+DPTR TAB:DB 30H DB 31H DB 32H,33H,34H,35H ······,31,32,二、邏輯操作類指令,共分兩大類:?jiǎn)巫止?jié)邏輯操作,雙字節(jié)邏輯操作,共24條。 1、單字節(jié)邏輯操作指令 CLR A ;(A) 0 CPL A A中8位按位求反。 循環(huán)左移、右移指令: RL A RLC A RR A RRC A 注:左移一位相當(dāng)于乘2;右移一位相當(dāng)于除2。,共分兩大類:?jiǎn)巫止?jié)邏輯操作,雙字節(jié)邏輯操作,共24條。 1、單字節(jié)邏輯操作指令 CLR A ;(A) 0 CPL A A中8位按位求反。 循環(huán)左移、右移指令: RL A RLC A RR A RRC A 注:左移一位相當(dāng)于乘2;右移一位相當(dāng)于除2。,33,2、雙字節(jié)邏輯操作指令 “與操作”: ANL A,Rn ; (A) (A)(Rn),以下類同。 ANL A,direct ANL A,Ri ANL A,#data ANL direct,A ANL direct,#data 例1、(P1)= 35H,使其高4位輸出0,低4位不變。 解: ANL P1,#0FH 此做法稱為“屏蔽”位。,34,“或操作”: ORL A,Rn ; (A) (A)(Rn),以下類同。 ORL A,direct ORL A,Ri ORL A,#data ORL direct,A ORL direct,#data,例2、將A中的低3位送入P1中,并且保持P1中高5位不變。 ANL A,#07H ANL P1,#0F8H ORL P1,A ;(P1)= P17P16P15P14P13A2A1A0 這稱為“數(shù)位組合”。,35,“異或操作”: XRL A,Rn ; (A) (A)(Rn),以下類同。 XRL A,direct XRL A,Ri XRL A,#data XRL direct,A XRL direct,#data 例3、設(shè)(P1)= 0B4H = 10110100B,執(zhí)行: XRL P1,#00110001B 結(jié)果按# 0 0 1 1 0 0 0 1 取反,即: (P1)= 1 0 0 0 0 1 0 1 B = 85H 這稱為“指定位取反”。,36,在上述ANL、ORL、XRL操作中,用于端口操作時(shí),無(wú)論P(yáng)0 P3是第一,還是第二操作數(shù),都遵循“讀修改寫”端口鎖存器的操作。,37,三、算術(shù)運(yùn)算類指令,包括:加、 減、乘、除;加一、減一。 1、加法指令 ADD A,Rn ;(A) (A)+ (Rn)以下類同。 ADD A,direct ADD A,Ri ADD A,#data 無(wú)符號(hào)數(shù)相加時(shí):若C = 1,說(shuō)明有溢出(其值 255)。 帶符號(hào)數(shù)相加時(shí):若OV = D7cD6c = 1,說(shuō)明有溢出。,38,ADDC A,Rn ;(A) (A)+(Rn)+(C) ; 以下類同。 ADDC A,direct ADDC A,Ri ADDC A,#data 上述四條指令多用于多字節(jié)數(shù)相加。,INC A ;(A) (A)+1 ,以下類同。 INC Rn INC direct INC Ri INC DPTR,39,INC A ;(A) (A)+1 ;以下類同。 INC Rn INC direct INC Ri INC DPTR,例1、設(shè)(R0)= 7FH; (7EH)= 40H 執(zhí)行:INC R0 INC R0 INC R0 后,(R0)= 7FH;,(7EH)= 00H;,(7FH)= 41H,40,DA A ;二 十進(jìn)制調(diào)整指令。 執(zhí)行過(guò)程中,CPU能根據(jù)加法運(yùn)算后,累加器中的值和PSW中的AC及C標(biāo)志位的狀況自動(dòng)選擇一個(gè)修正值(00H、06H、60H、66H)與原運(yùn)算結(jié)果相加,進(jìn)行二十進(jìn)制調(diào)整。,選擇修正值的規(guī)則:,41,例2、設(shè)(A) = 56H 為56的壓縮的BCD碼數(shù),(R3)= 67H,(CY)=1 執(zhí)行 ADDC A,R3 DA A 結(jié)果為:124 注意:1)DA指令只能跟在加法指令后面使用; 2)調(diào)整前參與運(yùn)算的兩數(shù)是BCD碼數(shù); 3)DA指令不能與減法指令配對(duì)使用,但可以實(shí)現(xiàn)對(duì)A中 壓縮BCD數(shù)進(jìn)行減一操作。 例3、設(shè)(A)=30H(壓縮BCD碼數(shù)),執(zhí)行: ADD A,#99H DA A 后,便實(shí)現(xiàn)了30 1 = 29的操作。,42,例4、兩個(gè)4位BCD碼相加,一個(gè)存放在(31H)(30H);另一個(gè)存放在(33H)(32H);和數(shù)擬回存在(31H)(30H)中,試編程實(shí)現(xiàn)之。 解: MOV R0,#30H MOV R1,#32H MOV A,R0 ADD A,R1 DA A MOV R0,A,43,INC R1 MOV A,R0 ADDC A,R1 DA A MOV R0,A,INC R0,44,2、減法指令 SUBB A,Rn ;(A) (A)(Rn)(C),以下類同。 SUBB A,direct SUBB A,Ri SUBB A,#data 注意:減法之前先清零C。 DEC A ;(A) (A)1 ,以下類同。 DEC Rn DEC Ri DEC direct,45,例5、設(shè)(R0)=7FH,在內(nèi)RAM中,(7EH)=00H, (7FH)=40H 執(zhí)行: DEC R0 DEC R0 DEC R0 結(jié)果為 :(R0)= 7EH,(7EH)=0FFH,(7FH)=3FH。,46,3、乘法和除法指令 乘法: MUL AB ;(A)×(B),積的低8位在A中,積的 ; 高8位在B中; C總為0。 除法: DIV AB ;(A)÷(B),商在A中,余數(shù)在B中。 ; 若(B)= 0 ,則結(jié)果不定,(OV)= 1, ;(C)= 0。,47,例6、試將A中的二進(jìn)制數(shù)轉(zhuǎn)換為3位BCD碼,其中,百位數(shù)存放于31H單元,十位數(shù)和個(gè)位數(shù)壓縮后存于30H單元中。,解: MOV B,#100 DIV A,B MOV 31H,A MOV A,#10 XCH A,B DIV A,B SWAP A ADD A,B MOV 30H,A,48,49,四、位操作類指令,包括:位傳送指令、條件轉(zhuǎn)移指令、位運(yùn)算指令。 位操作由單片機(jī)內(nèi)布爾處理器來(lái)完成。 位地址的四種表示: 1)使用直接位地址表示;如20H、30H、33H等; 2)使用位寄存器名來(lái)表示;如C、OV、F0等; 3)用字節(jié)寄存器名后加位數(shù)來(lái)表示; 如PSW.4、P0.5ACC.3等; 4)字節(jié)地址加位數(shù)來(lái)表示;如20.0、30.4、50.7等。,50,1、位傳送指令 MOV C,bit MOV bit,C 功能:(C) (bit);或(bit) (C),2、位狀態(tài)控制指令 CLR bit ;(bit) 0 SETB bit ;(bit) 1 CPL bit ;(bit) (/ bit),51,例1、編程通過(guò)P10線連續(xù)輸出256個(gè)寬度為5個(gè)機(jī)器周期長(zhǎng)的方波。,解: MOV R0,#00H CLR P10 LOOP:CPL P10 NOP NOP DJNZ R0,LOOP,52,ANL C,bit ;(C) (C)(bit) ANL C,/ bit ;(C) (C)(/ bit),ORL C,bit ;(C) (C)(bit) ORL C,/bit ;(C) (C)(/bit),3、位邏輯操作指令,53,例2、用軟件實(shí)現(xiàn)下圖所示的P10 P13間的邏輯運(yùn)算。,解: MOV C,P1.1 ORL C,P1.2 ANL C,P1.0 MOV P13,C,P1.1,P1.2,P1.0,P1.3,54,4、布爾條件轉(zhuǎn)移指令 有5條,分別對(duì)C和直接位地址進(jìn)行測(cè)試, 并根據(jù)其狀態(tài)執(zhí)行轉(zhuǎn)移。 1)判布爾累加器轉(zhuǎn)移 JC rel ;(C)= 1,轉(zhuǎn)移,否則順序執(zhí)行。 JNC rel ;(C)= 0,轉(zhuǎn)移,否則順序執(zhí)行。 不影響標(biāo)志。轉(zhuǎn)移地址 :(PC) (PC)+ rel,55,解: MOV A,30H CJNE A,40H,LOOP1 SETB 7FH SJMP $ LOOP1: JC LOOP2 MOV 20H,A MOV 21H,40H SJMP $ LOOP2: MOV 20H,40H MOV 21H,A SJMP $,例3、比較內(nèi)部RAM的30H和40H單元中的二個(gè)無(wú)符號(hào)數(shù)的大小,將大數(shù)存入20H單元,小數(shù)存入21H單元,若二數(shù)相等,則使內(nèi)RAM的第127位置1。,56,2)判位變量轉(zhuǎn)移 JB bit,rel ;(bit)= 1,則轉(zhuǎn)移,否則順序執(zhí)行。 JBC bit,rel ;(bit)= 1,則轉(zhuǎn)移,否則順序執(zhí)行, ; 且無(wú)論(bit)是否等于1,均使該位清零。 JNB bit,rel ;(bit)= 0,則轉(zhuǎn)移,否則順序執(zhí)行。 ; 不影響標(biāo)志。,57,例4、試判斷A中的正負(fù),若為正數(shù),存入20H單元;若為負(fù)數(shù)則存入21H單元。,解: JB ACC7,LOOP MOV 20H,A SJMP $ LOOP:MOV 21H,A SJMP $,58,59,五、控制轉(zhuǎn)移類指令,作用:改變程序計(jì)數(shù)器PC的值,從而改變程序執(zhí)行方向。 分為四大類:無(wú)條件轉(zhuǎn)移指令;條件轉(zhuǎn)移指令;調(diào)用指令; 返回指令。,60,LJMP addr16 ;長(zhǎng)跳轉(zhuǎn)指令 轉(zhuǎn)移目的地址 addr16 (PC),0000H FFFFH,64KB AJMP addr11 ;絕對(duì)轉(zhuǎn)移 轉(zhuǎn)移目的地址的形成:先(PC) (PC)+ 2; 然后 PC15 11不變,PC10 0 addr10 0 64KB = 216 =25×211 = 32×2KB 轉(zhuǎn)移目的地址與(PC)+ 2在同一個(gè)2KB范圍內(nèi)。,61,SJMP rel ;短轉(zhuǎn)移,相對(duì)尋址。 轉(zhuǎn)移目的地址 = (PC)+ 2 + rel, 所以 rel = 轉(zhuǎn)移目的地址(PC)2 但,實(shí)際使用中常寫成 SJMP addr16,匯編時(shí)會(huì)自動(dòng)轉(zhuǎn) 換成rel。 JMP A + DPTR ;間接轉(zhuǎn)移,散轉(zhuǎn)移指令。 轉(zhuǎn)移目的地址 = (A) + (DPTR) 本指令不影響標(biāo)志位,不改變 A 及DPTR中的內(nèi)容。常 用于多分支程序結(jié)構(gòu)中,可在程序運(yùn)行過(guò)程中動(dòng)態(tài)地決定 程序分支走向。,62,例1、設(shè)A中為鍵值,試編寫按鍵值處理相應(yīng)事件的程序段。,解: MOV DPTR,#KYEG MOV B,#03H MUL AB JMP A + DPTR KYEG: LJMP KYEG0 LJMP KYEG ,63,比較LJMP、AJMP、SJMP、JMP轉(zhuǎn)移的起點(diǎn)和范圍:,64,LCALL addr16 ;長(zhǎng)調(diào)用 ACALL addr11 ;絕對(duì)調(diào)用,LCALL addr16 ;轉(zhuǎn)移范圍64KB,不影響標(biāo)志位。執(zhí)行中自動(dòng)完成如下過(guò)程: (PC) (PC) + 3 (SP) (SP)+ 1 (SP) (PC7 0), 保護(hù)斷點(diǎn)地址低字節(jié); (SP) (SP)+ 1 (SP) (PC15 8),保存斷點(diǎn)地址高字節(jié); (PC) addr16 ,目的地址送PC,轉(zhuǎn)子程序。,2、調(diào)用指令,65,執(zhí)行結(jié)果:(SP)= 09H,(09H)= 21H,(08H)= 03H, (PC)= 3456H,66,轉(zhuǎn)移范圍與(PC)+ 2在同一個(gè)2KB內(nèi)。不影響任何標(biāo)志位,執(zhí)行中機(jī)器自動(dòng)完成下列過(guò)程: (PC) (PC)+ 2 (SP) (SP)+ 1 (SP) (PC7 0) (SP) (SP)+ 1 (SP) (PC15 8) (PC10 0) addr10 0,ACALL addr11 :,67,3、返回指令 從子程序返回主程序。 RET ;調(diào)用子程序返回; RETI ;中斷子程序返回。,(PC15 8) (SP) (SP) 1 (PC7 0) (SP) (SP) (SP) 2,其機(jī)器自動(dòng)操作過(guò)程如下:,比較兩種返回指令含義上的異同點(diǎn) 結(jié)論:RET返回地址事先已知,而RETI的返回地址在程序執(zhí)行中產(chǎn)生的,不固定。不影響標(biāo)志位,但PSW不能恢復(fù)到中斷前的狀態(tài)。,(SP),68,69,空操作指令 NOP ;空操作 不執(zhí)行任何操作,僅僅使(PC)+ 1,繼續(xù)執(zhí)行下條指令,不影響標(biāo)志位,在ROM中占一個(gè)字節(jié)。 用于延時(shí)調(diào)整。,70,71,4、條件轉(zhuǎn)移指令 實(shí)現(xiàn)按照一定條件決定轉(zhuǎn)移的方向,分三類: 判零轉(zhuǎn)移指令 比較轉(zhuǎn)移指令 循環(huán)轉(zhuǎn)移指令,JZ rel : 若(A)= 0 ,則轉(zhuǎn)移,否則順序執(zhí)行。 JNZ rel : 若(A) 0,則轉(zhuǎn)移,否則順序執(zhí)行。 轉(zhuǎn)移目的地址 = (PC)+ 2 + rel 不影響任何標(biāo)志位。,1)判零轉(zhuǎn)移 JZ rel JNZ rel,72,例1、將外RAM的一個(gè)數(shù)據(jù)塊(首地址為DATA1)傳送到內(nèi)部數(shù)據(jù)RAM(首地址為DATA2),遇到傳送的數(shù)據(jù)為零時(shí)停止傳送,試編程。,解: MOV R0,#DATA2 MOV DPTR,#DATA1 LOOP1: MOVX A,DPTR JZ LOOP2 MOV R0,A INC R0 INC DPTR SJMP LOOP1 LOOP2: SJMP LOOP2,73,2)比較轉(zhuǎn)移指令 功能:比較二個(gè)字節(jié)中的值,若不等,則轉(zhuǎn)移。 CINE A,#data,rel CJNE A,direct,rel CJNE Ri,#data,rel CJNE Rn,#data,rel,該類指令具有比較和判斷雙重功能,比較的本質(zhì)是做減法運(yùn)算,用第一操作數(shù)內(nèi)容減去第二操作數(shù)內(nèi)容,但差值不回存。 轉(zhuǎn)移目的地址 = (PC)+ 3 + rel 若第一操作數(shù)內(nèi)容小于第二操作數(shù)內(nèi)容,則(C)= 1,否則(C)= 0。,74,該類指令可產(chǎn)生三分支程序: 即,相等分支;大于分支;小于分支。,75,例2、設(shè)P1口的P1.0 P1.3為準(zhǔn)備就緒信號(hào)輸入端,當(dāng)該四位為全1時(shí),說(shuō)明各項(xiàng)工作已準(zhǔn)備好,單片機(jī)可順序執(zhí)行,否則,循環(huán)等待。,解: MOV A,P1 ANL A,#0FH CJNE A,#0FH,WAIT ;P1.0 P1.3不為全1時(shí),返 ; 回WAIT MOV A,R2 ,76,3)循環(huán)轉(zhuǎn)移指令 DJNZ Rn,rel ;(二字節(jié)指令) DINZ direct,rel ;(三字節(jié)指令) 本指令也為雙功能指令,即減1操作和判斷轉(zhuǎn)移操作。 第一操作數(shù)內(nèi)容減1后,若差值不為零,則轉(zhuǎn)移;否則順序執(zhí)行。 轉(zhuǎn)移目的地址 = (PC)+ 2或3 + rel,77,例3、將8031內(nèi)部RAM的40H 4FH單元置初值#A0H #AFH。,解: MOV R0,#40H MOV R2,#10H MOV A,#0A0H LOOP: MOV R0,A INC R0 INC A DJNZ R2,LOOP ,78,79,偽指令是告訴匯編程序,如何匯編源程序的指令。 偽指令既不控制機(jī)器的操作,也不能被匯編成機(jī)器代碼, 故稱為偽指令。,1、起始地址偽指令 ORG ORG addr16 用于規(guī)定目標(biāo)程序段或數(shù)據(jù)塊的起始地址, 設(shè)置在程序開始處。 2、匯編結(jié)束偽指令 END 告訴匯編程序,對(duì)源程序的匯編到此結(jié)束。 一個(gè)程序中只出現(xiàn)一 次,在末尾。,§2-3 偽指令,80,3、賦值偽指令 EQU 告訴匯編程序,將匯編語(yǔ)句操作數(shù)的值賦予本語(yǔ)句的標(biāo)號(hào)。 格式: 標(biāo)號(hào)名稱 EQU 數(shù)值或匯編符號(hào) “標(biāo)號(hào)名稱”在源程序中可以作數(shù)值使用,也可以作數(shù)據(jù)地址、 位地址使用。先定義后使用,放在程序開頭。 4、定義字節(jié)偽指令 DB 告訴匯編程序從指定的地址單元開始,定義若干字節(jié)存儲(chǔ)單 元并賦初值。 格式: 標(biāo)號(hào): DB 字節(jié)數(shù)據(jù)或字節(jié)數(shù)據(jù)表 5、定義字偽指令 DW 從指定地址開始,定義若干個(gè)16個(gè)位數(shù)據(jù),高八位存入低地址; 低八位存入高地址。,81,例、 ORG 1000H PIOI:DW 7654H,40H、12、AB,6、數(shù)據(jù)地址賦值偽指令 DATA 將表達(dá)式指定的數(shù)據(jù)地址賦予規(guī)定的字符名稱 格式: 字符名稱 DATA 表達(dá)式 注:該指令與EQU 指令相似,只是,可先使用后定義, 放于程序開頭、結(jié)尾均可。,82,7、定義空間偽指令 DS 從指定地址開始,保留由表達(dá)式指定的若干字節(jié)空間作 為備用空間。 格式: 標(biāo)號(hào): DS 表達(dá)式 例2、 ORG 1000H DS 0AH DB 71H,11H,11H ;從100BH開始存放 ;71H11H、11H。,注:DB、DW、DS 只能用于程序存儲(chǔ)器; 而不能用于數(shù)據(jù)存儲(chǔ)器。,83,8、位地址賦值偽指令 BIT 將位地址賦予規(guī)定的字符名稱。 格式: 字符名稱 BIT 位地址,例3、 X1 BIT P12 相當(dāng)于 X1 EQU 92H,84,MCS -51傳送指令示意圖,小 結(jié),數(shù)據(jù)傳送類指令,85,數(shù)據(jù)傳送類指令一覽表,86,數(shù)據(jù)傳送類指令一覽表,87,算術(shù)運(yùn)算類指令,算術(shù)運(yùn)算指令,88,算術(shù)運(yùn)算指令,89,影響標(biāo)志位的指令,90,影響標(biāo)志位的指令,91,邏輯運(yùn)算類指令,邏輯運(yùn)算指令,92,控 制 轉(zhuǎn) 移 指 令,93,位操作類指令,位 操 作 指 令,94,§23 MCS-51 匯編語(yǔ)言程序設(shè)計(jì),一、編程步驟 1、分析問(wèn)題:對(duì)需要解決對(duì)問(wèn)題進(jìn)行分析,有正確的理解。 2、確定算法:即如何將實(shí)際問(wèn)題轉(zhuǎn)化成程序模塊來(lái)處理。 3、畫程序流程圖: 4、編寫程序。 由匯編語(yǔ)言編寫的源程序是由許多語(yǔ)句(也可稱為匯編指令)組成的。每個(gè)語(yǔ)句由14個(gè)部分組成,其格式是: 標(biāo)號(hào)指令助記符操作數(shù);注解,95,二、匯編程序功能,源程序 (匯編指令程序),目標(biāo)程序 (機(jī)器碼指令程序),匯編指令與機(jī)器碼指令有一一對(duì)應(yīng)的關(guān)系。 匯編程序是一種翻譯程序,將源程序翻譯成目標(biāo)程序。,96,三、匯編程序的匯編過(guò)程 匯編有兩種方法:手工匯編、機(jī)器匯編。,1、手工匯編: 第一次匯編:確定地址,翻譯成各條機(jī)器碼,字符標(biāo)號(hào)原樣寫出; 第二次匯編:標(biāo)號(hào)代真,將字符標(biāo)號(hào)用所計(jì)算出的具體地址值或偏移量代換。,97,源程序,目標(biāo)程序,地址,ORG 1000H START:MOV R0,2FH MOV R2,#00H MOV A,R0 MOV R3,A INC R3 SJMP NEXT LOOP:INC R0 CJNE R0,#44H,NEXT INC R2 NEXT:DJNZ R3,LOOP MOV 2AH,R2 SJMP $ END,第一次匯編,第二次匯編,1000 A82F 1002 7A00 1004 E6 1005 FB 1006 0B 1007 80NEXT 1009 08 100A B644NEXT 100D 0A 100E DBLOOP 1010 8A2A 1012 80FE,A82F 7A00 E6 FB 0B 8005 08 B64401 0A DBF9 8A2A 80FE,98,2、機(jī)器匯編 兩次掃描過(guò)程。 第一次掃描:檢查語(yǔ)法錯(cuò)誤,確定符號(hào)名字; 建立使用的全部符號(hào)名字表; 每一符號(hào)名字后跟一對(duì)應(yīng)值(地址或數(shù))。 第二次掃描:是在第一次掃描基礎(chǔ)上,將符號(hào)地址轉(zhuǎn)換成 地址(代真); 利用操作碼表將助記符轉(zhuǎn)換成相應(yīng)的目標(biāo)碼。,99,四、偽指令 偽指令是告訴匯編程序,如何匯編源程序的指令。 偽指令既不控制機(jī)器的操作,也不能被匯編成機(jī)器代碼, 故稱為偽指令。,1、起始地址偽指令 ORG ORG addr16 用于規(guī)定目標(biāo)程序段或數(shù)據(jù)塊的起始地址, 設(shè)置在程序開始處。 2、匯編結(jié)束偽指令 END 告訴匯編程序,對(duì)源程序的匯編到此結(jié)束。 一個(gè)程序中只出現(xiàn)一 次,在末尾。,100,3、賦值偽指令 EQU 告訴匯編程序,將匯編語(yǔ)句操作數(shù)的值賦予本語(yǔ)句的標(biāo)號(hào)。 格式: 標(biāo)號(hào)名稱 EQU 數(shù)值或匯編符號(hào) “標(biāo)號(hào)名稱”在源程序中可以作數(shù)值使用,也可以作數(shù)據(jù)地址、 位地址使用。先定義后使用,放在程序開頭。 4、定義字節(jié)偽指令 DB 告訴匯編程序從指定的地址單元開始,定義若干字節(jié)存儲(chǔ)單 元并賦初值。 格式: 標(biāo)號(hào): DB 字節(jié)數(shù)據(jù)或字節(jié)數(shù)據(jù)表 5、定義字偽指令 DW 從指定地址開始,定義若干個(gè)16個(gè)位數(shù)據(jù),高八位存入低地址; 低八位存入高地址。,101,例、 ORG 1000H PIOI:DW 7654H,40H、12、AB,6、數(shù)據(jù)地址賦值偽指令 DATA 將表達(dá)式指定的數(shù)據(jù)地址賦予規(guī)定的字符名稱 格式: 字符名稱 DATA 表達(dá)式 注:該指令與EQU 指令相似,只是,可先使用后定義, 放于程序開頭、結(jié)尾均可。,102,7、定義空間偽指令 DS 從指定地址開始,保留由表達(dá)式指定的若干字節(jié)空間作 為備用空間。 格式: 標(biāo)號(hào): DS 表達(dá)式 例2、 ORG 1000H DS 0AH DB 71H,11H,11H ;從100BH開始存放 ;71H11H、11H。,注:DB、DW、DS 只能用于程序存儲(chǔ)器; 而不能用于數(shù)據(jù)存儲(chǔ)器。,103,8、位地址賦值偽指令 BIT 將位地址賦予規(guī)定的字符名稱。 格式: 字符名稱 BIT 位地址,例3、 X1 BIT P12 相當(dāng)于 X1 EQU 92H,104,105,§2-4 匯編語(yǔ)言程序的基本結(jié)構(gòu)及應(yīng)用舉例,程序編寫做到:占用存儲(chǔ)空間少;運(yùn)行時(shí)間短; 程序的編制、調(diào)試及排錯(cuò)所需時(shí)間短;結(jié)構(gòu)清晰,易讀、易于移植。,按結(jié)構(gòu)化程序設(shè)計(jì)思想,任何復(fù)雜程序都可由 順序結(jié)構(gòu)、 分支結(jié)構(gòu)、 循環(huán)結(jié)構(gòu),106,107,一、順序程序舉例 例1、設(shè)在外RAM的60H單元存有1個(gè)字節(jié)代碼,要求將其分解成兩個(gè)4位字段,高4位存入原單元的低4位,其低4位存入61H單元的低4位,且要求這兩個(gè)單元的高4位均為0,試編制完整程序。,分析:,# # # # ¥ ¥ ¥ ¥, , ¥ ¥ ¥ ¥,108,解: 核心指令 ANL ORG 1000H MODE:MOV R0,#60H MOVX A,R0 MOV B,A ANL A,#0F0H SWAP A MOVX R0,A ANL B,#0FH MOV A,B INC R0 MOVX R0,A END,109,二、分支結(jié)構(gòu)與分支程序設(shè)計(jì) 結(jié)構(gòu):根據(jù)不同的條件,進(jìn)行相應(yīng)的處理。 通常用條件轉(zhuǎn)移指令形成簡(jiǎn)單分支結(jié)構(gòu)。 如: 判(A) = Z 或 NZ ,轉(zhuǎn)移 判(CY)= 1 或 0 ,轉(zhuǎn)移 判(bit)=1 或 0 ,轉(zhuǎn)移 CJNE 比較不相等轉(zhuǎn)移,110,例3、設(shè)a存放在累加器A中,b存放在寄存器B中,要求按下式 計(jì)算Y值,并將結(jié)果Y存于累加器A 中,試編寫程序。 a-b (a0) Y = a+b (a 0),解:本題關(guān)鍵是判a是正數(shù),還是負(fù)數(shù);由ACC.7便知。 ORG 1000H BR: JB ACC.7,MINUS CLR C SUBB A,B SJMP DONE MINUS: ADD A,B DONE: SJMP END,111,例4、設(shè)有兩個(gè)16位無(wú)符號(hào)數(shù)NA,NB分別存放在8031單片機(jī)內(nèi)部RAM的40H、41H及50H、51H單元中,當(dāng)NA NB時(shí),將內(nèi)部RAM的42H單元清0;否則,將該單元置成全1,試編程。 解法I:因?yàn)闊o(wú)16位數(shù)的比較指令,所以,只能用8位數(shù)的比較 指令。 (畫出流程框圖),112,解: ORG 2000H CMP:MOV A,50H CJNE A,40H,CMP1 MOV A,51H CJNE A,41H,CMP1 SJMP NHIGHE CMP1:JC HIGHE NHIGHE:MOV 42H,#0FFH SJMP DONE HIGHE:MOV 42H,#00H DONE:SJMP END,113,解法II:先假設(shè)NA NB,再來(lái)判斷是否NA NB ORG 3000H CMP2:MOV R0,#00H MOV A,50H CJNE A,40H,CMP3 MOV A,51H CJNE A,41H,CMP3 SJMP NHIGHE CMP3:JC HIGHE NHIGHE:MOV R0,#0FFH ;不大于標(biāo)志 HIGHE:MOV 42H,R0 SJMP END,114,小結(jié): 1、匯編程序有哪三種基本結(jié)構(gòu)? 2、構(gòu)成分支程序,常用到哪些判斷語(yǔ)句?,順序程序 每條指令只執(zhí)行一次; 分支程序 根據(jù)不同條件,會(huì)跳過(guò)一些指令,而轉(zhuǎn)去 執(zhí)行另一些指令 共同點(diǎn): 每條指令至多執(zhí)行一次。但是,實(shí)際中有時(shí)要求某程 序段多次重復(fù)執(zhí)行,需要采用循環(huán)結(jié)構(gòu)。,115,循環(huán)結(jié)構(gòu)不但使程序簡(jiǎn)練,而且大大節(jié)省存儲(chǔ)空間。 循環(huán)程序包含四部分: 、初始化部分 (循環(huán)計(jì)數(shù)器、變量置初值) 、循環(huán)處理部分(主體,需要重復(fù)執(zhí)行的部分) 、循環(huán)控制部分(修改地址指針、修改變量、檢測(cè) 循環(huán)結(jié)束條件) 、循環(huán)結(jié)束部分(對(duì)結(jié)果分析、處理,存放結(jié)果),116,先修理,后判斷:,先判斷,后處理:,117,循環(huán)有:?jiǎn)窝h(huán)、多重循環(huán)。 循環(huán)次數(shù)已知,可用計(jì)數(shù)器控制循環(huán)次數(shù); 循環(huán)次數(shù)未知,按問(wèn)題條件控制循環(huán)是否結(jié)束。,1、單循環(huán)程序 (1)循環(huán)次數(shù)是已知的程序 例1、已知片外RAM的10H單元存放8位二進(jìn)制數(shù),要求將其轉(zhuǎn)移成相應(yīng)的ASCII碼,并以高位在前,低位在后的順序,依次存放到片外RAM以11H為首地址的連續(xù)單元中,試編程。 解:先將中間單元置成30H,然后判欲轉(zhuǎn)換位是否為1, 若是,則將中間單元內(nèi)容加1;否則,中間單元內(nèi)容保持不變。 通過(guò)左移指令實(shí)現(xiàn)由高到低的順序進(jìn)行轉(zhuǎn)換。,118,START:MOV R2,#08H ;循環(huán)計(jì)數(shù)初值(循環(huán)次數(shù)已知) MOV R0,#10H ;地址指針初值 MOVX A,R0 ;取數(shù) MOV B,A ;暫存B中 LOOP:MOV A,#30H ;將中間單元(A)置成30H JNB B.7,NA ;判斷轉(zhuǎn)換的二進(jìn)制位為0否? INC A ;若為1,則變成1的ASCII碼“31H” NA:INC R0 ;修改地址指針 MOVX R0,A ;存放轉(zhuǎn)換的結(jié)果 MOV A,B RL A,B ;作好準(zhǔn)備,判斷下一位 MOV B,A ;暫存 DJNZ R2,LOOP ;判斷轉(zhuǎn)換結(jié)束否?未完繼續(xù) SJMP ,119,(2)循環(huán)次數(shù)未知的程序 例2、設(shè)用戶用鍵盤輸入長(zhǎng)度不超過(guò)100字節(jié)的字符串放在8031單片機(jī)外部RAM以20H為首地址的連續(xù)單元,該字符串用回車符CR(CR= 0DH)作為結(jié)束標(biāo)志,要求統(tǒng)計(jì)此字符串的長(zhǎng)度并存入內(nèi)部RAM的1FH單元中。 解:從首單元開始取數(shù),每取一數(shù)判斷其是否為CR,是則結(jié)束。,ORG 1000H STADA DATA 20H SLANG DATA 1FH CMCR2:MOV R0,#STADA-1 MOV B,#0FFH,CRLOP:INC R0 INC B MOVX A,R0 CJNE A,#0DH,CRLOP MOV SLANG,B SJMP END,120,2、多重循環(huán)設(shè)計(jì) 循環(huán)體中還包含著一個(gè)或多個(gè)循環(huán)結(jié)構(gòu),即雙重或多重循環(huán)。 例3、設(shè)8031使用12MHz晶振,試設(shè)計(jì)延遲100ms的延時(shí)程序。,121,內(nèi)循環(huán)延時(shí): (1 + 2 × CTR)T = 500us(假設(shè)) 則CTR = 250 實(shí)際延時(shí):1 + 2 × 250 × 1us = 501us 外循環(huán)延時(shí):T +(501 + 2T)× CTS = 100ms = 100 000us 所以 , CTS = 198.8 取 199 實(shí)際延時(shí):1 + (501 + 2)×199 = 1000.98ms,122,例4、設(shè)在8031內(nèi)部RAM中存一無(wú)符號(hào)數(shù)的數(shù)組,其長(zhǎng)度為100,起始地址是30H,要求將它們從大到小排序,排序后仍存放在原區(qū)域中,試編者按程。,解: 先舉四個(gè)數(shù)排序的例子 內(nèi)RAM 第一次外循環(huán) 第二次外循環(huán) 第三次外循環(huán) 30H 0 0 0 3 0 3 0 6 31H 0 3 0 2 0 6 0 3 32H 0 2 0 6 0 2 0 2 33H 0 6 0 0 0 0 0 0,共4 1 = 3 次外循環(huán),123,這就是所謂的“冒泡法”。 4個(gè)數(shù)排序最多經(jīng)過(guò) 3 次外循環(huán)就可排出,每次外循環(huán)都包含3次內(nèi)循環(huán)。實(shí)際上大多情況不用 3 次外循環(huán)就可排完。 對(duì)于100個(gè)數(shù)排序也是如此,用不到99次循環(huán),排序就結(jié)束。為了提高排序速度,程序中可設(shè)一交換標(biāo)志位,如10H位, 每次循環(huán)中:若有交換則 SETB 10H 若無(wú)交換則 CLR 10H 每次循環(huán)結(jié)束時(shí),測(cè)10H位,判斷排序是否結(jié)束。,124,ORG 1000H BUBBLE:MOV R0,#30H MOV B,#64H CLR 10H DEC B ;長(zhǎng)度計(jì)數(shù) LOOP:MOV A,R0 ;內(nèi)循環(huán)的入口 MOV 20H,A ;暫存,為交換作準(zhǔn)備 INC R0 MOV 21H,R0 CJNE A,21H,BUEU ;若(20H)(21H)轉(zhuǎn)移,125,BUEU: JNC BUNEXT ;(20H)(21H)轉(zhuǎn)移 MOV A,R0 ;若(20H) (21H)則交換 MOV R0,20H DEC R0 ;使R0退格指向小地址 MOV R0,A INC R0 ;恢復(fù)R0指向大地址 SETB 10H ;置交換標(biāo)志 BUNEXT: DJNZ B,LOOP ;內(nèi)循環(huán)是否結(jié)束的判斷 JB 10H,BUBBLE ;判斷標(biāo)志位為1否?外循環(huán)結(jié) ;束的判斷 END,126,127,