匯編語言序程設(shè)計(jì)課件_第1頁
匯編語言序程設(shè)計(jì)課件_第2頁
匯編語言序程設(shè)計(jì)課件_第3頁
匯編語言序程設(shè)計(jì)課件_第4頁
匯編語言序程設(shè)計(jì)課件_第5頁
已閱讀5頁,還剩48頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、13. 3. 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì) 3.1 3.1 匯編語言源程序設(shè)計(jì)與匯編匯編語言源程序設(shè)計(jì)與匯編 3.2 3.2 程序計(jì)數(shù)器和程序運(yùn)行程序計(jì)數(shù)器和程序運(yùn)行 3.3 3.3 順序程序設(shè)計(jì)順序程序設(shè)計(jì) 3.4 3.4 分支程序設(shè)計(jì)分支程序設(shè)計(jì) 3.5 3.5 循環(huán)程序設(shè)計(jì)循環(huán)程序設(shè)計(jì) 3.6 3.6 子程序設(shè)計(jì)子程序設(shè)計(jì) 3.7 3.7 常用程序設(shè)計(jì)常用程序設(shè)計(jì) 23. 3. 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)3.1 匯編語言源程序設(shè)計(jì)和匯編匯編語言源程序設(shè)計(jì)和匯編3.1.1 指令和助記符指令和助記符指令指令 = = 操作碼操作碼 + + 操作數(shù)操作數(shù)例如8051做10加20的加法,

2、在程序存儲(chǔ)器中需要預(yù)先存儲(chǔ)程序存儲(chǔ)器中需要預(yù)先存儲(chǔ)2條機(jī)器碼指令條機(jī)器碼指令 0111 0100 ;指令;指令1操作碼,把操作碼,把10送入累加器送入累加器A 0000 1010 ;指令;指令1操作數(shù),操作數(shù),10=00001010B=0AH0010 0100 ;指令;指令2操作碼,累加器操作碼,累加器A內(nèi)容加內(nèi)容加20,結(jié)果存于,結(jié)果存于A 0001 0100 ;指令;指令2操作數(shù),操作數(shù),20=00010100B=14HMOV A,0AH ;操作碼助記符;操作碼助記符MOV,操作數(shù)助記符累加器,操作數(shù)助記符累加器A和立即數(shù)和立即數(shù)10ADD A,14H ;操作碼助記符;操作碼助記符ADD,

3、操作數(shù)助記符累加器,操作數(shù)助記符累加器A和立即數(shù)和立即數(shù)20機(jī)器語言匯編語言手工匯編機(jī)器匯編33. 3. 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)1 1、指令屬性、指令屬性時(shí)間屬性時(shí)間屬性:指令周期,一條指令執(zhí)行需要一定的時(shí)間。:指令周期,一條指令執(zhí)行需要一定的時(shí)間。1機(jī)器周期指令、機(jī)器周期指令、2機(jī)器周期指令和機(jī)器周期指令和4機(jī)器周期指令機(jī)器周期指令空間屬性空間屬性:在:在ROM存放占用的單元數(shù),即指令的字節(jié)數(shù)。存放占用的單元數(shù),即指令的字節(jié)數(shù)。1字節(jié)指令、字節(jié)指令、2字節(jié)指令和字節(jié)指令和3字節(jié)指令字節(jié)指令功能屬性功能屬性:指令完成的功能。:指令完成的功能。算術(shù)運(yùn)算類指令、邏輯運(yùn)算類指令、移位類指令

4、等算術(shù)運(yùn)算類指令、邏輯運(yùn)算類指令、移位類指令等2 2、指令的字節(jié)數(shù)(空間屬性)、指令的字節(jié)數(shù)(空間屬性) 單字節(jié)指令單字節(jié)指令 雙字節(jié)指令雙字節(jié)指令 三字節(jié)指令三字節(jié)指令操作碼操作碼1字節(jié),無操作數(shù)或者字節(jié),無操作數(shù)或者操作數(shù)是寄存器尋址操作數(shù)是寄存器尋址 或或 操作碼操作碼1字節(jié),操作數(shù)字節(jié),操作數(shù)1字節(jié)。字節(jié)。操作碼操作碼1字節(jié),操作數(shù)字節(jié),操作數(shù)2字節(jié)。字節(jié)。43. 3. 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)3.1.2 偽指令偽指令 偽指令雖然具有類似指令的形式,但不是真正的指令,偽指令雖然具有類似指令的形式,但不是真正的指令,不會(huì)產(chǎn)生任何可供機(jī)器直接不會(huì)產(chǎn)生任何可供機(jī)器直接執(zhí)行的機(jī)器碼執(zhí)行

5、的機(jī)器碼。偽指令用來對(duì)匯編過程進(jìn)行控制,是編程員發(fā)給匯編程序的命令,也稱。偽指令用來對(duì)匯編過程進(jìn)行控制,是編程員發(fā)給匯編程序的命令,也稱為匯編命令或匯編程序控制命令。為匯編命令或匯編程序控制命令。 1 1、起始匯編偽指令、起始匯編偽指令ORGORG(OriginOrigin) ORG 16位地址位地址用來規(guī)定源程序或者數(shù)據(jù)塊在程序存儲(chǔ)器的起始地址。注意地址從小到大排列,不同的用來規(guī)定源程序或者數(shù)據(jù)塊在程序存儲(chǔ)器的起始地址。注意地址從小到大排列,不同的程序段不可彼此覆蓋。程序段不可彼此覆蓋。2 2、結(jié)束匯編偽指令、結(jié)束匯編偽指令ENDEND END 表示源程序到此結(jié)束。在一個(gè)源程序中只允許出現(xiàn)一

6、條表示源程序到此結(jié)束。在一個(gè)源程序中只允許出現(xiàn)一條END語句,而且必須安排在源程語句,而且必須安排在源程序的末尾,匯編器對(duì)序的末尾,匯編器對(duì)END語句后的所有語句都不進(jìn)行匯編。語句后的所有語句都不進(jìn)行匯編。3 3、賦值偽指令、賦值偽指令EQUEQU(EquateEquate) 字符名稱字符名稱EQU賦值項(xiàng)賦值項(xiàng)其中賦值項(xiàng)可以是常數(shù)、地址、標(biāo)號(hào)或者是表達(dá)式,以其中賦值項(xiàng)可以是常數(shù)、地址、標(biāo)號(hào)或者是表達(dá)式,以8位或位或16位二進(jìn)制數(shù)存放。匯編位二進(jìn)制數(shù)存放。匯編程序自動(dòng)把程序自動(dòng)把EQU右邊的賦值項(xiàng)賦給左邊的字符名稱。一旦字符名稱被賦值它就可以在程右邊的賦值項(xiàng)賦給左邊的字符名稱。一旦字符名稱被賦值

7、它就可以在程序中作為數(shù)據(jù)或地址來多次使用。必須先賦值再使用,故該語句常放在程序開頭。序中作為數(shù)據(jù)或地址來多次使用。必須先賦值再使用,故該語句常放在程序開頭。 53. 3. 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)3.1.2 偽指令偽指令4 4、位地址賦值偽指令、位地址賦值偽指令BITBIT 字符名稱字符名稱 BIT 位地址位地址把把BIT右邊的位地址或位名稱賦給左邊的字符名稱。因此右邊的位地址或位名稱賦給左邊的字符名稱。因此BIT語句定義的字符名稱是此位語句定義的字符名稱是此位地址的別稱。地址的別稱。5 5、定義空間偽指令、定義空間偽指令DSDS(Define StorageDefine Storag

8、e) 標(biāo)號(hào):標(biāo)號(hào): DS 表達(dá)式表達(dá)式DS從指定的地址單元開始,保留由表達(dá)式指定的若干字節(jié)空間作為備用空間,空間大小從指定的地址單元開始,保留由表達(dá)式指定的若干字節(jié)空間作為備用空間,空間大小由由DS語句中表達(dá)式?jīng)Q定。同語句中表達(dá)式?jīng)Q定。同DB一樣,一樣,DS偽指令只能用于程序存儲(chǔ)器。偽指令只能用于程序存儲(chǔ)器。 ORG1000HDS 08H;從;從1000H開始保留開始保留8字節(jié)的存儲(chǔ)空間備用字節(jié)的存儲(chǔ)空間備用DB 71H,13H,11H ;數(shù)據(jù)表從;數(shù)據(jù)表從1008H開始存放開始存放經(jīng)匯編后從經(jīng)匯編后從1000H單元開始保留單元開始保留8個(gè)字節(jié)的存儲(chǔ)單元,而從個(gè)字節(jié)的存儲(chǔ)單元,而從1008H單

9、元開始連續(xù)單元開始連續(xù)存放存放71H、13H和和11H等數(shù)據(jù)。等數(shù)據(jù)。63. 3. 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)3.1.3 匯編語句格式匯編語句格式標(biāo)號(hào)標(biāo)號(hào):操作碼操作碼 操作數(shù)操作數(shù)1,操作數(shù),操作數(shù)2 ,操作數(shù),操作數(shù)3 ;注釋;注釋 1 1、標(biāo)號(hào)、標(biāo)號(hào)標(biāo)號(hào)是標(biāo)號(hào)是語句地址語句地址的標(biāo)志符號(hào),它由的標(biāo)志符號(hào),它由18個(gè)個(gè)ASCII字符組成,可以是字母、數(shù)字和一些特字符組成,可以是字母、數(shù)字和一些特定字符,定字符,英文字母開頭,冒號(hào)結(jié)束英文字母開頭,冒號(hào)結(jié)束。為了避免把標(biāo)號(hào)中字符當(dāng)作指令來匯編,用戶在編。為了避免把標(biāo)號(hào)中字符當(dāng)作指令來匯編,用戶在編寫自己的程序時(shí)絕對(duì)不應(yīng)采用指令、寄存器名

10、以及偽指令等作為語句的標(biāo)號(hào),而且同一寫自己的程序時(shí)絕對(duì)不應(yīng)采用指令、寄存器名以及偽指令等作為語句的標(biāo)號(hào),而且同一標(biāo)號(hào)在一個(gè)程序中只能定義一次。對(duì)每一條語句而言,標(biāo)號(hào)不是必選的,標(biāo)號(hào)的有無取標(biāo)號(hào)在一個(gè)程序中只能定義一次。對(duì)每一條語句而言,標(biāo)號(hào)不是必選的,標(biāo)號(hào)的有無取決于程序中有無其它語句訪問該語句,一般用于轉(zhuǎn)移程序的首地址。決于程序中有無其它語句訪問該語句,一般用于轉(zhuǎn)移程序的首地址。2 2、操作碼、操作碼操作碼是匯編指令格式中唯一不能空缺的部分,可分為指令性語句和指示性語句兩類。操作碼是匯編指令格式中唯一不能空缺的部分,可分為指令性語句和指示性語句兩類。(1)指令性語句)指令性語句指令性語句是指

11、采用指令助記符構(gòu)成的匯編語言語句,指令性語句是指采用指令助記符構(gòu)成的匯編語言語句,8051單片機(jī)中的指令性語句是指單片機(jī)中的指令性語句是指111條指令的助記符語句。因此,指令性語句是匯編語言語句的主體。每條指令性語句都條指令的助記符語句。因此,指令性語句是匯編語言語句的主體。每條指令性語句都有與之對(duì)應(yīng)的機(jī)器碼供有與之對(duì)應(yīng)的機(jī)器碼供CPU識(shí)別和執(zhí)行。如前述及的識(shí)別和執(zhí)行。如前述及的MOV、ADD、SETB、CLR等。等。(2)指示性語句)指示性語句指示性語句又稱為偽指令語句,不會(huì)產(chǎn)生任何可供指示性語句又稱為偽指令語句,不會(huì)產(chǎn)生任何可供CPU識(shí)別和執(zhí)行的機(jī)器碼,只是用來識(shí)別和執(zhí)行的機(jī)器碼,只是用來

12、對(duì)匯編過程進(jìn)行某種控制。對(duì)匯編過程進(jìn)行某種控制。73. 3. 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)3.1.3 匯編語句格式匯編語句格式標(biāo)號(hào):操作碼標(biāo)號(hào):操作碼 操作數(shù)操作數(shù)1,操作數(shù),操作數(shù)2 ,操作數(shù),操作數(shù)3 ;注釋;注釋 3 3、操作數(shù)、操作數(shù) 指令執(zhí)行時(shí)涉及到的數(shù)據(jù)或者數(shù)據(jù)的地址。它與操作碼以空格分界,兩操作數(shù)或三指令執(zhí)行時(shí)涉及到的數(shù)據(jù)或者數(shù)據(jù)的地址。它與操作碼以空格分界,兩操作數(shù)或三操作數(shù)時(shí)以逗號(hào)分開,可以是十進(jìn)制數(shù)、二進(jìn)制數(shù)(操作數(shù)時(shí)以逗號(hào)分開,可以是十進(jìn)制數(shù)、二進(jìn)制數(shù)(B)、十六制數(shù)()、十六制數(shù)(H)、)、ASCII碼碼( )、寄存器名、存儲(chǔ)器地址、位地址以及變量標(biāo)識(shí)符等。)、寄存

13、器名、存儲(chǔ)器地址、位地址以及變量標(biāo)識(shí)符等。16位地址位地址ROM: A+DPTR,A+PC 16位地址片外位地址片外RAM: DPTR8位地址片內(nèi)位地址片內(nèi)RAM: direct(8位字節(jié)地址),位字節(jié)地址), Ri寄存器寄存器(8位位):A, Rn, AB數(shù)值:數(shù)值:#data, #data16 只能作為源操作數(shù)只能作為源操作數(shù)寄存器寄存器(16位位): DPTR位操作位操作(1位位): C(寄存器尋址寄存器尋址),bit(8位位地址)位位地址)其他:其他:addr16 , addr11, rel(地址相對(duì)偏移量)(地址相對(duì)偏移量)4 4、注釋、注釋 對(duì)語句在程序中完成的功能加以解釋,對(duì)語句

14、在程序中完成的功能加以解釋, “;”分號(hào)開頭,不會(huì)被匯編程序理解為指令分號(hào)開頭,不會(huì)被匯編程序理解為指令83. 3. 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)數(shù)據(jù)傳送類數(shù)據(jù)傳送類片內(nèi)RAM與寄存器傳送操作特點(diǎn):數(shù)據(jù)的特點(diǎn):數(shù)據(jù)的復(fù)制復(fù)制操作,操作,目的與源看齊且等寬目的與源看齊且等寬。MOV 目的操作數(shù)目的操作數(shù),源操作數(shù)源操作數(shù)大部分指令操作數(shù)在大部分指令操作數(shù)在片內(nèi)片內(nèi)RAM和寄存器和寄存器,字節(jié)字節(jié)操作。操作。訪問片內(nèi)訪問片內(nèi)RAM:directRi寄存器:寄存器:ARn立即數(shù):立即數(shù): #dataARndirectRiARndirectRi#data1、立即尋址不能做目的操作數(shù)、立即尋址不能做

15、目的操作數(shù)2、工作寄存器不能在兩邊同時(shí)出現(xiàn)、工作寄存器不能在兩邊同時(shí)出現(xiàn)93. 3. 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)算術(shù)運(yùn)算類算術(shù)運(yùn)算類算術(shù)運(yùn)算指令按照算術(shù)運(yùn)算指令按照8 8位位2 2進(jìn)制運(yùn)算法則運(yùn)算,程序員負(fù)責(zé)按照程序的要求負(fù)責(zé)解釋。進(jìn)制運(yùn)算法則運(yùn)算,程序員負(fù)責(zé)按照程序的要求負(fù)責(zé)解釋。注意:注意:運(yùn)算對(duì)狀態(tài)標(biāo)志位的影響。運(yùn)算對(duì)狀態(tài)標(biāo)志位的影響。PSWPSW的的CYCY(C C)、)、ACAC、OVOV單字節(jié)加法單字節(jié)加法 ADD A ,多字節(jié)加法(多字節(jié)加法(ADD with Carry) ADDC A ,RndirectRi#data多字節(jié)減法(多字節(jié)減法( Subtraction wi

16、th Borrow 帶借位減法帶借位減法 ) SUBB A ,BCD碼加法碼加法 ( Decimal Adjust 十進(jìn)制調(diào)整指令)十進(jìn)制調(diào)整指令)DA A;硬件對(duì)BCD碼加法結(jié)果修正,過9補(bǔ)6注意:此指令使用時(shí)緊跟在ADD和ADDC指令后,對(duì)BCD碼加法結(jié)果進(jìn)行自動(dòng)修正自動(dòng)修正CLR CSUBB A ,單字節(jié)減法單字節(jié)減法103. 3. 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)自增自減自增自減自增自增 Increment with constant 1 實(shí)現(xiàn)操作數(shù)自身內(nèi)容的加實(shí)現(xiàn)操作數(shù)自身內(nèi)容的加1或減或減1操作,操作,不影響標(biāo)志位狀態(tài)。不影響標(biāo)志位狀態(tài)。自減自減 Decrement with co

17、nstant 1 INC A RndirectRiDPTRDEC A RndirectRi注意:自增自減操作常用于地址變量(指針)內(nèi)容的更新,數(shù)據(jù)指針只有自增操作。注意:自增自減操作常用于地址變量(指針)內(nèi)容的更新,數(shù)據(jù)指針只有自增操作。例例3-4 多字節(jié)加法程序。設(shè)被加數(shù)存放在:多字節(jié)加法程序。設(shè)被加數(shù)存放在:40H(高字節(jié)),(高字節(jié)),41H,42H(低字節(jié))。加(低字節(jié))。加數(shù)存放在:數(shù)存放在:43H(高字節(jié)),(高字節(jié)),44H,45H(低字節(jié))。運(yùn)算結(jié)果仍存在被加數(shù)單元中(低字節(jié))。運(yùn)算結(jié)果仍存在被加數(shù)單元中片內(nèi)RAM雙指針R0,R1片外RAM單指針DPTR變址A113. 3. 匯

18、編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)例例3-4 多字節(jié)加法程序。設(shè)被加數(shù)存放在:多字節(jié)加法程序。設(shè)被加數(shù)存放在:40H(高字節(jié)),(高字節(jié)),41H,42H(低字節(jié))。加(低字節(jié))。加數(shù)存放在:數(shù)存放在:43H(高字節(jié)),(高字節(jié)),44H,45H(低字節(jié))。運(yùn)算結(jié)果仍存在被加數(shù)單元(低字節(jié))。運(yùn)算結(jié)果仍存在被加數(shù)單元 ORG 0030HMOVR0,#42H;地址指針;地址指針0指向被加數(shù)指向被加數(shù)MOVR1,#45H;地址指針;地址指針1指向加數(shù)指向加數(shù)MOVA,R0;取被加數(shù)低字節(jié);取被加數(shù)低字節(jié)ADDA,R1;與加數(shù)低字節(jié)相加;與加數(shù)低字節(jié)相加MOVR0,A;結(jié)果回存入被加數(shù)單元;結(jié)果回存入被

19、加數(shù)單元DECR0 ;地址指針;地址指針0指向被加數(shù)中字節(jié)指向被加數(shù)中字節(jié)DECR1;地址指針;地址指針1指向加數(shù)中字節(jié)指向加數(shù)中字節(jié)MOVA,R0;取被加數(shù)中字節(jié);取被加數(shù)中字節(jié)ADDCA,R1;與加數(shù)中字節(jié)及進(jìn)位位相加;與加數(shù)中字節(jié)及進(jìn)位位相加MOVR0,A;結(jié)果回存入被加數(shù)單元;結(jié)果回存入被加數(shù)單元DECR0;地址指針;地址指針0指向被加數(shù)高字節(jié)指向被加數(shù)高字節(jié)DECR1;地址指針;地址指針1指向加數(shù)高字節(jié)指向加數(shù)高字節(jié)MOVA,R0;取被加數(shù)高字節(jié);取被加數(shù)高字節(jié)ADDCA,R1;與加數(shù)高字節(jié)及進(jìn)位位相加;與加數(shù)高字節(jié)及進(jìn)位位相加MOVR0,A;結(jié)果回存入被加數(shù)單元;結(jié)果回存入被加數(shù)單

20、元 END 123. 3. 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)累加器累加器A清零清零 Clear accumulatorCLR A累加器累加器A按位求反按位求反 Complement accumulatorCPL A例例3-2 、設(shè)有、設(shè)有16位二進(jìn)制數(shù)存放在位二進(jìn)制數(shù)存放在R0、R1中,其中中,其中R0存放高存放高8位,位,R1存放低存放低8位。編位。編程實(shí)現(xiàn)其求反再加一運(yùn)算,結(jié)果送原址。程實(shí)現(xiàn)其求反再加一運(yùn)算,結(jié)果送原址。 ORG 0030HMOVA,R1;取低字節(jié)入;取低字節(jié)入ACPLA ;對(duì)低字節(jié)求反;對(duì)低字節(jié)求反ADDA,01H;加;加1MOVR1,A;存結(jié)果到原址;存結(jié)果到原址MOV

21、A,R0;取高字節(jié)入;取高字節(jié)入ACPL A ;對(duì)高字節(jié)求反;對(duì)高字節(jié)求反ADDCA,00H;加可能產(chǎn)生的低字節(jié)對(duì)高字節(jié)的進(jìn)位;加可能產(chǎn)生的低字節(jié)對(duì)高字節(jié)的進(jìn)位MOVR0,A;存結(jié)果到原址;存結(jié)果到原址SJMP$;原地踏步;原地踏步 END133. 3. 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì) 累加器累加器A循環(huán)左移循環(huán)左移 Rotate LeftRL Aa7 a6 a5 a4 a3 a2 a1 a0a6 a5 a4 a3 a2 a1 a0 a7 A8位的循環(huán)移位器。位的循環(huán)移位器。如果如果a7=0左移一位相當(dāng)于原數(shù)乘左移一位相當(dāng)于原數(shù)乘2SWAP A累加器累加器A循環(huán)右移循環(huán)右移 Rotate R

22、ightRR A8位的循環(huán)移位器。位的循環(huán)移位器。a7 a6 a5 a4 a3 a2 a1 a0a0 a7 a6 a5 a4 a3 a2 a1 A累加器累加器A高低高低4位互換位互換 SWAP如果如果a0=0右移一位相當(dāng)于原數(shù)除以右移一位相當(dāng)于原數(shù)除以2143. 3. 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)累加器累加器A帶進(jìn)位位的循環(huán)左移帶進(jìn)位位的循環(huán)左移 Rotate Left through CarryRLC Aa7 a6 a5 a4 a3 a2 a1 a0a6 a5 a4 a3 a2 a1 a0 CACa7CY9位的循環(huán)移位器。位的循環(huán)移位器。累加器累加器A帶進(jìn)位位的循環(huán)右移帶進(jìn)位位的循環(huán)右移

23、 Rotate Right through CarryRRC A9位的循環(huán)移位器。位的循環(huán)移位器。a7 a6 a5 a4 a3 a2 a1 a0C a7 a6 a5 a4 a3 a2 a1 ACa0CY153. 3. 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)例、片內(nèi)例、片內(nèi)RAM40H、41H單元存放著單元存放著16個(gè)單字節(jié)個(gè)單字節(jié)AD轉(zhuǎn)換值的和,求其算術(shù)平均值。轉(zhuǎn)換值的和,求其算術(shù)平均值。(40H和的高字節(jié),和的高字節(jié),41H和的低字節(jié),不考慮余數(shù))和的低字節(jié),不考慮余數(shù))CLR CMOV A,40HRRC AMOV 40H,AMOV A,41HRRC AMOV 41H,A163. 3. 匯編語言程

24、序設(shè)計(jì)匯編語言程序設(shè)計(jì)邏輯運(yùn)算類邏輯運(yùn)算類按位與按位與AND Logical : ANL A ,RndirectRi#data“遇遇1 1保持,遇保持,遇0 0復(fù)位復(fù)位”。常用于某些特定位的常用于某些特定位的強(qiáng)迫復(fù)位強(qiáng)迫復(fù)位(與(與“0”0”與),與),其余位狀態(tài)不改變(與其余位狀態(tài)不改變(與“1”1”與)。與)。按位或按位或OR Logical :ORL A ,“遇遇0 0保持,遇保持,遇1 1置位置位”。常用于某些特定位的常用于某些特定位的強(qiáng)迫置位強(qiáng)迫置位(與(與“1”1”或),或),其余位狀態(tài)不改變(與其余位狀態(tài)不改變(與“0”0”或)?;颍0次划惢虬次划惢騟Xclusive-OR L

25、ogical :XRL A ,“相同為相同為0 0,相異為,相異為1 1”。常用于某些特定位的常用于某些特定位的求反求反(與(與“1”1”異或),異或),其位狀態(tài)不改變(與其位狀態(tài)不改變(與“0”0”異或)。異或)。173. 3. 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)例、片內(nèi)例、片內(nèi)RAM40H、41H單元存放著單元存放著16個(gè)單字節(jié)個(gè)單字節(jié)AD轉(zhuǎn)換值的和,求其算術(shù)平均值。轉(zhuǎn)換值的和,求其算術(shù)平均值。(40H和的高字節(jié),和的高字節(jié),41H和的低字節(jié),不考慮余數(shù))和的低字節(jié),不考慮余數(shù)) a7 a6 a5 a4 0 0 0 0a15a14 a13 a12 0 0 0 0a11 a10 a9 a8 0

26、 0 0 0MOV A,40HSWAP AMOV R2,A ;暫存?zhèn)洳鸱?;暫存?zhèn)洳鸱?ANL A,#0FH ;高四位清零;高四位清零MOV 40H,AMOV A,R2 ANL A,#0F0HMOV R2,A ;暫存暫存MOV A,41HSWAP AANL A,#0FHORL A,R2MOV 41H,A拆合a15a14 a13 a12a3 a2 a1 a0 a7 a6 a5 a4a11 a10 a9 a8;Aa15a14 a13 a12 0 0 0 0a11 a10 a9 a8 0 0 0 0;A a7 a6 a5 a4 0 0 0 0;Aa15a14 a13 a12a11 a10 a9 a8

27、a7 a6 a5 a40 0 0 03. 3. 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)3.2 程序計(jì)數(shù)器PC和程序運(yùn)行3.2.1 程序計(jì)數(shù)器PC (Program Counter)PC(Program Counter):程序計(jì)數(shù)器。16位的寄存器,存放的是ROM地址起始地址:0000H 第一條指令地址 形成下一條要執(zhí)行指令的地址: 自動(dòng)加1:取指令的1個(gè)字節(jié)加1 新地址直接替換:轉(zhuǎn)移類指令從程序存儲(chǔ)器某地址取指令分析指令(譯 碼)執(zhí)行指令 形成下一條要執(zhí)行指令的地址起始地址3. 3. 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)3.2.2 簡(jiǎn)單程序運(yùn)行PC=0100HPC=0102H 取指7A23譯碼執(zhí)行 PC

28、=0104HPC=0104H 取指7B24譯碼執(zhí)行 PC=0106HPC=0106H 取指7C25譯碼執(zhí)行 PC=0108HPC=0108H 取指7D26譯碼執(zhí)行 PC=010AHPC=010AH 取指2A譯碼執(zhí)行 PC=010BHPC=010BH 取指2B譯碼執(zhí)行 PC=010CHPC=010CH 取指2C譯碼執(zhí)行 PC=010DHPC=010DH 取指2D譯碼執(zhí)行 PC=010EH PC自動(dòng)加1后形成的值稱PC當(dāng)前值能保證按照指令排列順序執(zhí)行程序取指7400譯碼執(zhí)行PC=0102H0100H0102H0104H0106H0108H010AH010BH010CH010DHMOV A, #00

29、HMOV R2, #23HMOV R3, #24HMOV R4, #25HMOV R5, #26HADD A, R2ADD A, R3ADD A, R4ADD A, R574 007A 237B 247C 257D 262A2B2C2DORG 0100HENDMAIN:標(biāo)號(hào)是語句地址的標(biāo)志符號(hào)010EH3. 3. 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)3.3 順序程序設(shè)計(jì) 順序程序的特點(diǎn)是程序執(zhí)行時(shí),每一條指令都被執(zhí)行一次(有別于分支程序)且僅一次(有別于循環(huán)程序)。計(jì)算機(jī)在執(zhí)行這類程序時(shí)只需按照指令排列的先后順序依次執(zhí)行,中間不會(huì)產(chǎn)生任何分支,故又稱為無分支程序或簡(jiǎn)單程序(不含有轉(zhuǎn)移指令)。例3-

30、3 在實(shí)際壓力測(cè)量系統(tǒng)中通過A/D轉(zhuǎn)換器得到8位無符號(hào)二進(jìn)制數(shù)測(cè)量值存于累加器A中。把A中的二進(jìn)制數(shù)測(cè)量值轉(zhuǎn)換為3位BCD碼,并以壓縮BCD碼形式存放在地址40H、41H單元中。解題思路: 8位二進(jìn)制數(shù)3位BCD碼例如A=1111 0101B 轉(zhuǎn)換 4 5 0 241H40H 十 個(gè) 0 百 41H40H求百位數(shù)求十位數(shù)求個(gè)位數(shù)除以100得到的商DIV AB余數(shù)除以10得到的商除以10得到的余數(shù)DIV AB 0 百 0 十 0 個(gè)合成一字節(jié) 十 0 0 個(gè)SWAP AORL A, 十 個(gè)Binary Coded Decimal3. 3. 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì) ORG 0030H;百

31、位數(shù)MOVB,100 ;除數(shù)100送BDIVAB MOV40H,A ;十位數(shù)和個(gè)位數(shù)MOVA,B ;第一次除法余數(shù) ;做第二次除法被除數(shù)MOVB,#10 ;除數(shù)10送B 例3-3 在實(shí)際壓力測(cè)量系統(tǒng)中,通過A/D轉(zhuǎn)換器得到8位二進(jìn)制數(shù)測(cè)量值,存于A中。利用除法指令把累加器A中的二進(jìn)制數(shù)測(cè)量值轉(zhuǎn)換為3位BCD碼,并以壓縮BCD碼形式存放在地址40H、41H單元中。1111 01010110 01000010 11010000 00100000 00100010 11010000 10103. 3. 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)0100 01010100 0101 ORG 0030H;百位數(shù)M

32、OVB,100 ;除數(shù)100送BDIVAB MOV40H,A ;十位數(shù)和個(gè)位數(shù)MOVA,B ;第一次除法余數(shù) ;做第二次除法被除數(shù)MOVB,#10 ;除數(shù)10送BDIVAB ;合SWAPA ORLA,B ;組成壓縮BCD碼MOV41H,A END 例3-3 在實(shí)際壓力測(cè)量系統(tǒng)中,通過A/D轉(zhuǎn)換器得到8位二進(jìn)制數(shù)測(cè)量值,存于A中。利用除法指令把累加器A中的二進(jìn)制數(shù)測(cè)量值轉(zhuǎn)換為3位BCD碼,并以壓縮BCD碼形式存放在地址40H、41H單元中。0010 11010000 10100000 00100000 01000000 01010100 0000233. 3. 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)3

33、.3 順序程序設(shè)計(jì)順序程序設(shè)計(jì)例3-3 在實(shí)際壓力測(cè)量系統(tǒng)中,通過A/D轉(zhuǎn)換器得到8位二進(jìn)制數(shù)測(cè)量值,存于A中。利用除法指令把累加器A中的二進(jìn)制數(shù)測(cè)量值轉(zhuǎn)換為3位BCD碼,并以壓縮BCD碼形式存放在地址M1、M2單元中。賦值偽指令賦值偽指令EQUEQU(EquateEquate) 字符名稱字符名稱EQUEQU賦值項(xiàng)賦值項(xiàng) 其中賦值項(xiàng)可以是常數(shù)、地址、標(biāo)號(hào)或者是表達(dá)式,以其中賦值項(xiàng)可以是常數(shù)、地址、標(biāo)號(hào)或者是表達(dá)式,以8 8位或位或1616位二進(jìn)制數(shù)存放。匯位二進(jìn)制數(shù)存放。匯編程序自動(dòng)把編程序自動(dòng)把EQUEQU右邊的賦值項(xiàng)賦給左邊的字符名稱。一旦字符名稱被賦值它就可以在程右邊的賦值項(xiàng)賦給左邊的字

34、符名稱。一旦字符名稱被賦值它就可以在程序中作為數(shù)據(jù)或地址來多次使用。必須先賦值再使用,故該語句常放在程序開頭。序中作為數(shù)據(jù)或地址來多次使用。必須先賦值再使用,故該語句常放在程序開頭。 BUFFER EQU 30HMOV A,#BUFFERMOV B,BUFFERMOV A,#30H;BUFFER做立即數(shù)使用做立即數(shù)使用MOV B,30H;BUFFER做地址使用做地址使用;先定義;先定義243. 3. 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)M1 EQU 30H ;賦值偽指令,;賦值偽指令,M1=30HM2 EQU 31H ORG 0030HMOVB,64H;除數(shù);除數(shù)100送送BDIVAB;得;得BC

35、D百位數(shù)于百位數(shù)于AMOVM1,A;BCD百位數(shù)存于百位數(shù)存于M1中,中,M1作為地址使用作為地址使用MOVA,0AH;取除數(shù);取除數(shù)10XCHA,B;第一次余數(shù)與第二次除數(shù)交換;第一次余數(shù)與第二次除數(shù)交換DIVAB ;得存;得存A的的BCD十位數(shù)和存十位數(shù)和存B的的BCD個(gè)位數(shù)個(gè)位數(shù)SWAPA;十位數(shù)存于;十位數(shù)存于A的高的高4位位ADDA,B;組成壓縮;組成壓縮BCD碼碼MOVM2,A;壓縮;壓縮BCD碼存碼存M2 END 3. 3. 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)3.2.2 簡(jiǎn)單程序運(yùn)行PC=0100HPC=0102H 取指7A23譯碼執(zhí)行 PC=0104HPC=0104H 取指7B2

36、4譯碼執(zhí)行 PC=0106HPC=0106H 取指7C25譯碼執(zhí)行 PC=0108HPC=0108H 取指7D26譯碼執(zhí)行 PC=010AHPC=010AH 取指2A譯碼執(zhí)行 PC=010BHPC=010BH 取指2B譯碼執(zhí)行 PC=010CHPC=010CH 取指2C譯碼執(zhí)行 PC=010DHPC=010DH 取指2D譯碼執(zhí)行 PC=010EH PC自動(dòng)加1后形成的值稱PC當(dāng)前值能保證按照指令排列順序執(zhí)行程序取指7400譯碼執(zhí)行PC=0102H0100H0102H0104H0106H0108H010AH010BH010CH010DHMOV A, #00HMOV R2, #23HMOV R3,

37、 #24HMOV R4, #25HMOV R5, #26HADD A, R2ADD A, R3ADD A, R4ADD A, R574 007A 237B 247C 257D 262A2B2C2DORG 0100HENDMAIN:010EH0000H263. 3. 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)3.4 分支程序設(shè)計(jì)分支程序設(shè)計(jì)程序要求改變執(zhí)行順序,特點(diǎn)是含有控制轉(zhuǎn)移類指令(轉(zhuǎn)移目的地址替換程序要求改變執(zhí)行順序,特點(diǎn)是含有控制轉(zhuǎn)移類指令(轉(zhuǎn)移目的地址替換PCPC當(dāng)前值)當(dāng)前值)無條件轉(zhuǎn)移指令無條件轉(zhuǎn)移指令1 1、長(zhǎng)轉(zhuǎn)移指令、長(zhǎng)轉(zhuǎn)移指令LJMPLJMP: Long JumpLong JumpLJ

38、MP addr16;PCPC+3 PC當(dāng)前值PCaddr16 程序?qū)崿F(xiàn)轉(zhuǎn)移轉(zhuǎn)移范圍:任意轉(zhuǎn)移范圍:任意1616位地址,即位地址,即64KB64KB空間??臻g。ORG 0030HMAIN:ORG 0000HLJMP 0030HORG 0000HLJMP MAIN0030H0032H0034HROMR ROOMM地地址址E 9F 42 40 1F 9E 80031H0035H0000H0002H0 20 03 00001H0003H轉(zhuǎn)轉(zhuǎn)移移常用標(biāo)號(hào)代替常用標(biāo)號(hào)代替addr16addr16,程序員只需在要跳轉(zhuǎn)到的,程序員只需在要跳轉(zhuǎn)到的匯編語句前加標(biāo)號(hào),由匯編器負(fù)責(zé)計(jì)算。匯編語句前加標(biāo)號(hào),由匯編器負(fù)

39、責(zé)計(jì)算。LJMP LJMP 273. 3. 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)3.2.2 3.2.2 簡(jiǎn)單程序運(yùn)行簡(jiǎn)單程序運(yùn)行1、PC=0000H 取指取指020100譯碼執(zhí)行譯碼執(zhí)行 PC=0003H 目的地址目的地址0100H裝入裝入PC替換掉當(dāng)前值替換掉當(dāng)前值,程序轉(zhuǎn)移,程序轉(zhuǎn)移2、PC=0100H 取指取指7400譯碼執(zhí)行譯碼執(zhí)行 PC=0102H3、PC=0102H 取指取指7A23譯碼執(zhí)行譯碼執(zhí)行 PC=0104H4、PC=0104H 取指取指7B24譯碼執(zhí)行譯碼執(zhí)行 PC=0106H5、PC=0106H 取指取指7C25譯碼執(zhí)行譯碼執(zhí)行 PC=0108H6、PC=0108H 取指取

40、指7D26譯碼執(zhí)行譯碼執(zhí)行 PC=010AH7、PC=010AH 取指取指2A譯碼執(zhí)行譯碼執(zhí)行 PC=010BH8、PC=010BH 取指取指2B譯碼執(zhí)行譯碼執(zhí)行 PC=010CH9、PC=010CH 取指取指2C譯碼執(zhí)行譯碼執(zhí)行 PC=010DH10、PC=010DH 取指取指2D譯碼執(zhí)行譯碼執(zhí)行 PC=010EHLJMP MAINMAIN = 0100H02 01 00283. 3. 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)3.4 分支程序設(shè)計(jì)分支程序設(shè)計(jì)無條件轉(zhuǎn)移指令無條件轉(zhuǎn)移指令2、絕對(duì)轉(zhuǎn)移指令、絕對(duì)轉(zhuǎn)移指令A(yù)JMP: Absolute JumpAJMP addr11機(jī)器碼機(jī)器碼;PCPC+2

41、 PC當(dāng)前值當(dāng)前值PCPC當(dāng)前值高五位當(dāng)前值高五位 + addr110030H0032H0034HROMR ROOMM地地址址E 9F 42 40 1F 9E 80031H0035H0000H0002H0 20 03 00001H0003H轉(zhuǎn)轉(zhuǎn)移移A10A9A80 0 0 0 1E 8A7A6A5A4A3A2A1A0或或AJMP 轉(zhuǎn)移范圍:轉(zhuǎn)移范圍:高五位不變的任意高五位不變的任意1111位地址,位地址,按照地址的高五位分成按照地址的高五位分成3232頁(每頁頁(每頁2KB2KB),),即即2KB2KB空間。其相當(dāng)于把空間。其相當(dāng)于把64KB64KB的的ROMROM空間空間只能在當(dāng)前頁中跳轉(zhuǎn)。

42、只能在當(dāng)前頁中跳轉(zhuǎn)。111100000000000011111111111R ROOMM地地址址0000000000000000111111111110頁0000100000000000111111111111111100000000000111111111111頁30頁31頁R ROOMM293. 3. 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)3.2.2 3.2.2 簡(jiǎn)單程序運(yùn)行簡(jiǎn)單程序運(yùn)行1、PC=0000H 取指取指2100譯碼執(zhí)行譯碼執(zhí)行 PC=0002H 目的地址目的地址=0000 0001 0000 0000B=PC,轉(zhuǎn)移,轉(zhuǎn)移2、PC=0100H 取指取指7400譯碼執(zhí)行譯碼執(zhí)行 PC=

43、0102H3、PC=0102H 取指取指7A23譯碼執(zhí)行譯碼執(zhí)行 PC=0104H4、PC=0104H 取指取指7B24譯碼執(zhí)行譯碼執(zhí)行 PC=0106H5、PC=0106H 取指取指7C25譯碼執(zhí)行譯碼執(zhí)行 PC=0108H6、PC=0108H 取指取指7D26譯碼執(zhí)行譯碼執(zhí)行 PC=010AH7、PC=010AH 取指取指2A譯碼執(zhí)行譯碼執(zhí)行 PC=010BH8、PC=010BH 取指取指2B譯碼執(zhí)行譯碼執(zhí)行 PC=010CH9、PC=010CH 取指取指2C譯碼執(zhí)行譯碼執(zhí)行 PC=010DH10、PC=010DH 取指取指2D譯碼執(zhí)行譯碼執(zhí)行 PC=010EH11、PC=010EH 取指

44、取指80FE譯碼執(zhí)行譯碼執(zhí)行 PC=0110H 目的地址目的地址=0110H + 0FEH = 010E H,轉(zhuǎn)移,轉(zhuǎn)移303. 3. 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)3.4 分支程序設(shè)計(jì)分支程序設(shè)計(jì)3.4.1 3.4.1 無條件轉(zhuǎn)移指令無條件轉(zhuǎn)移指令3、短轉(zhuǎn)移指令和相對(duì)尋址方式、短轉(zhuǎn)移指令和相對(duì)尋址方式SJMP: Short JumpSJMP rel或或SJMP 機(jī)器碼機(jī)器碼PCPC+2 ,PC當(dāng)前值當(dāng)前值PCPC當(dāng)前值當(dāng)前值+ rel轉(zhuǎn)移范圍:轉(zhuǎn)移范圍:轉(zhuǎn)移目的地址轉(zhuǎn)移目的地址PCPC當(dāng)前值當(dāng)前值+ rel+ relrelrel是是8 8位符號(hào)數(shù)(補(bǔ)碼),因此轉(zhuǎn)移范圍位符號(hào)數(shù)(補(bǔ)碼),因此

45、轉(zhuǎn)移范圍(PC(PC當(dāng)前值當(dāng)前值128)128)(PC(PC當(dāng)前值當(dāng)前值+127)+127)relrel 轉(zhuǎn)移目的地址轉(zhuǎn)移目的地址PCPC當(dāng)前值當(dāng)前值 補(bǔ)補(bǔ) = = 轉(zhuǎn)移目的地址轉(zhuǎn)移目的地址(PC+(PC+指令字節(jié)數(shù)指令字節(jié)數(shù))補(bǔ)補(bǔ) PCPC是轉(zhuǎn)移指令首字節(jié)地址是轉(zhuǎn)移指令首字節(jié)地址;80rel rel80rel rel是是8 8位符號(hào)數(shù)(補(bǔ)碼位符號(hào)數(shù)(補(bǔ)碼) )相對(duì)尋址方式相對(duì)尋址方式機(jī)器匯編只需在指令寫出要轉(zhuǎn)移到語句的標(biāo)號(hào),由匯編器自動(dòng)計(jì)算相對(duì)偏移量。機(jī)器匯編只需在指令寫出要轉(zhuǎn)移到語句的標(biāo)號(hào),由匯編器自動(dòng)計(jì)算相對(duì)偏移量。原地踏轉(zhuǎn)指令原地踏轉(zhuǎn)指令 SJMP $原地踏轉(zhuǎn)指令一般用于程序結(jié)束處,實(shí)

46、現(xiàn)原地踏步效果,原地踏轉(zhuǎn)指令一般用于程序結(jié)束處,實(shí)現(xiàn)原地踏步效果,原地踏轉(zhuǎn)指令原地踏轉(zhuǎn)指令relrel計(jì)算:計(jì)算: relrel$($+2)($+2)補(bǔ)補(bǔ) 22補(bǔ)補(bǔ)0FEH0FEH$ $表示所在指令的表示所在指令的ROMROM地址。地址。HERE:SJMP HERE313. 3. 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì) 這類指令在執(zhí)行過程中需要判斷某種條件是否滿足而決定要不要轉(zhuǎn)移的指令。若這類指令在執(zhí)行過程中需要判斷某種條件是否滿足而決定要不要轉(zhuǎn)移的指令。若滿足條件就轉(zhuǎn)移,否則程序順序執(zhí)行。這類指令無一例外的都是相對(duì)尋址方式。滿足條件就轉(zhuǎn)移,否則程序順序執(zhí)行。這類指令無一例外的都是相對(duì)尋址方式。3.

47、4.2 3.4.2 條件轉(zhuǎn)移指令條件轉(zhuǎn)移指令1 1、累加器、累加器A A狀態(tài)轉(zhuǎn)移指令狀態(tài)轉(zhuǎn)移指令JZ JNZ JZJZ: J Jump if A is ump if A is Z ZeroeroJNZJNZ: J Jump if A is ump if A is N Not ot Z Zeroero2 2、累加位、累加位C C狀態(tài)轉(zhuǎn)移指令狀態(tài)轉(zhuǎn)移指令 JCJC: J Jump if ump if C C is set is setJNCJNC: J Jump if ump if C C is is N Not setot setJC JNC 323. 3. 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)例、

48、編程比較例、編程比較50H和和51H單元內(nèi)容,相等單元內(nèi)容,相等F0(PSW.5)0,否則,否則F01.分析:可以使用異或指令或者帶借位減法指令;通過判斷運(yùn)算結(jié)果分析:可以使用異或指令或者帶借位減法指令;通過判斷運(yùn)算結(jié)果A是否為零來是否為零來判斷兩個(gè)數(shù)是否相等。判斷兩個(gè)數(shù)是否相等。CLR F0 ;相等處理;相等處理SETB F0 ;不相等處理;不相等處理ORG 0030HMOV A, 51HXRL A,50H ;異或運(yùn)算;異或運(yùn)算START:JNZ L0 ;不相等轉(zhuǎn)移去標(biāo)號(hào);不相等轉(zhuǎn)移去標(biāo)號(hào)L0處處ORG 0000HLJMP START;if A!=0,即兩數(shù)不相等,即兩數(shù)不相等SJMP $S

49、JMP $L0:SETB F0CLR F0ORG 0030HMOV A, 51HXRL A,50HSTART:JZ L0ORG 0000HLJMP START;if A=0,即兩數(shù)相等,即兩數(shù)相等SJMP $;else,兩數(shù)不相等,兩數(shù)不相等SJMP $L0:;?。蝗?1H單元內(nèi)容單元內(nèi)容ENDEND;else, 兩數(shù)相等兩數(shù)相等333. 3. 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)3.4.2 3.4.2 條件轉(zhuǎn)移指令條件轉(zhuǎn)移指令3 3、bitbit位狀態(tài)轉(zhuǎn)移指令位狀態(tài)轉(zhuǎn)移指令JBJB:J Jump if ump if B Bit is set it is set JNBJNB:J Jump if

50、ump if B Bit is it is N Not set ot set JBCJBC:J Jump if ump if B Bit is set and it is set and C Clear bit lear bit JB bit ,JNB bit ,JBC bit ,4 4、比較不等轉(zhuǎn)移指令、比較不等轉(zhuǎn)移指令 CJNECJNE:Compare and Jump if is not EqualCompare and Jump if is not Equal CJNE A ,#data,CJNE Rn ,#data,CJNE Ri ,#data,CJNE A ,direct, 343

51、. 3. 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)例例3-5 3-5 判斷判斷2 2個(gè)個(gè)1616位無符號(hào)數(shù)位無符號(hào)數(shù)A A、B B的大小。的大小。A A存放在片內(nèi)存放在片內(nèi)RAMRAM的的40H40H、41H41H單元,單元,B B存放在存放在50H50H、51H51H單元中。當(dāng)單元中。當(dāng)ABAB時(shí),將內(nèi)部時(shí),將內(nèi)部RAMRAM的的42H42H單元內(nèi)容清單元內(nèi)容清0 0;否則,將該單元內(nèi)容置;否則,將該單元內(nèi)容置1 1。試編寫實(shí)現(xiàn)此功能的程序。試編寫實(shí)現(xiàn)此功能的程序。 ORG0030H MAIN:MOV R0,00H ;建立;建立AB標(biāo)志標(biāo)志 MOV A,40H ;取;取A高字節(jié)高字節(jié) CJNE A,

52、50H,LOOP2 ;與;與B高字節(jié)比較高字節(jié)比較 ; 若若AB,轉(zhuǎn)移至,轉(zhuǎn)移至LOOP2 MOV A,41H ;?。蝗低字節(jié)低字節(jié) CJNE A,51H,LOOP2 ;與;與B低字節(jié)比較低字節(jié)比較 ;若;若AB,轉(zhuǎn)移至,轉(zhuǎn)移至LOOP2 SJMP LOOP3 ;若;若A=B,轉(zhuǎn)移至,轉(zhuǎn)移至LOOP3LOOP2:JNC LOOP4 ;若;若AB,轉(zhuǎn)移至,轉(zhuǎn)移至LOOP4LOOP3:MOV R0,0FFH ;建立;建立AB標(biāo)志標(biāo)志LOOP4:MOV 42H,R0 ;存標(biāo)志;存標(biāo)志 SJMP $ END353. 3. 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)3.5 循環(huán)程序設(shè)計(jì)循環(huán)程序設(shè)計(jì)特殊的分支結(jié)構(gòu)

53、,含有重復(fù)執(zhí)行多遍的指令。特殊的分支結(jié)構(gòu),含有重復(fù)執(zhí)行多遍的指令。 在一個(gè)循環(huán)程序結(jié)構(gòu)包含在一個(gè)循環(huán)程序結(jié)構(gòu)包含4 4個(gè)部分:個(gè)部分:循環(huán)變量設(shè)置循環(huán)變量設(shè)置。在循環(huán)開始時(shí),往往需要定義一個(gè)循環(huán)變量(例如循環(huán)次數(shù)計(jì)數(shù)。在循環(huán)開始時(shí),往往需要定義一個(gè)循環(huán)變量(例如循環(huán)次數(shù)計(jì)數(shù)器,地址指針等),并且給它設(shè)置一個(gè)初始值。器,地址指針等),并且給它設(shè)置一個(gè)初始值。循環(huán)體循環(huán)體。要求重復(fù)執(zhí)行的程序段,即循環(huán)程序的主體部分。要求重復(fù)執(zhí)行的程序段,即循環(huán)程序的主體部分。循環(huán)變量修改循環(huán)變量修改。修改循環(huán)變量的值,為下一次循環(huán)準(zhǔn)備條件。修改循環(huán)變量的值,為下一次循環(huán)準(zhǔn)備條件。循環(huán)控制循環(huán)控制。根據(jù)循環(huán)結(jié)束的條

54、件,判斷是否跳出循環(huán)。根據(jù)循環(huán)結(jié)束的條件,判斷是否跳出循環(huán)。363. 3. 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)3.5 循環(huán)程序設(shè)計(jì)循環(huán)程序設(shè)計(jì)計(jì)數(shù)控制循環(huán)(循環(huán)次數(shù)已知),常用先執(zhí)行后判斷結(jié)構(gòu)。計(jì)數(shù)控制循環(huán)(循環(huán)次數(shù)已知),常用先執(zhí)行后判斷結(jié)構(gòu)。減一非零轉(zhuǎn)移指令減一非零轉(zhuǎn)移指令DJNZ DJNZ : : D Decrement and ecrement and J Jump if is ump if is N Not ot Z Zero.ero.DJNZ Rn,DJNZ direct,Rn=Rn-1Rn!=0?PC=PC+2程序順序執(zhí)行PC=PC+2+rel程序轉(zhuǎn)移YNdirect=direct

55、-1direct!=0?PC=PC+3程序順序執(zhí)行PC=PC+3+rel程序轉(zhuǎn)移YN此指令專用于計(jì)數(shù)控制循環(huán),此指令專用于計(jì)數(shù)控制循環(huán),RnRn和和directdirect作為減一計(jì)數(shù)的循環(huán)計(jì)數(shù)器。作為減一計(jì)數(shù)的循環(huán)計(jì)數(shù)器。例例3-6 編寫一個(gè)程序,清空編寫一個(gè)程序,清空16個(gè)數(shù)據(jù)存儲(chǔ)單元,數(shù)據(jù)存儲(chǔ)單元的開始地址是個(gè)數(shù)據(jù)存儲(chǔ)單元,數(shù)據(jù)存儲(chǔ)單元的開始地址是60H。 ORG0030H CLR A ;A=0 MOV R1,#60H;建立地址指針;建立地址指針R1=60H MOV R2,#16;計(jì)數(shù)器賦初值;計(jì)數(shù)器賦初值R7=16AGAIN:MOVR1,A;通過指針將各單元清;通過指針將各單元清0 I

56、NC R1 ;指針調(diào)整;指針調(diào)整 DJNZR2,AGAIN SJMP$;原地踏步,停機(jī);原地踏步,停機(jī) END373. 3. 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)3.2.3 3.2.3 循環(huán)程序運(yùn)行循環(huán)程序運(yùn)行383. 3. 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)例例3-7 計(jì)算從片內(nèi)計(jì)算從片內(nèi)RAM的的50H單元開始的單元開始的10個(gè)個(gè)BCD數(shù)的累加和。數(shù)的累加和。 ORG 0000H LJMP MAIN ORG 0030HMAIN: MOVR3,00H;清累加和的高位;清累加和的高位 MOVR4,00H;清累加和的低位;清累加和的低位 MOVR2,10;循環(huán)計(jì)數(shù)器初值;循環(huán)計(jì)數(shù)器初值 MOVR0,5

57、0H;指針指向;指針指向50H單元單元 MOVA,R4;取累加和低字節(jié);取累加和低字節(jié) ADDA,R0;累加和低字節(jié)相加;累加和低字節(jié)相加 DAA;BCD數(shù)調(diào)整數(shù)調(diào)整 JNCNEXT;如果無進(jìn)位,則轉(zhuǎn)移到;如果無進(jìn)位,則轉(zhuǎn)移到NEXT INCR3;如有進(jìn)位,高字節(jié)加;如有進(jìn)位,高字節(jié)加1NEXT: INCR0;修改指針,指向新的單元;修改指針,指向新的單元 DJNZR2,LOOP;判斷是否累加完畢;判斷是否累加完畢 MOVR4,A;存累加和低位;存累加和低位 SJMP$;停機(jī);停機(jī) ENDLOOP:393. 3. 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)3.5 循環(huán)程序設(shè)計(jì)循環(huán)程序設(shè)計(jì)例例3-8 將片

58、內(nèi)將片內(nèi)RAM 20H單元數(shù)據(jù)中的單元數(shù)據(jù)中的 1的個(gè)數(shù)統(tǒng)計(jì)出來。結(jié)果存的個(gè)數(shù)統(tǒng)計(jì)出來。結(jié)果存20H單元。單元。 ORG 0030HMAIN:MOVR1,00H;1 1的計(jì)數(shù)單元清的計(jì)數(shù)單元清0 0 MOVR2,08H ;循環(huán)計(jì)數(shù)器置初值;循環(huán)計(jì)數(shù)器置初值 MOVA,20H;取數(shù)據(jù);取數(shù)據(jù)LOOP: RLCA;左移一位,待判定位移入;左移一位,待判定位移入C JNCNEXT ;如果進(jìn)位位為;如果進(jìn)位位為0,則轉(zhuǎn)移到,則轉(zhuǎn)移到NEXT INCR1;如進(jìn)位位為;如進(jìn)位位為1,計(jì)數(shù)單元加,計(jì)數(shù)單元加1 NEXT: DJNZR2,LOOP;判斷是否判斷完畢;判斷是否判斷完畢 MOV20H,R1;存計(jì)數(shù)

59、結(jié)果;存計(jì)數(shù)結(jié)果 SJMP$;停機(jī);停機(jī) END 403. 3. 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)3.6 3.6 子程序結(jié)構(gòu)子程序結(jié)構(gòu)完成某一專用任務(wù)并能為其他程序反復(fù)調(diào)用的程序段稱為子程序,調(diào)用子程序的完成某一專用任務(wù)并能為其他程序反復(fù)調(diào)用的程序段稱為子程序,調(diào)用子程序的程序稱為調(diào)用程序或主程序。程序稱為調(diào)用程序或主程序。子程序人口地址子程序返回指令調(diào)用指令主程序調(diào)用與返回調(diào)用與返回1、調(diào)用指令:、調(diào)用指令:保存斷點(diǎn)地址保存斷點(diǎn)地址提供子程序人口地址提供子程序人口地址長(zhǎng)調(diào)用指令長(zhǎng)調(diào)用指令LCALL: Long CallLCALL addr16機(jī)器碼機(jī)器碼或或LCALL ;12addr16SP

60、=SP+1 *SP=PC70PC=PC+3 斷點(diǎn)地址斷點(diǎn)地址SP=SP+1 *SP=PC158調(diào)用范圍:全部調(diào)用范圍:全部ROM的的64KB空間。空間。例、下列程序執(zhí)行到例、下列程序執(zhí)行到LCALL指令指令(地址地址0100H)后,求斷點(diǎn)地址,以及堆棧的值。后,求斷點(diǎn)地址,以及堆棧的值。MOV SP,#60HLCALL SQUR斷點(diǎn)地址:斷點(diǎn)地址: 0100H+30103HSP62H(61H)03H(62H)01HPC=addr16轉(zhuǎn)向子程序入口地址轉(zhuǎn)向子程序入口地址413. 3. 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)3.6 3.6 子程序結(jié)構(gòu)子程序結(jié)構(gòu)調(diào)用與返回調(diào)用與返回2、返回指令:、返回指令

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論