MSC-51指令系統(tǒng)新ppt課件
《MSC-51指令系統(tǒng)新ppt課件》由會員分享,可在線閱讀,更多相關《MSC-51指令系統(tǒng)新ppt課件(127頁珍藏版)》請在裝配圖網(wǎng)上搜索。
第二章 MCS-51指令系統(tǒng),物理系,1,,,,重點內(nèi)容,1.尋址方式,2.111條指令,3.偽指令,,4.程序設計,2,高級語言:,§2-1 指令系統(tǒng)概述,一、指令和程序設計語言 指令:CPU根據(jù)人的意圖來執(zhí)行某種操作的命令。 程序:按照人們的要求完成某項特定任務所編排的指令操作序列。,匯編語言:,機器語言:,程序設計語言:,用二進制代碼表示指令和數(shù)據(jù)。,用助記符表示指令操作功能,用標號表示操作對象。,獨立于機器,面向過程,接近自然語言和數(shù)學表達式.,3,,現(xiàn)在描述計算機指令系統(tǒng)及實際應用中主要采用匯編語言形式。 采用機器語言編寫的程序稱之為目標程序 采用匯編語言編寫的程序稱之為源程序。 匯編語言程序不能被計算機直接識別并執(zhí)行,必須經(jīng)過一個中間環(huán)節(jié)把它翻譯成機器語言程序,這個中間過程叫做匯編。 匯編有兩種方式:機器匯編和手工匯編。 機器匯編是用專門的匯編程序,在計算機上進行翻譯; 手工匯編是編程員把匯編語言指令逐條翻譯成機器語言指令。,4,,,指令 = 操作碼 + 操作數(shù) 操作碼——表示了該指令所能執(zhí)行的操作功能。 操作數(shù)——表示參加操作的數(shù)的本身或操作數(shù)所在的地址。 MCS-51指令格式:,,操作碼 〔目的操作數(shù)〕〔,源操作數(shù)〕,二、指令格式,5,指令一般有功能、時間和空間三種屬性。 功能屬性是指每條指令都對應一個特定的操作功能; 時間屬性指一條指令執(zhí)行所用的時間,一般用機器周期來表示; 空間屬性是指一條指令在程序存儲器中存儲所占用的字節(jié)數(shù)。 這三種屬性在使用中最重要的是功能,但時間、空間屬性在有些場合也要用到。,如一些實時控制應用程序中,有時需要計算一個程序段的確切執(zhí)行時間或編寫軟件延時程序,都要用到每條指令的時間屬性;在程序存儲器的空間設計,或相對轉(zhuǎn)移指令的偏移量計算時就要用到指令的空間屬性。,6,從空間屬性上分為單字節(jié)指令(49條)、雙字節(jié)指令(46條)和最長的三字節(jié)指令(只有16條)。 從時間屬性上可分成單機器周期指令(64條)、雙機器周期指令(45條)和只有乘、除法兩條4個機器周期的指令。 可見,MCS-51單片機指令系統(tǒng)在存儲空間和執(zhí)行時間方面具有較高的效率。,7,,單字節(jié)指令 雙字節(jié)指令 三字節(jié)指令,INC A ADD A,#22H MOV 5EH,4FH,機器碼指令格式,8,,,,三 尋址方式 尋找操作數(shù)存放單元的地址的方式,共7種方式。 1、立即數(shù)尋址 所要找的操作數(shù)是一二進制數(shù)或十進制數(shù),出現(xiàn)在指令中,用“#”作前綴 MOV A,#20H 2、寄存器尋址 操作數(shù)存放在工作寄存器R0 ~ R7中,或寄存器A、B中。 MOV A,R2 3、直接尋址 指令中直接給出操作數(shù)的地址。直接尋址可訪問128B的RAM單元和特殊功能寄存器。直接尋址的地址占一字節(jié),所以,一條直接尋址方式的指令至少占內(nèi)存兩個單元。 MOV A,30H 或 MOV 30H,DPH,9,,,,;書放在甲抽屜中 ;甲抽屜的鑰匙放在乙抽屜中 ;取書,,A中,,20H,MOV 30H,#20H,MOV R0,#30H,MOV A,@R0,此例中,20H就當成是那本書;30H就當成是甲抽屜; R0就當成是乙抽屜,執(zhí)行的結(jié)果就是將20H這個立即數(shù)裝入A中。期間也經(jīng)歷了兩次尋址,即間接尋址。,4、寄存器間接尋址 指令中寄存器的內(nèi)容作為操作數(shù)存放的地址,在工作上間接尋址寄存器前用“@”表示前綴。 例如: “一本書放在甲抽屜中,上了鎖;其開鎖的鑰匙放在乙抽屜中,乙抽屜也上了鎖。問如何才能取到哪本書?” 這就是一個間接尋址的問題,要經(jīng)過兩次尋址才能找到哪本書。而寄存器間接尋址也是同樣。 例如:,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ù)存儲器的64KB空間 MOVX A, @DPTR ;A?(DPTR) MOVX @DPTR, A ;(DPTR)?A,11,,5、變址尋址 操作數(shù)地址 = 變地址 + 基地址 基地址寄存器 DPTR 或 PC 變址寄存器 @A 該尋址方式常用于訪問程序存儲器,查表。 如 MOVC A,@A + DPTR,12,,,6、相對尋址 把指令中給定的地址偏移量與本指令所在單元地址(PC內(nèi)容)相加得到真正有效的操作數(shù)所存放的地址。 例如 “李同學20歲,張同學比李同學大3歲,問張同學多少歲?” 這就是一個相對尋年齡的問題,而相對尋址與此類似。 如 JC 60H ;設(PC) = 2000H為基址,相對偏移量為60H; ; 則當C = 1時,轉(zhuǎn)移的目的地址 = 2000H + 2 + 60H 相對尋址只出現(xiàn)在相對轉(zhuǎn)移指令中。,13,14,,7.位尋址 位尋址范圍: 20H~2FH的16個字節(jié)單元中的128位; 部分特殊功能寄存器中的各位 位地址表示: (1)直接使用位地址:對于20H~2FH的16個單元共128位的位地址分布是00H~7FH。 (2)單元地址.位地址 20H.1 (3)對于特殊功能寄存器,可以直接用寄存器名字加位數(shù)或位名表示, 如PSW.3 , 位名:CY, AC。,15,,16,,,,,,一、指令分類 111條指令,共分五大類: 數(shù)據(jù)傳送類;(29條) 算術(shù)運算類;(24條) 邏輯運算類;(24條) 控制轉(zhuǎn)移類;(17條) 位操作類:(17條),§2-2 MCS-51 指令系統(tǒng),17,,指令中操作數(shù)的描述符號: Rn —— 工作寄存器R0 ~ R7 Ri —— 間接尋址寄存器R0、R1 Direct —— 直接地址,包括內(nèi)部128B RAM單元地址、 26個SFR地址。 #data—— 8位常數(shù) #data 16 —— 16位常數(shù) addr 16 —— 16位目的地址 addr 11 —— 11位目的地址 rel —— 8位帶符號的偏移地址 DPTR—— 16位外部數(shù)據(jù)指針寄存器 bit—— 可直接位尋址的位,18,,A —— 累加器 B —— 寄存器B C —— 進、借位標志位,或位累加器 @ —— 間接寄存器或基址寄存器的前綴 / —— 指定位求反 (x)—— x中的內(nèi)容 ((x))—— x中的地址中的內(nèi)容 $ —— 當前指令存放的地址,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ù)傳送指令。 上述指令不影響任何標志位,但PSW的P位除外。,(direct),,(A),MOV direct,A ;,22,,,,,上述指令不影響任何標志位,但PSW的P位除外。 注意:MOV Rn,Rn MOV @Ri, @Ri MOV Rn, @Ri MOV #data, A 等等指令是非法指令。,Х,Х,Х,Х,哇!好容易出錯??!,23,(2) (direct),2)棧操作指令 PUSH direct POP direct 不影響任何標志位。 PUSH direct 指令執(zhí)行中,機器自動進行兩步操作: (1) (SP)+ 1,,,例1、設(SP) = 09H,(DPTR)= 0123H,分析: 執(zhí)行 PUSH DPL PUSH DPH 后,各單元中的內(nèi)容。,(SP),((SP)),24,POP direct 指令執(zhí)行中,機器也自動進行兩步操作: (1)(direct) ((SP)) (2)(SP) (SP)- 1 例2、設(SP)= 0BH,(0BH)= 01H,(0AH)= 23H 執(zhí)行 POP DPH POP DPL 后,各單元中的內(nèi)容。,,,25,結(jié)論:1)PUSH 與 POP 操作過程剛好相反; 2)進、出棧規(guī)則: 先進后出,后進先出。應注意指令書寫先后順序; 3)可用于“保護斷點,保護現(xiàn)場”。,26,3、字節(jié)交換指令 XCH A,Rn XCH A,direct 整字節(jié)交換 XCH A,@Ri XCHD A,@Ri SWAP A 半字節(jié)交換 不影響任何標志位。,27,2、 外部RAM數(shù)據(jù)傳送 MOVX A,@Ri MOVX A, @DPTR MOVX @Ri, A MOVX @DPTR,A 執(zhí)行過程中會使/WR、/RD有效。,28,例3、試編寫一程序段,實現(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í)行后會使/PSEN有效。 MOVC 含義是傳送常數(shù)。 以DPTR 為基地址的指令,可在ROM 的64KB范圍內(nèi)查表; 而以PC為基地址的指令只能在(PC)+ 1為中心上、下256B范圍內(nèi)查表。,30,例4、設(A)= 一個BCD碼常數(shù),試用查表法獲得其相應的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é)邏輯操作,雙字節(jié)邏輯操作,共24條。 1、單字節(jié)邏輯操作指令 CLR A ;(A) 0 CPL A A中8位按位求反。 循環(huán)左移、右移指令: RL A RLC A RR A RRC A 注:左移一位相當于乘2;右移一位相當于除2。,,共分兩大類:單字節(jié)邏輯操作,雙字節(jié)邏輯操作,共24條。 1、單字節(jié)邏輯操作指令 CLR A ;(A) 0 CPL A A中8位按位求反。 循環(huán)左移、右移指令: RL A RLC A RR A RRC A 注:左移一位相當于乘2;右移一位相當于除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、設(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操作中,用于端口操作時,無論P0 ~ P3是第一,還是第二操作數(shù),都遵循“讀—修改—寫”端口鎖存器的操作。,37,,三、算術(shù)運算類指令,包括:加、 減、乘、除;加一、減一。 1、加法指令 ADD A,Rn ;(A) (A)+ (Rn)以下類同。 ADD A,direct ADD A,@Ri ADD A,#data 無符號數(shù)相加時:若C = 1,說明有溢出(其值 255)。 帶符號數(shù)相加時:若OV = D7c⊕D6c = 1,說明有溢出。,,,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、設(R0)= 7FH; (7EH)= 40H 執(zhí)行:INC @R0 INC R0 INC @R0 后,,,(R0)= 7FH;,(7EH)= 00H;,(7FH)= 41H,40,,,,DA A ;二 ——十進制調(diào)整指令。 執(zhí)行過程中,CPU能根據(jù)加法運算后,累加器中的值和PSW中的AC及C標志位的狀況自動選擇一個修正值(00H、06H、60H、66H)與原運算結(jié)果相加,進行二——十進制調(diào)整。,選擇修正值的規(guī)則:,41,,,例2、設(A) = 56H 為56的壓縮的BCD碼數(shù),(R3)= 67H,(CY)=1 執(zhí)行 ADDC A,R3 DA A 結(jié)果為:124 注意:1)DA指令只能跟在加法指令后面使用; 2)調(diào)整前參與運算的兩數(shù)是BCD碼數(shù); 3)DA指令不能與減法指令配對使用,但可以實現(xiàn)對A中 壓縮BCD數(shù)進行減一操作。 例3、設(A)=30H(壓縮BCD碼數(shù)),執(zhí)行: ADD A,#99H DA A 后,便實現(xiàn)了30 - 1 = 29的操作。,42,,例4、兩個4位BCD碼相加,一個存放在(31H)(30H);另一個存放在(33H)(32H);和數(shù)擬回存在(31H)(30H)中,試編程實現(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、設(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中的二進制數(shù)轉(zhuǎn)換為3位BCD碼,其中,百位數(shù)存放于31H單元,十位數(shù)和個位數(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)移指令、位運算指令。 位操作由單片機內(nèi)布爾處理器來完成。 位地址的四種表示: 1)使用直接位地址表示;如20H、30H、33H等; 2)使用位寄存器名來表示;如C、OV、F0等; 3)用字節(jié)寄存器名后加位數(shù)來表示; 如PSW.4、P0.5ACC.3等; 4)字節(jié)地址加位數(shù)來表示;如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、編程通過P10線連續(xù)輸出256個寬度為5個機器周期長的方波。,解: 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、用軟件實現(xiàn)下圖所示的P10 ~ P13間的邏輯運算。,解: 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條,分別對C和直接位地址進行測試, 并根據(jù)其狀態(tài)執(zhí)行轉(zhuǎn)移。 1)判布爾累加器轉(zhuǎn)移 JC rel ;(C)= 1,轉(zhuǎn)移,否則順序執(zhí)行。 JNC rel ;(C)= 0,轉(zhuǎn)移,否則順序執(zhí)行。 不影響標志。轉(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單元中的二個無符號數(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í)行, ; 且無論(bit)是否等于1,均使該位清零。 JNB bit,rel ;(bit)= 0,則轉(zhuǎn)移,否則順序執(zhí)行。 ; 不影響標志。,57,,例4、試判斷A中的正負,若為正數(shù),存入20H單元;若為負數(shù)則存入21H單元。,解: JB ACC7,LOOP MOV 20H,A SJMP $ LOOP:MOV 21H,A SJMP $,58,,59,五、控制轉(zhuǎn)移類指令,作用:改變程序計數(shù)器PC的值,從而改變程序執(zhí)行方向。 分為四大類:無條件轉(zhuǎn)移指令;條件轉(zhuǎn)移指令;調(diào)用指令; 返回指令。,,,,,60,LJMP addr16 ;長跳轉(zhuǎn)指令 轉(zhuǎn)移目的地址 addr16 (PC),0000H ~ FFFFH,64KB AJMP addr11 ;絕對轉(zhuǎn)移 轉(zhuǎn)移目的地址的形成:先(PC) (PC)+ 2; 然后 PC15 ~ 11不變,PC10 ~ 0 addr10 ~ 0 64KB = 216 =25×211 = 32×2KB 轉(zhuǎn)移目的地址與(PC)+ 2在同一個2KB范圍內(nèi)。,,,,61,SJMP rel ;短轉(zhuǎn)移,相對尋址。 轉(zhuǎn)移目的地址 = (PC)+ 2 + rel, 所以 rel = 轉(zhuǎn)移目的地址-(PC)-2 但,實際使用中常寫成 SJMP addr16,匯編時會自動轉(zhuǎn) 換成rel。 JMP @A + DPTR ;間接轉(zhuǎn)移,散轉(zhuǎn)移指令。 轉(zhuǎn)移目的地址 = (@A) + (DPTR) 本指令不影響標志位,不改變 @ A 及DPTR中的內(nèi)容。常 用于多分支程序結(jié)構(gòu)中,可在程序運行過程中動態(tài)地決定 程序分支走向。,62,,例1、設A中為鍵值,試編寫按鍵值處理相應事件的程序段。,解: MOV DPTR,#KYEG MOV B,#03H MUL AB JMP @A + DPTR ……… KYEG: LJMP KYEG0 LJMP KYEG ………,63,比較LJMP、AJMP、SJMP、JMP轉(zhuǎn)移的起點和范圍:,64,,,LCALL addr16 ;長調(diào)用 ACALL addr11 ;絕對調(diào)用,LCALL addr16 ;轉(zhuǎn)移范圍64KB,不影響標志位。執(zhí)行中自動完成如下過程: (PC) (PC) + 3 (SP) (SP)+ 1 ((SP)) (PC7 ~ 0), 保護斷點地址低字節(jié); (SP) (SP)+ 1 ((SP)) (PC15 ~ 8),保存斷點地址高字節(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在同一個2KB內(nèi)。不影響任何標志位,執(zhí)行中機器自動完成下列過程: (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,,,,,其機器自動操作過程如下:,比較兩種返回指令含義上的異同點 結(jié)論:RET返回地址事先已知,而RETI的返回地址在程序執(zhí)行中產(chǎn)生的,不固定。不影響標志位,但PSW不能恢復到中斷前的狀態(tài)。,((SP)),68,,69,,空操作指令 NOP ;空操作 不執(zhí)行任何操作,僅僅使(PC)+ 1,繼續(xù)執(zhí)行下條指令,不影響標志位,在ROM中占一個字節(jié)。 用于延時調(diào)整。,70,71,,,,,,4、條件轉(zhuǎn)移指令 實現(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 不影響任何標志位。,1)判零轉(zhuǎn)移 JZ rel JNZ rel,72,,例1、將外RAM的一個數(shù)據(jù)塊(首地址為DATA1)傳送到內(nèi)部數(shù)據(jù)RAM(首地址為DATA2),遇到傳送的數(shù)據(jù)為零時停止傳送,試編程。,解: 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)移指令 功能:比較二個字節(jié)中的值,若不等,則轉(zhuǎn)移。 CINE A,#data,rel CJNE A,direct,rel CJNE @Ri,#data,rel CJNE Rn,#data,rel,該類指令具有比較和判斷雙重功能,比較的本質(zhì)是做減法運算,用第一操作數(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、設P1口的P1.0 ~ P1.3為準備就緒信號輸入端,當該四位為全1時,說明各項工作已準備好,單片機可順序執(zhí)行,否則,循環(huán)等待。,解: MOV A,P1 ANL A,#0FH CJNE A,#0FH,WAIT ;P1.0 ~ P1.3不為全1時,返 ; 回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,,,偽指令是告訴匯編程序,如何匯編源程序的指令。 偽指令既不控制機器的操作,也不能被匯編成機器代碼, 故稱為偽指令。,1、起始地址偽指令 ORG ORG addr16 用于規(guī)定目標程序段或數(shù)據(jù)塊的起始地址, 設置在程序開始處。 2、匯編結(jié)束偽指令 END 告訴匯編程序,對源程序的匯編到此結(jié)束。 一個程序中只出現(xiàn)一 次,在末尾。,§2-3 偽指令,80,,,,3、賦值偽指令 EQU 告訴匯編程序,將匯編語句操作數(shù)的值賦予本語句的標號。 格式: 標號名稱 EQU 數(shù)值或匯編符號 “標號名稱”在源程序中可以作數(shù)值使用,也可以作數(shù)據(jù)地址、 位地址使用。先定義后使用,放在程序開頭。 4、定義字節(jié)偽指令 DB 告訴匯編程序從指定的地址單元開始,定義若干字節(jié)存儲單 元并賦初值。 格式: [標號:] DB 字節(jié)數(shù)據(jù)或字節(jié)數(shù)據(jù)表 5、定義字偽指令 DW 從指定地址開始,定義若干個16個位數(shù)據(jù),高八位存入低地址; 低八位存入高地址。,81,,,例、 ORG 1000H PIOI:DW 7654H,40H、12、‘AB’,6、數(shù)據(jù)地址賦值偽指令 DATA 將表達式指定的數(shù)據(jù)地址賦予規(guī)定的字符名稱 格式: 字符名稱 DATA 表達式 注:該指令與EQU 指令相似,只是,可先使用后定義, 放于程序開頭、結(jié)尾均可。,82,,,7、定義空間偽指令 DS 從指定地址開始,保留由表達式指定的若干字節(jié)空間作 為備用空間。 格式: [標號:] DS 表達式 例2、 ORG 1000H DS 0AH DB 71H,11H,11H ;從100BH開始存放 ;71H11H、11H。,注:DB、DW、DS 只能用于程序存儲器; 而不能用于數(shù)據(jù)存儲器。,83,,,8、位地址賦值偽指令 BIT 將位地址賦予規(guī)定的字符名稱。 格式: 字符名稱 BIT 位地址,例3、 X1 BIT P12 相當于 X1 EQU 92H,84,MCS -51傳送指令示意圖,小 結(jié),數(shù)據(jù)傳送類指令,85,數(shù)據(jù)傳送類指令一覽表,86,數(shù)據(jù)傳送類指令一覽表,87,算術(shù)運算類指令,算術(shù)運算指令,,88,算術(shù)運算指令,,89,影響標志位的指令,90,影響標志位的指令,91,邏輯運算類指令,邏輯運算指令,92,控 制 轉(zhuǎn) 移 指 令,93,位操作類指令,位 操 作 指 令,94,,§2-3 MCS-51 匯編語言程序設計,一、編程步驟 1、分析問題:對需要解決對問題進行分析,有正確的理解。 2、確定算法:即如何將實際問題轉(zhuǎn)化成程序模塊來處理。 3、畫程序流程圖: 4、編寫程序。 由匯編語言編寫的源程序是由許多語句(也可稱為匯編指令)組成的。每個語句由1~4個部分組成,其格式是: [標號]指令助記符[操作數(shù)][;注解],95,,二、匯編程序功能,源程序 (匯編指令程序),,,目標程序 (機器碼指令程序),匯編指令與機器碼指令有一一對應的關系。 匯編程序是一種翻譯程序,將源程序翻譯成目標程序。,96,,,三、匯編程序的匯編過程 匯編有兩種方法:手工匯編、機器匯編。,1、手工匯編: 第一次匯編:確定地址,翻譯成各條機器碼,字符標號原樣寫出; 第二次匯編:標號代真,將字符標號用所計算出的具體地址值或偏移量代換。,97,,,,,,源程序,目標程序,地址,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、機器匯編 兩次掃描過程。 第一次掃描:檢查語法錯誤,確定符號名字; 建立使用的全部符號名字表; 每一符號名字后跟一對應值(地址或數(shù))。 第二次掃描:是在第一次掃描基礎上,將符號地址轉(zhuǎn)換成 地址(代真); 利用操作碼表將助記符轉(zhuǎn)換成相應的目標碼。,99,,,,四、偽指令 偽指令是告訴匯編程序,如何匯編源程序的指令。 偽指令既不控制機器的操作,也不能被匯編成機器代碼, 故稱為偽指令。,1、起始地址偽指令 ORG ORG addr16 用于規(guī)定目標程序段或數(shù)據(jù)塊的起始地址, 設置在程序開始處。 2、匯編結(jié)束偽指令 END 告訴匯編程序,對源程序的匯編到此結(jié)束。 一個程序中只出現(xiàn)一 次,在末尾。,100,,,,3、賦值偽指令 EQU 告訴匯編程序,將匯編語句操作數(shù)的值賦予本語句的標號。 格式: 標號名稱 EQU 數(shù)值或匯編符號 “標號名稱”在源程序中可以作數(shù)值使用,也可以作數(shù)據(jù)地址、 位地址使用。先定義后使用,放在程序開頭。 4、定義字節(jié)偽指令 DB 告訴匯編程序從指定的地址單元開始,定義若干字節(jié)存儲單 元并賦初值。 格式: [標號:] DB 字節(jié)數(shù)據(jù)或字節(jié)數(shù)據(jù)表 5、定義字偽指令 DW 從指定地址開始,定義若干個16個位數(shù)據(jù),高八位存入低地址; 低八位存入高地址。,101,,,例、 ORG 1000H PIOI:DW 7654H,40H、12、‘AB’,6、數(shù)據(jù)地址賦值偽指令 DATA 將表達式指定的數(shù)據(jù)地址賦予規(guī)定的字符名稱 格式: 字符名稱 DATA 表達式 注:該指令與EQU 指令相似,只是,可先使用后定義, 放于程序開頭、結(jié)尾均可。,102,,,7、定義空間偽指令 DS 從指定地址開始,保留由表達式指定的若干字節(jié)空間作 為備用空間。 格式: [標號:] DS 表達式 例2、 ORG 1000H DS 0AH DB 71H,11H,11H ;從100BH開始存放 ;71H11H、11H。,注:DB、DW、DS 只能用于程序存儲器; 而不能用于數(shù)據(jù)存儲器。,103,,,8、位地址賦值偽指令 BIT 將位地址賦予規(guī)定的字符名稱。 格式: 字符名稱 BIT 位地址,例3、 X1 BIT P12 相當于 X1 EQU 92H,104,,105,,,,§2-4 匯編語言程序的基本結(jié)構(gòu)及應用舉例,程序編寫做到:占用存儲空間少;運行時間短; 程序的編制、調(diào)試及排錯所需時間短;結(jié)構(gòu)清晰,易讀、易于移植。,按結(jié)構(gòu)化程序設計思想,任何復雜程序都可由 順序結(jié)構(gòu)、 分支結(jié)構(gòu)、 循環(huán)結(jié)構(gòu),106,107,,,一、順序程序舉例 例1、設在外RAM的60H單元存有1個字節(jié)代碼,要求將其分解成兩個4位字段,高4位存入原單元的低4位,其低4位存入61H單元的低4位,且要求這兩個單元的高4位均為0,試編制完整程序。,分析:,# # # # ¥ ¥ ¥ ¥,,0 0 0 0 # # # #,,0 0 0 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)與分支程序設計 結(jié)構(gòu):根據(jù)不同的條件,進行相應的處理。 通常用條件轉(zhuǎn)移指令形成簡單分支結(jié)構(gòu)。 如: 判(A) = Z 或 NZ ,轉(zhuǎn)移 判(CY)= 1 或 0 ,轉(zhuǎn)移 判(bit)=1 或 0 ,轉(zhuǎn)移 CJNE 比較不相等轉(zhuǎn)移,110,,,例3、設a存放在累加器A中,b存放在寄存器B中,要求按下式 計算Y值,并將結(jié)果Y存于累加器A 中,試編寫程序。 a-b (a≥0) Y = a+b (a 0),,解:本題關鍵是判a是正數(shù),還是負數(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、設有兩個16位無符號數(shù)NA,NB分別存放在8031單片機內(nèi)部RAM的40H、41H及50H、51H單元中,當NA NB時,將內(nèi)部RAM的42H單元清0;否則,將該單元置成全1,試編程。 解法I:因為無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:先假設NA NB,再來判斷是否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 ;不大于標志 HIGHE:MOV 42H,R0 SJMP $ END,114,,,小結(jié): 1、匯編程序有哪三種基本結(jié)構(gòu)? 2、構(gòu)成分支程序,常用到哪些判斷語句?,順序程序 —— 每條指令只執(zhí)行一次; 分支程序 —— 根據(jù)不同條件,會跳過一些指令,而轉(zhuǎn)去 執(zhí)行另一些指令 共同點: 每條指令至多執(zhí)行一次。但是,實際中有時要求某程 序段多次重復執(zhí)行,需要采用循環(huán)結(jié)構(gòu)。,115,,循環(huán)結(jié)構(gòu)不但使程序簡練,而且大大節(jié)省存儲空間。 循環(huán)程序包含四部分: 1、初始化部分 (循環(huán)計數(shù)器、變量置初值) 2、循環(huán)處理部分(主體,需要重復執(zhí)行的部分) 3、循環(huán)控制部分(修改地址指針、修改變量、檢測 循環(huán)結(jié)束條件) 4、循環(huán)結(jié)束部分(對結(jié)果分析、處理,存放結(jié)果),116,先修理,后判斷:,先判斷,后處理:,117,,,,,循環(huán)有:單循環(huán)、多重循環(huán)。 循環(huán)次數(shù)已知,可用計數(shù)器控制循環(huán)次數(shù); 循環(huán)次數(shù)未知,按問題條件控制循環(huán)是否結(jié)束。,1、單循環(huán)程序 (1)循環(huán)次數(shù)是已知的程序 例1、已知片外RAM的10H單元存放8位二進制數(shù),要求將其轉(zhuǎn)移成相應的ASCII碼,并以高位在前,低位在后的順序,依次存放到片外RAM以11H為首地址的連續(xù)單元中,試編程。 解:先將中間單元置成30H,然后判欲轉(zhuǎn)換位是否為1, 若是,則將中間單元內(nèi)容加1;否則,中間單元內(nèi)容保持不變。 通過左移指令實現(xiàn)由高到低的順序進行轉(zhuǎn)換。,118,START:MOV R2,#08H ;循環(huán)計數(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)換的二進制位為0否? INC A ;若為1,則變成1的ASCII碼“31H” NA:INC R0 ;修改地址指針 MOVX @R0,A ;存放轉(zhuǎn)換的結(jié)果 MOV A,B RL A,B ;作好準備,判斷下一位 MOV B,A ;暫存 DJNZ R2,LOOP ;判斷轉(zhuǎn)換結(jié)束否?未完繼續(xù) SJMP $,119,,,,(2)循環(huán)次數(shù)未知的程序 例2、設用戶用鍵盤輸入長度不超過100字節(jié)的字符串放在8031單片機外部RAM以20H為首地址的連續(xù)單元,該字符串用回車符CR(‘CR’= 0DH)作為結(jié)束標志,要求統(tǒ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)設計 循環(huán)體中還包含著一個或多個循環(huán)結(jié)構(gòu),即雙重或多重循環(huán)。 例3、設8031使用12MHz晶振,試設計延遲100ms的延時程序。,121,,,內(nèi)循環(huán)延時: (1 + 2 × CTR)T = 500us(假設) 則CTR = 250 實際延時:[1 + 2 × 250] × 1us = 501us 外循環(huán)延時:T +(501 + 2T)× CTS = 100ms = 100 000us 所以 , CTS = 198.8 取 199 實際延時:[1 + (501 + 2)×199] = 1000.98ms,122,,,,,,例4、設在8031內(nèi)部RAM中存一無符號數(shù)的數(shù)組,其長度為100,起始地址是30H,要求將它們從大到小排序,排序后仍存放在原區(qū)域中,試編者按程。,解: 先舉四個數(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個數(shù)排序最多經(jīng)過 3 次外循環(huán)就可排出,每次外循環(huán)都包含3次內(nèi)循環(huán)。實際上大多情況不用 3 次外循環(huán)就可排完。 對于100個數(shù)排序也是如此,用不到99次循環(huán),排序就結(jié)束。為了提高排序速度,程序中可設一交換標志位,如10H位, 每次循環(huán)中:若有交換則 SETB 10H 若無交換則 CLR 10H 每次循環(huán)結(jié)束時,測10H位,判斷排序是否結(jié)束。,124,ORG 1000H BUBBLE:MOV R0,#30H MOV B,#64H CLR 10H DEC B ;長度計數(shù) LOOP:MOV A,@R0 ;內(nèi)循環(huán)的入口 MOV 20H,A ;暫存,為交換作準備 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 ;恢復R0指向大地址 SETB 10H ;置交換標志 BUNEXT: DJNZ B,LOOP ;內(nèi)循環(huán)是否結(jié)束的判斷 JB 10H,BUBBLE ;判斷標志位為1否?外循環(huán)結(jié) ;束的判斷 END,126,,127,- 配套講稿:
如PPT文件的首頁顯示word圖標,表示該PPT已包含配套word講稿。雙擊word圖標可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設計者僅對作品中獨創(chuàng)性部分享有著作權(quán)。
- 關 鍵 詞:
- MSC 51 指令系統(tǒng) ppt 課件
裝配圖網(wǎng)所有資源均是用戶自行上傳分享,僅供網(wǎng)友學習交流,未經(jīng)上傳用戶書面授權(quán),請勿作他用。
鏈接地址:http://m.zhongcaozhi.com.cn/p-1312327.html