




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
單片機(jī)原理及應(yīng)用.2022/12/27單片機(jī)原理及應(yīng)用.2022/12/261第4章匯編語(yǔ)言程序設(shè)計(jì)簡(jiǎn)介4.1偽指令4.2匯編語(yǔ)言程序設(shè)計(jì).2022/12/27第4章匯編語(yǔ)言程序設(shè)計(jì)簡(jiǎn)介4.1偽指令.20222
偽指令是匯編程序能夠識(shí)別并對(duì)匯編過(guò)程進(jìn)行某種控制的匯編命令。它不是單片機(jī)執(zhí)行的指令,所以沒(méi)有對(duì)應(yīng)的可執(zhí)行目標(biāo)碼,匯編后產(chǎn)生的目標(biāo)程序中不會(huì)再出現(xiàn)偽指令。一、起始地址設(shè)定偽指令ORG格式為:ORG表達(dá)式該指令的功能是向匯編程序說(shuō)明下面緊接的程序段或數(shù)據(jù)段存放的起始地址。表達(dá)式通常為16進(jìn)制地址,也可以是已定義的標(biāo)號(hào)地址。
4.1偽指令.2022/12/27偽指令是匯編程序能夠識(shí)別并對(duì)匯編過(guò)程進(jìn)行某種控制的匯3ORG8000HSTART:MOVA,#30H
…
…
此時(shí)規(guī)定該段程序的機(jī)器碼從地址8000H單元開(kāi)始存放。在每一個(gè)匯編語(yǔ)言源程序的開(kāi)始,都要設(shè)置一條ORG偽指令來(lái)指定該程序在存儲(chǔ)器中存放的起始位置。若省略O(shè)RG偽指令,則該程序段從0000H單元開(kāi)始存放。在一個(gè)源程序中,可以多次使用ORG偽指令規(guī)定不同程序段或數(shù)據(jù)段存放的起始地址,但要求地址值由小到大依序排列,不允許空間重疊。.2022/12/27ORG8000H.2022/124二、匯編結(jié)束偽指令END格式為:END該指令的功能是結(jié)束匯編。匯編程序遇到END偽指令后即結(jié)束匯編。處于END之后的程序,匯編程序?qū)⒉惶幚怼?2022/12/27二、匯編結(jié)束偽指令END.2022/12/265三、字節(jié)數(shù)據(jù)定義偽指令DB[標(biāo)號(hào):]DB字節(jié)數(shù)據(jù)表功能是從標(biāo)號(hào)指定的地址開(kāi)始,在ROM中定義字節(jié)數(shù)據(jù)。字節(jié)數(shù)據(jù)表可以是一個(gè)或多個(gè)字節(jié)數(shù)據(jù)、字符串或表達(dá)式。該偽指令將字節(jié)數(shù)據(jù)表中的數(shù)據(jù)根據(jù)從左到右的順序依次存放在指定的存儲(chǔ)單元中。一個(gè)數(shù)據(jù)占一個(gè)存儲(chǔ)單元。例如:
ORG9000HDATA1:DB73H,01H,90HDATA2:DB02HDB‘ABCD’,3*25,01H.’1’
11個(gè)數(shù)據(jù)從9000H單元連續(xù)存放。
.2022/12/27三、字節(jié)數(shù)據(jù)定義偽指令DB.2022/12/266四、字?jǐn)?shù)據(jù)定義偽指令DW[標(biāo)號(hào):]DW字?jǐn)?shù)據(jù)表功能是從標(biāo)號(hào)指定的地址單元開(kāi)始,在程序存儲(chǔ)器中定義字?jǐn)?shù)據(jù)。該偽指令將字或字表中的數(shù)據(jù)根據(jù)從左到右的順序依次存放在指定的存儲(chǔ)單元中。應(yīng)特別注意:16位的二進(jìn)制數(shù),高8位存放在低地址單元,低8位存放在高地址單元。例如:
ORG1400HDATA:DW324AH,3CH
…
…
匯編后,(1400H)=32H,(1401H)=4AH,(1402H)=00H,(1403H)=3CH。.2022/12/27四、字?jǐn)?shù)據(jù)定義偽指令DW.2022/12/267
在定義中使用dup重復(fù)操作符
格式如下:
<N>dup(<參數(shù)表>)
例如:
ZERO:DB3DUP(0,0)BUFFER:DB‘AB’,2DUP(‘BA’,3DUP(1)).2022/12/27在定義中使用dup重復(fù)操作符
格式如下:
8五、位地址符號(hào)定義偽指令BIT格式為:符號(hào)名BIT位地址表達(dá)式功能是將位地址賦給指定的符號(hào)名。其中,位地址表達(dá)式可以是絕對(duì)地址,也可以是符號(hào)地址。例如:
STBITP1.0將P1.0的位地址賦給符號(hào)名ST,在其后的編程中就可以用ST來(lái)代替P1.0。.2022/12/27五、位地址符號(hào)定義偽指令BIT.2022/12/269六、賦值偽指令EQU符號(hào)名EQU表達(dá)式功能是將表達(dá)式的值或特定的某個(gè)匯編符號(hào)定義為一個(gè)指定的符號(hào)名。例如:
LENEQU10BLOCKEQU22HMOVR7,#LENMOVR0,#BLOCK命令執(zhí)行后:R7=?R0=?
1022H.2022/12/27六、賦值偽指令EQU命令執(zhí)行后:R7=?R0=?10
匯編語(yǔ)言的語(yǔ)句格式
語(yǔ)句行由四個(gè)字段組成:
[標(biāo)號(hào):]操作碼[操作數(shù)][;注釋]
括號(hào)內(nèi)的部分可以根據(jù)實(shí)際情況取舍。每個(gè)字段之間要用分隔符分隔,可以用作分隔符的符號(hào)有空格、冒號(hào)、逗號(hào)、分號(hào)等。如:LOOP:MOVA,#7FH;A←7FH.2022/12/27匯編語(yǔ)言的語(yǔ)句格式.2022/12/2611一、標(biāo)號(hào)標(biāo)號(hào)是語(yǔ)句地址的標(biāo)志符號(hào),用于引導(dǎo)對(duì)該語(yǔ)句的非順序訪(fǎng)問(wèn)。有關(guān)標(biāo)號(hào)的規(guī)定為:
標(biāo)號(hào)由1~8個(gè)ASCII字符組成。第一個(gè)字符必須是字母,其余字符可以是字母、數(shù)字或其他特定字符;不能使用該匯編語(yǔ)言已經(jīng)定義了的符號(hào)作為標(biāo)號(hào)。如指令助記符、寄存器符號(hào)名稱(chēng)等;標(biāo)號(hào)后邊必須跟冒號(hào)。二、操作碼
操作碼用于規(guī)定語(yǔ)句執(zhí)行的操作。它是匯編語(yǔ)句中唯一不能空缺的部分。它由指令助記符表示。
.2022/12/27一、標(biāo)號(hào).2022/12/2612三、操作數(shù)操作數(shù)用于給指令的操作提供數(shù)據(jù)或地址。在一條匯編語(yǔ)句中操作數(shù)可能是空缺的,也可能包括一項(xiàng),還可能包括兩項(xiàng)或三項(xiàng)。各操作數(shù)間以逗號(hào)分隔。操作數(shù)字段的內(nèi)容可能包括以下幾種情況:(1)工作寄存器名;(2)特殊功能寄存器名;(3)標(biāo)號(hào)名;(4)常數(shù);(5)符號(hào)“$”,表示程序計(jì)數(shù)器PC的當(dāng)前值;(6)表達(dá)式。.2022/12/27三、操作數(shù).2022/12/2613四、注釋
注釋不屬于匯編語(yǔ)句的功能部分,它只是對(duì)語(yǔ)句的說(shuō)明。注釋字段可以增加程序的可讀性,有助于編程人員的閱讀和維護(hù)。注釋字段必須以分號(hào)“;”開(kāi)頭,長(zhǎng)度不限,當(dāng)一行書(shū)寫(xiě)不下時(shí),可以換行接著書(shū)寫(xiě),但換行時(shí)應(yīng)注意在開(kāi)頭使用分號(hào)“;”。五、數(shù)據(jù)的表示形式
8051匯編語(yǔ)言的數(shù)據(jù)可以有以下幾種表示形式:二進(jìn)制數(shù),末尾以字母B標(biāo)識(shí)。如:10001111B;十進(jìn)制數(shù),末尾以字母D標(biāo)識(shí)或?qū)⒆帜窪省略。如:88D,66;十六進(jìn)制數(shù),末尾以字母H標(biāo)識(shí)。如:78H,0A8H(但應(yīng)注意的是,十六進(jìn)制數(shù)以字母A~F開(kāi)頭時(shí)應(yīng)在其前面加上數(shù)字“0”。);ASCII碼,以單引號(hào)括起來(lái)標(biāo)識(shí)。如:‘AB’,‘1245’
.2022/12/27四、注釋.2022/12/2614ORG1000HTAB:DB1,2,3,’1’,’EFGHI’DB2DUP(?)DB2DUP(01H,02H)BUF:DW$-TABDUP(?),0FFHTTEQUBUF-TAB1000H11001H21002H31003H31H1004H45H1005H46H1006H47H1007H48H1008H49H1009HX100AHX100BH01H100CH02H100DH01H100EH02H…………TT=?TT=15.2022/12/27ORG1000H1000H11001H21154.2匯編語(yǔ)言程序設(shè)計(jì)4.2.1簡(jiǎn)單程序設(shè)計(jì)
例1兩個(gè)無(wú)符號(hào)雙字節(jié)數(shù)相加。設(shè)被加數(shù)存放于內(nèi)部RAM的40H(高位字節(jié)),41H(低位字節(jié)),加數(shù)存放于50H(高位字節(jié)),51H(低位字節(jié)),和數(shù)存入40H和41H單元中。.2022/12/274.2匯編語(yǔ)言程序設(shè)計(jì)4.2.1簡(jiǎn)單程序設(shè)計(jì)16程序如下:START:CLRC;將Cy清零MOVR0,#41H;將被加數(shù)地址送數(shù)據(jù)指針R0MOVR1,#51H;將加數(shù)地址送數(shù)據(jù)指針R1AD1:MOVA,@R0;被加數(shù)低字節(jié)的內(nèi)容送入AADDA,@R1;兩個(gè)低字節(jié)相加MOV@R0,A;低字節(jié)的和存入被加數(shù)低字節(jié)中
DECR0;指向被加數(shù)高位字節(jié)
DECR1;指向加數(shù)高位字節(jié)
MOVA,@R0;被加數(shù)高位字節(jié)送入AADDCA,@R1;兩個(gè)高位字節(jié)帶Cy相加
MOV@R0,A;高位字節(jié)的和送被加數(shù)高位字節(jié)
RET這一句省略掉可以不?將這一句的ADDC改為ADD行嗎?這個(gè)程序還可以怎么改?.2022/12/27程序如下:這一句省略掉可以不?將這一句的ADDC改為AD17
例2將兩個(gè)半字節(jié)數(shù)合并成一個(gè)一字節(jié)數(shù)。設(shè)內(nèi)部RAM40H,41H單元中分別存放著8位二進(jìn)制數(shù),要求取出兩個(gè)單元中的低半字節(jié),并成一個(gè)字節(jié)后,存入50H單元中。程序如下:
START:MOVR1,#40H;設(shè)置R1為數(shù)據(jù)指針
MOVA,@R1;取出第一個(gè)單元中的內(nèi)容
ANLA,#0FH;取第一個(gè)數(shù)的低半字節(jié)
SWAPA ;移至高半字節(jié)
INCR1 ;修改數(shù)據(jù)指針
XCHA,@R1 ;取第二個(gè)單元中的內(nèi)容
ANLA,#0FH;取第二個(gè)數(shù)的低半字節(jié)
ORLA,@R1 ;拼字
MOV50H,A ;存放結(jié)果
RET這個(gè)程序還可以怎么改呢?.2022/12/27例2將兩個(gè)半字節(jié)數(shù)合并成一個(gè)一字節(jié)數(shù)。184.2.2分支程序設(shè)計(jì)圖4.1分支結(jié)構(gòu)框圖(a)單分支流程;(b)多分支流程
.2022/12/274.2.2分支程序設(shè)計(jì)圖4.1分支結(jié)構(gòu)框圖.219例3x,y均為8位二進(jìn)制數(shù),設(shè)x存入R0,y存入R1,求解:
.2022/12/27例3x,y均為8位二進(jìn)制數(shù),設(shè)x存入R0,y20圖4.2
.2022/12/27圖4.2.2022/12/2621程序如下:START:CJNER0,#00H,SUL1;R0中的數(shù)與00比較不等轉(zhuǎn)移MOVR1,#00H;相等,R1←0SJMPSUL2SUL1:JCNEG;兩數(shù)不等,若(R0)<0,轉(zhuǎn)向NEGMOVR1,#01H;(R0)>0,則R1←01HSJMPSUL2NEG:MOVR1,#0FFH;(R0)<0,則R1←0FFHSUL2:RET.2022/12/27程序如下:.2022/12/2622
例4比較兩個(gè)無(wú)符號(hào)數(shù)的大小。設(shè)外部RAM的存儲(chǔ)單元ST1(2000H)和ST2(2100H)中存放兩個(gè)不帶符號(hào)的二進(jìn)制數(shù),找出其中的大數(shù)存入外部RAM中的ST3(2200H)單元中。.2022/12/27例4比較兩個(gè)無(wú)符號(hào)數(shù)的大小。.20223.2022/12/27.2022/12/2624程序如下:
ORG1000HST1 EQU2000HST2EQU2100HST3EQU2200HSTART:MOVDPTR,#ST1;第一個(gè)數(shù)的指針
MOVXA,@DPTR;取第一個(gè)數(shù)
MOVR2,A;保存
MOVDPTR,#ST2;第二個(gè)數(shù)的指針
MOVXA,@DPTR;取第二個(gè)數(shù)
CLRC.2022/12/27程序如下:.2022/12/2625SUBBA,R2;兩數(shù)比較JNCBIG1;若第二個(gè)數(shù)大,則轉(zhuǎn)XCHA,R2;第一個(gè)數(shù)大BIG0:MOVDPTR,#ST3MOVX@DPTR,A;存大數(shù)RETBIG1:MOVXA,@DPTR;第二個(gè)數(shù)大SJMPBIG0.2022/12/27SUBBA,R2;兩數(shù)比較.2022/12/26264.2.3循環(huán)程序設(shè)計(jì)一、循環(huán)程序圖4.4
.2022/12/274.2.3循環(huán)程序設(shè)計(jì)一、循環(huán)程序圖4.4.2027
循環(huán)程序一般由四個(gè)主要部分組成:(1)初始化部分:為循環(huán)程序做準(zhǔn)備,如規(guī)定循環(huán)次數(shù)、給各變量和地址指針預(yù)置初值。
(2)處理部分:為反復(fù)執(zhí)行的程序段,是循環(huán)程序的實(shí)體,也是循環(huán)程序的主體。
(3)循環(huán)控制部分:這部分的作用是修改循環(huán)變量和控制變量,并判斷循環(huán)是否結(jié)束,直到符合結(jié)束條件時(shí),跳出循環(huán)為止。
(4)結(jié)束部分:這部分主要是對(duì)循環(huán)程序的結(jié)果進(jìn)行分析、處理和存放。.2022/12/27循環(huán)程序一般由四個(gè)主要部分組成:.202228
例5工作單元清零。在應(yīng)用系統(tǒng)程序設(shè)計(jì)時(shí),有時(shí)經(jīng)常需要將存儲(chǔ)器中部分地址單元作為工作單元,存放程序執(zhí)行的中間值或執(zhí)行結(jié)果,工作單元清零工作常常放在程序的初始化部分中。設(shè)有50個(gè)工作單元,其首址為外部存儲(chǔ)器8000H單元,則其工作單元清零程序如下:.2022/12/27例5工作單元清零。.2022/1229
CLEAR:CLRAMOVDPTR,#8000H;工作單元首址送指針MOVR2,50;置循環(huán)次數(shù)CLEAR1:MOVX@DPTR,AINCDPTR;修改指針
DJNZR2,CLEAR1;控制循環(huán)
RET.2022/12/27CLEAR:CLRA.202230
例6:設(shè)在內(nèi)部RAM的BLOCK單元開(kāi)始處有長(zhǎng)度為L(zhǎng)EN個(gè)的無(wú)符號(hào)數(shù)據(jù)塊,試編一個(gè)求和程序,并將和存入內(nèi)部RAM的SUM單元(設(shè)和不超過(guò)8位)。
BLOCKEQU20HLENEQU30HSUMEQU40HSTART:CLRA;清累加器AMOVR2,#LEN;數(shù)據(jù)塊長(zhǎng)度送R2MOVR1,#BLOCK;數(shù)據(jù)塊首址送R1LOOP:ADDA,@R1;循環(huán)加法
INCR1;修改地址指針
DJNZR2,LOOP;修改計(jì)數(shù)器并判斷
MOVSUM,A;存和
RET.2022/12/27例6:設(shè)在內(nèi)部RAM的BLOCK單元開(kāi)始處31
二、多重循環(huán)
例710秒延時(shí)程序。延時(shí)程序與MCS-51執(zhí)行指令的時(shí)間有關(guān),如果使用12MHz晶振,一個(gè)機(jī)器周期為1μs,計(jì)算出一條指令以至一個(gè)循環(huán)所需要的執(zhí)行時(shí)間,給出相應(yīng)的循環(huán)次數(shù),便能達(dá)到延時(shí)的目的。10秒延時(shí)程序如下:DELAY:MOVR5,#100DEL0:MOVR6,#200DEL1:MOVR7,#248;1DEL2:DJNZR7,DEL2;2DJNZR6,DEL1;2DJNZR5,DEL0RET.2022/12/27二、多重循環(huán)例710秒延時(shí)程序32
上例程序中采用了多重循環(huán)程序,即在一個(gè)循環(huán)體中又包含了其它的循環(huán)程序,這種方式是實(shí)現(xiàn)延時(shí)程序的常用方法。使用多重循環(huán)時(shí),必須注意:(1)循環(huán)嵌套,必須層次分明,不允許產(chǎn)生內(nèi)外層循環(huán)交叉。
(2)外循環(huán)可以一層層向內(nèi)循環(huán)進(jìn)入,結(jié)束時(shí)由里往外一層層退出。
(3)內(nèi)循環(huán)可以直接轉(zhuǎn)入外循環(huán),實(shí)現(xiàn)一個(gè)循環(huán)由多個(gè)條件控制的循環(huán)結(jié)構(gòu)方式。.2022/12/27上例程序中采用了多重循環(huán)程序,即在一個(gè)循環(huán)體33
例8在外部RAM中,BLOCK開(kāi)始的單元中有一無(wú)符號(hào)數(shù)據(jù)塊,其個(gè)數(shù)為L(zhǎng)EN個(gè)字節(jié)。試將這些無(wú)符號(hào)數(shù)按遞減次序重新排列,并存入原存儲(chǔ)區(qū)。(假設(shè)數(shù)據(jù)塊的高八位地址相同).2022/12/27例8在外部RAM中,BLOCK開(kāi)始的34圖4.5.2022/12/27圖4.5.2022/12/2635
ORG1000HSTART:MOVDPTR,#BLOCK;置地址指針
MOVP2,DPH;P2作地址指針高字節(jié)
MOVR7,#LEN;置外循環(huán)計(jì)數(shù)初值
DECR7;比較與交換n-1次LOOP0:CLRF0;交換標(biāo)志清0MOVR0,DPL;MOVR1,DPL;置相鄰兩數(shù)地址指針低字節(jié)
INCR1MOVR6,R7;置內(nèi)循環(huán)計(jì)數(shù)器初值.2022/12/27ORG1000H36
LOOP1:MOVXA,@R0;取數(shù)
MOVB,A;暫存
MOVXA,@R1;取下一個(gè)數(shù)
CJNEA,B,NEXT;相鄰兩數(shù)比較,不等轉(zhuǎn)
SJMPNOCHA;相等不交換NEXT:JCNOCHA;Cy=1,則前者大于后者,不必交換
SETBF0;否則,置交換標(biāo)志
MOVX@R0,A;XCHA,B;兩數(shù)交換,大者在前,小者在后
MOVX@R1,A;.2022/12/27LOOP1:MOVXA,@R0;取數(shù).237NOCHA:INCR0INCR1;修改指針
DJNZR6,LOOP1;內(nèi)循環(huán)未完,則繼續(xù)
JNBF0,EXIT;若從未交換,則結(jié)束
DJNZR7,LOOP0;外循環(huán)未完,則繼續(xù)
EXIT:RET.2022/12/27NOCHA:INCR0.2022/12/2638
例9設(shè)某系統(tǒng)的模數(shù)轉(zhuǎn)換器是ADC0809,它的轉(zhuǎn)換結(jié)束信號(hào)EOC連接到8031的P1.7端,當(dāng)EOC的狀態(tài)由低變高時(shí),則結(jié)束循環(huán)等待,并讀取轉(zhuǎn)換值,其程序如下:START:MOVDPTR,#addr;0809端口地址送DPTRMOVA,#00H;啟動(dòng)0809轉(zhuǎn)換
MOVX@DPTR,ALOOP:JNBP1.7,LOOP;檢測(cè)P1.7狀態(tài),判是否轉(zhuǎn)換結(jié)束MOVXA,@DPTR;讀取轉(zhuǎn)換結(jié)果….2022/12/27例9設(shè)某系統(tǒng)的模數(shù)轉(zhuǎn)換器是ADC080939
例10在內(nèi)部RAM中從50H單元開(kāi)始的連續(xù)單元依次存放了一串字符,該字符串以回車(chē)符為結(jié)束標(biāo)志,要求測(cè)試該字符串的長(zhǎng)度。程序如下:START:MOVR2,#0FFHMOVR0,#4FH;數(shù)據(jù)指針R0置初值
LOOP:INCR0INCR2CJNE@R0,#0DH,LOOPRET.2022/12/27例10在內(nèi)部RAM中從50H單元開(kāi)始的404.2.4散轉(zhuǎn)程序設(shè)計(jì)
散轉(zhuǎn)程序是分支程序的一種,它可根據(jù)運(yùn)算結(jié)果或輸入數(shù)據(jù)將程序轉(zhuǎn)入不同的分支。MCS-51指令系統(tǒng)中有一條跳轉(zhuǎn)指令JMP@A+DPTR,用它可以很容易地實(shí)現(xiàn)散轉(zhuǎn)功能。該指令把累加器的8位無(wú)符號(hào)數(shù)與16位數(shù)據(jù)指針的內(nèi)容相加,并把相加的結(jié)果裝入程序計(jì)數(shù)器PC,控制程序轉(zhuǎn)向目標(biāo)地址去執(zhí)行。此指令的特點(diǎn)在于,轉(zhuǎn)移的目標(biāo)地址不是在編程或匯編時(shí)預(yù)先確定的,而是在程序運(yùn)行過(guò)程中動(dòng)態(tài)地確定的。目標(biāo)地址是以數(shù)據(jù)指針DPTR的內(nèi)容為起始的256字節(jié)范圍內(nèi)的指定地址,即由DPTR的內(nèi)容決定分支轉(zhuǎn)移程序的首地址,由累加器A的內(nèi)容來(lái)動(dòng)態(tài)選擇其中的某一個(gè)分支轉(zhuǎn)移程序。
.2022/12/274.2.4散轉(zhuǎn)程序設(shè)計(jì)散轉(zhuǎn)程序是分支41
例11根據(jù)工作寄存器R0內(nèi)容的不同,使程序轉(zhuǎn)入相應(yīng)的分支。
(R0)=0對(duì)應(yīng)的分支程序標(biāo)號(hào)為PR0;(R0)=1對(duì)應(yīng)的分支程序標(biāo)號(hào)為PR1;(R0)=N對(duì)應(yīng)的分支程序標(biāo)號(hào)為PRN?!?2022/12/27例11根據(jù)工作寄存器R0內(nèi)容的不同,42程序如下:LP0:MOVDPTR,#TAB;取表頭地址
MOVA,R0ADDA,R0;R0內(nèi)容乘以2JNCLP1;無(wú)進(jìn)位轉(zhuǎn)移
INCDPH;加進(jìn)位位LP1:JMP@A+DPTR;跳至散轉(zhuǎn)表中相應(yīng)位置TAB:AJMPPR0AJMPPR1AJMPPRN……這一句不要行不行?.2022/12/27程序如下:……這一句不要行不行?.2022/12/2643
本例程序僅適用于散轉(zhuǎn)表首地址TAB和處理程序入口地址PR0,PR1,…,PRN在同一個(gè)2KB范圍的存儲(chǔ)區(qū)內(nèi)的情形。若超出2KB范圍可在分支程序入口處安排一條長(zhǎng)跳轉(zhuǎn)指令,可采用如下程序:MOVDPTR,#TABMOVA,R0MOVB,#03H;長(zhǎng)跳轉(zhuǎn)指令占3個(gè)字節(jié)MULABXCHA,B.2022/12/27本例程序僅適用于散轉(zhuǎn)表首地址TAB和處理程序44
ADDA,DPHMOVDPH,AXCHA,BJMP@A+DPTR;跳至散轉(zhuǎn)表中相應(yīng)的位置TAB:LJMPPR0;跳至不同的分支
LJMPPR1LJMPPRN…….2022/12/27ADDA,DPH…….2022/1454.2.5子程序和參數(shù)傳遞
一、子程序的概念
通常把具有某種操作功能的程序段作為獨(dú)立的子程序,以供不同程序或同一程序反復(fù)調(diào)用。在程序中需要執(zhí)行這種操作的地方放置一條調(diào)用指令,當(dāng)程序執(zhí)行到調(diào)用指令,就轉(zhuǎn)到子程序中完成規(guī)定的操作,并返回到原來(lái)的程序繼續(xù)執(zhí)行下去。.2022/12/274.2.5子程序和參數(shù)傳遞一、子程序46
二、子程序的調(diào)用
調(diào)用子程序的指令有“ACALL”和“LCALL”,執(zhí)行調(diào)用指令時(shí),先將程序地址指針PC改變(“ACALL”加2,“LCALL”加3),然后PC值壓入堆棧,用新的地址值代替。執(zhí)行返回指令時(shí),再將PC值彈出。子程序調(diào)用中,主程序應(yīng)先把有關(guān)的參數(shù)存入約定的位置,子程序在執(zhí)行時(shí),可以從約定的位置取得參數(shù),當(dāng)子程序執(zhí)行完,將得到的結(jié)果再存入約定的位置,返回主程序后,主程序可以從這些約定的位置上取得需要的結(jié)果,這就是參數(shù)的傳遞。
.2022/12/27二、子程序的調(diào)用.2022/12/2647
例12把內(nèi)部RAM某一單元中一個(gè)字節(jié)的十六進(jìn)制數(shù)轉(zhuǎn)換成兩位ASCII碼,結(jié)果存放在內(nèi)部RAM的連續(xù)兩個(gè)單元中。假設(shè)一個(gè)字節(jié)的十六進(jìn)制數(shù)在內(nèi)部RAM40H單元,而結(jié)果存入50H,51H單元,可以用堆棧進(jìn)行參數(shù)傳遞,程序如下:MAIN:MOVR1,#50H;R1為存結(jié)果的指針
MOVA,40H;A為需轉(zhuǎn)換的十六進(jìn)制數(shù)
SWAPA;先轉(zhuǎn)換高位半字
PUSHACC;壓棧
LCALLHEASC;調(diào)用將低半字節(jié)的內(nèi)容轉(zhuǎn)換;
成ASCII碼子程序HEASCPOPACCMOV@R1,A;存高半字節(jié)轉(zhuǎn)換結(jié)果
INCR1PUSH40H.2022/12/27例12把內(nèi)部RAM某一單元中一個(gè)字節(jié)的十六48
LCALLHEASCPOPACCMOV@R1,A;存低半字節(jié)轉(zhuǎn)換結(jié)果
ENDHEASC:MOVR0,SPDECR0DECR0;R0指向十六進(jìn)制數(shù)參數(shù)地址
XCHA,@R0;取被轉(zhuǎn)換參數(shù)
ANLA,#0FH;保留低半字節(jié)
ADDA,#2;修改A值
MOVCA,@A+PC;查表
XCHA,@R0;結(jié)果送回堆棧
RETTAB:DB30H,31H,32H,…
為什么R0連續(xù)2次減1?轉(zhuǎn)換結(jié)果是如何傳遞的?
為什么要加2.2022/12/27LCALLHEAS494.2.6查表程序設(shè)計(jì)
查表程序是一種常用程序,它廣泛使用于LED顯示控制、打印機(jī)打印控制、數(shù)據(jù)補(bǔ)償、數(shù)值計(jì)算、轉(zhuǎn)換等功能程序中,這類(lèi)程序具有簡(jiǎn)單、執(zhí)行速度快等特點(diǎn)。所謂查表法,就是預(yù)先將滿(mǎn)足一定精度要求的表示變量與函數(shù)值之間關(guān)系的一張表求出,然后把這張表存于單片機(jī)的程序存儲(chǔ)器中,這時(shí)自變量值為單元地址,相應(yīng)的函數(shù)值為該地址單元中的內(nèi)容。查表,就是根據(jù)變量X在表格中查找對(duì)應(yīng)的函數(shù)值Y,使Y=f(X)。.2022/12/274.2.6查表程序設(shè)計(jì)查表程序是一種常50MCS-51指令系統(tǒng)中,有兩條查表指令:
MOVCA,@A+PCMOVCA,@A+DPTR
.2022/12/27MCS-51指令系統(tǒng)中,有兩條查表指令:.202251
例13一個(gè)十六進(jìn)制數(shù)存放在內(nèi)部RAM的HEX單元的低4位中,將其轉(zhuǎn)換成ASCII碼并送回HEX單元。十六進(jìn)制0~9的ASCII碼為30H~39H,A~F的ASCII碼為41H~46H,ASCII碼表格的首地址為ASCTAB。編程如下:
ORG1000HHEXASC:MOVA,HEX ANLA,#0FH ADDA,#3;修改指針
MOVCA,@A+PC MOVHEX,A RET.2022/12/27例13一個(gè)十六進(jìn)制數(shù)存放在內(nèi)部RAM52ASCTAB:DB30H,31H,32H,33H,34H DB35H,36H,37H,38H,39H DB41H,42H,43H,44H,45HDB46H
在這個(gè)程序中,查表指令MOVCA,@A+PC到表格首地址有兩條指令,占用3個(gè)字節(jié)地址空間,故修改指針應(yīng)加3。
.2022/12/27ASCTAB:DB30H,31H,32H,33H53
例14
設(shè)有一個(gè)巡回檢測(cè)報(bào)警裝置,需對(duì)96路輸入進(jìn)行控制,每路有一個(gè)額定的最大值,是雙字節(jié)數(shù)。當(dāng)檢測(cè)量大于該路對(duì)應(yīng)的最大值時(shí),就越限報(bào)警。假設(shè)R2為保存檢測(cè)路數(shù)的寄存器,其對(duì)應(yīng)的最大額定值存放于31H和32H單元中。查找最大額定值的程序如下:
FMAX:MOVA,R2 ADDA,R2;表中一個(gè)額定值為2個(gè)字節(jié)
MOV31H,A MOVDPTR,#TAB;表首址.2022/12/27例14設(shè)有一個(gè)巡回檢測(cè)報(bào)警裝置,需對(duì)54
MOVCA,@A+DPTR;查表讀取第一個(gè)字節(jié)
XCHA,31H;第一個(gè)字節(jié)內(nèi)容存入31H INCDPTR MOVCA,@A+DPTR;查表讀取第二個(gè)字節(jié)
MOV32H,A;第二字節(jié)的內(nèi)容存入32HTAB:DW1230H,1450H,... DW2230H,2440H,... DW3120H,3300H,....2022/12/27 MOVCA,@A+DPTR;查表讀取第一個(gè)字節(jié).55
例15
在一個(gè)溫度檢測(cè)系統(tǒng)中,溫度模擬信號(hào)由10位A/D輸入。將A/D結(jié)果轉(zhuǎn)換為對(duì)應(yīng)溫度值,可采用查表方法實(shí)現(xiàn)。先由實(shí)驗(yàn)測(cè)試出整個(gè)溫度量程范圍內(nèi)的A/D轉(zhuǎn)換結(jié)果,把A/D轉(zhuǎn)換結(jié)果000H~3FFH所對(duì)應(yīng)的溫度值組織為一個(gè)表存儲(chǔ)在程序存儲(chǔ)器中,那么就可以根據(jù)檢測(cè)到的模擬量的A/D轉(zhuǎn)換值查找出相應(yīng)的溫度值。
設(shè)測(cè)得的A/D轉(zhuǎn)換結(jié)果已存入20H,21H單元中(高位字節(jié)在20H中,低位字節(jié)在21H中),查表得到的溫度值存放在22H,23H單元(高位字節(jié)在22H中,低位字節(jié)在23H中)。
.2022/12/27例15在一個(gè)溫度檢測(cè)系統(tǒng)中,溫度模擬信56程序如下:FTMP:MOVDPTR,#TAB;DPTR←表首地址
MOVA,21H;(20H)(21H)×2 CLRC RLCA MOV21H,A MOVA,20H RLCA MOV20H,A MOVA,21H;表首地址+偏移量
ADDCA,DPL MOVDPL,A.2022/12/27程序如下:.2022/12/2657MOVA,20HADDCA,DPHMOVDPH,ACLRAMOVCA,@A+DPTR;查表得溫度值高位字節(jié)MOV22H,ACLRAINCDPTRMOVCA,@A+DPTR;查表得溫度值低位字節(jié)MOV23H,ARETTAB:DW….2022/12/27MOVA,20H.2022/12/26584.2.7數(shù)制轉(zhuǎn)換
例16將一個(gè)字節(jié)二進(jìn)制數(shù)轉(zhuǎn)換成3位非壓縮型BCD碼。設(shè)一個(gè)字節(jié)二進(jìn)制數(shù)在內(nèi)部RAM40H單元,轉(zhuǎn)換結(jié)果放入內(nèi)部RAM50H,51H,52H單元中(高位在前),程序如下:
HEXBCD:MOVA,40HMOVB,#100DIVABMOV50H,AMOVA,#10XCHA,BDIVABMOV51H,AMOV52H,BRET.2022/12/274.2.7數(shù)制轉(zhuǎn)換例16將一個(gè)字節(jié)二59
例17
設(shè)4位BCD碼依次存放在內(nèi)存RAM中40H~43H單元的低4位,高4位都為0,要求將其轉(zhuǎn)換為二進(jìn)制數(shù),結(jié)果存入R2R3中。一個(gè)十進(jìn)制數(shù)可表示為:Dn×10n+Dn-1×10n-1+…+D0×100=(…((Dn×10+Dn-1)×10+Dn-2)×10+…)+D0
當(dāng)n=3時(shí),上式可表示為:
((D3×10+D2)×10+D1)×10+D0
.2022/12/27例17設(shè)4位BCD碼依次存放在內(nèi)存60BCDHEX:MOVR0,#40H;R0指向最高位地址
MOVR1,#03;計(jì)數(shù)值送R1MOVR2,#0;存放結(jié)果的高位清零
MOVA,@R0MOVR3,ALOOP:MOVA,R3MOVB,#10MULABMOVR3,A;(R3)×10的低8位送R3MOVA,BXCHA,R2;(R3)×10的高8位暫存R2MOVB,#10.2022/12/27BCDHEX:MOVR0,#40H;R61
MULABADDA,R2MOVR2,A;R2×10+(R3×10)高8位送R2INCR0;取下一個(gè)BCD數(shù)
MOVA,R3ADDA,@R0MOVR3,AMOVA,R2ADDCA,#0;加低字節(jié)來(lái)的進(jìn)位
MOVR2,ADJNZR1,LOOPRET.2022/12/27MULAB.2022/12/26624.2.8運(yùn)算程序一、加、減法程序
例18
將40H開(kāi)始存放的10個(gè)字節(jié)的數(shù)與50H開(kāi)始存放的10個(gè)字節(jié)的數(shù)相減(假設(shè)被減數(shù)大于減數(shù))。設(shè)被減數(shù)指針為R0,減數(shù)指針為R1,差數(shù)放回被減數(shù)單元,R5存放字節(jié)個(gè)數(shù),則程序如下:.2022/12/274.2.8運(yùn)算程序一、加、減法程序63
SUB:MOVR0,#40H MOVR1,#50H MOVR5,#10 CLRCSUB1:MOVA,@R0 SUBBA,@R1 MOV@R0,A INCR0 INCR1 DJNZR5,SUB1 RET.2022/12/27SUB:MOVR0,#40H.2022/1264
二、乘法運(yùn)算程序
在計(jì)算機(jī)中,常將乘法采用移位和加法來(lái)實(shí)現(xiàn)。例19將(R2R3)和(R6R7)中雙字節(jié)無(wú)符號(hào)數(shù)相乘,結(jié)果存入R4R5R6R7。此乘法可以采用部分積右移的方法來(lái)實(shí)現(xiàn),其程序框圖如圖4.6所示.2022/12/27二、乘法運(yùn)算程序.2022/12/2665圖4.6NMUL程序框圖.2022/12/27圖4.6NMUL程序框圖.2022/12/2666NMUL:MOVR4,#0;初始化
MOVR5,#0 CLRC MOVR0,#16NMUL1:MOVA,R4;CyR4R5R6R7右移一位
RRCA MOVR4,A MOVA,R5.2022/12/27NMUL:MOVR4,#0;初始化67 RRCA MOVR5,A MOVA,R6 RRCA MOVR6,A MOVA,R7 RRC MOVR7,A JNCNMUL2;C為移出乘數(shù)的最低位
MOVA,R5;(R4R5)+(R2F3)→(R4R5).2022/12/27 RRCA.2022/12/2668
ADDA,R3MOVR5,AMOVA,R4ADDCA,R2MOVR4,ANMUL2:DJNZR0,NMUL1;循環(huán)16位
MOVA,R4;最后結(jié)果再移一位
RRCAMOVR4,AMOVA,R5RRCAMOVR5,AMOVA,R6.2022/12/27ADDA,R3.2022/12/2669
RRCAMOVR6,AMOVA,R7RRCAMOVR7,ARET.2022/12/27RRCA.2022/12/2670
例20
假定被乘數(shù)在(R4R3)中,乘數(shù)放在R2中,乘積放在R7R6和R5中。MCS-51中有8位數(shù)的乘法指令MUL,用它來(lái)實(shí)現(xiàn)多字節(jié)乘法時(shí),可表示為(R4R3)×(R2)=[(R4)×28+(R3)]×(R2)=(R4)×(R2)×28+(R3)×(R2)其中(R4)×(R2)和(R3)×(R2)都是可直接用MUL指令來(lái)實(shí)現(xiàn),而乘以28意味著左移8位。由此可編寫(xiě)如下程序:
.2022/12/27例20假定被乘數(shù)在(R4R3)中,乘數(shù)71NMUL1:MOVA,R2MOVB,R3MULAB;(R3)×(R2)
MOVR5,A;積的低位送R5MOVR6,B;積的高位送R6MOVA,R2MOVB,R4MULAB;(R4)×(R2)
ADDA,R6;(R3)×(R2)的高位加(R4)×(R2)的低位
MOVA,BADDCA,#00H;(R4)×(R2)的高位加CyMOVR7,A;結(jié)果送R7RET.2022/12/27NMUL1:MOVA,R2.2022/172
三、除法運(yùn)算程序
除法是乘法的逆運(yùn)算,用移位、相減的方法來(lái)完成。首先比較被除數(shù)的高位字與除數(shù),如被除數(shù)高位大于除數(shù),則商為1,并從被除數(shù)中減去除數(shù),形成一個(gè)部分余數(shù);否則商位為0,不執(zhí)行減法。然后把新的部分余數(shù)左移一位,并與除數(shù)再次進(jìn)行比較。循環(huán)此步驟,直到被除數(shù)的所有位都處理完為止,一般商的字長(zhǎng)為n,則需循環(huán)n次。一般計(jì)算機(jī)中,被除數(shù)均為雙倍位,即如果除數(shù)和商為雙字節(jié),則被除數(shù)為四字節(jié)。如果在除法中發(fā)生商大于規(guī)定字節(jié),稱(chēng)為溢出。在進(jìn)行除法前,應(yīng)該檢查是否會(huì)產(chǎn)生溢出。一般可在進(jìn)行除法前,先比較被除數(shù)的高位與除數(shù),如被除數(shù)高位大于除數(shù),則溢出,置溢出標(biāo)志,不執(zhí)行除法。.2022/12/27三、除法運(yùn)算程序.2022/12/2673圖4.7除法程序的流程
.2022/12/27圖4.7除法程序的流程.2022/12/2674
例21
將(R4R5R6R7)除以(R2R3),商放在(R6R7)中,余數(shù)放在(R4R5)中。
NDIV:MOVA,R5;判商是否產(chǎn)生溢出
CLRC SUBBA,R3 MOVA,R4 SUBBA,R2 JNCNDIV1;溢出,轉(zhuǎn)溢出處理
MOVB,#16;無(wú)溢出,執(zhí)行除法.2022/12/27例21將(R4R5R6R7)除以(75NDIV2:CLRC;被除數(shù)左移一位,低位送0MOVA,R7RLCAMOVR7,AMOVA,R6RLCAMOVR6,AMOVA,R5RLCAMOVR5,AXCHA,R4RLCAXCHA,R4.2022/12/27NDIV2:CLRC;被除數(shù)左移一位,低位送076
MOVF0,C;保護(hù)移出的最高位
CLRCSUBBA,R3;部分余數(shù)與除數(shù)比較
MOVR1,AMOVA,R4SUBBA,R2JBF0,NDIV3;移出的高位為1,肯定夠減
JCNDIV4;否則,(Cy)=0才夠減
NDIV3:MOVR4,A;回送減法結(jié)果
MOVA,R1MOVR5,AINCR7;商上1.2022/12/27MOVF0,C;保護(hù)移出的最高位.2022/1277
NDIV4:DJNZB,NDIV2;循環(huán)次數(shù)減1,若不為零則循環(huán)
CLRF0;正常執(zhí)行無(wú)溢出F0=0RETNDIV1:SETBF0;溢出F0=1RET.2022/12/27NDIV4:DJNZB,NDIV2;循環(huán)次78
單片機(jī)原理及應(yīng)用.2022/12/27單片機(jī)原理及應(yīng)用.2022/12/2679第4章匯編語(yǔ)言程序設(shè)計(jì)簡(jiǎn)介4.1偽指令4.2匯編語(yǔ)言程序設(shè)計(jì).2022/12/27第4章匯編語(yǔ)言程序設(shè)計(jì)簡(jiǎn)介4.1偽指令.202280
偽指令是匯編程序能夠識(shí)別并對(duì)匯編過(guò)程進(jìn)行某種控制的匯編命令。它不是單片機(jī)執(zhí)行的指令,所以沒(méi)有對(duì)應(yīng)的可執(zhí)行目標(biāo)碼,匯編后產(chǎn)生的目標(biāo)程序中不會(huì)再出現(xiàn)偽指令。一、起始地址設(shè)定偽指令ORG格式為:ORG表達(dá)式該指令的功能是向匯編程序說(shuō)明下面緊接的程序段或數(shù)據(jù)段存放的起始地址。表達(dá)式通常為16進(jìn)制地址,也可以是已定義的標(biāo)號(hào)地址。
4.1偽指令.2022/12/27偽指令是匯編程序能夠識(shí)別并對(duì)匯編過(guò)程進(jìn)行某種控制的匯81ORG8000HSTART:MOVA,#30H
…
…
此時(shí)規(guī)定該段程序的機(jī)器碼從地址8000H單元開(kāi)始存放。在每一個(gè)匯編語(yǔ)言源程序的開(kāi)始,都要設(shè)置一條ORG偽指令來(lái)指定該程序在存儲(chǔ)器中存放的起始位置。若省略O(shè)RG偽指令,則該程序段從0000H單元開(kāi)始存放。在一個(gè)源程序中,可以多次使用ORG偽指令規(guī)定不同程序段或數(shù)據(jù)段存放的起始地址,但要求地址值由小到大依序排列,不允許空間重疊。.2022/12/27ORG8000H.2022/1282二、匯編結(jié)束偽指令END格式為:END該指令的功能是結(jié)束匯編。匯編程序遇到END偽指令后即結(jié)束匯編。處于END之后的程序,匯編程序?qū)⒉惶幚怼?2022/12/27二、匯編結(jié)束偽指令END.2022/12/2683三、字節(jié)數(shù)據(jù)定義偽指令DB[標(biāo)號(hào):]DB字節(jié)數(shù)據(jù)表功能是從標(biāo)號(hào)指定的地址開(kāi)始,在ROM中定義字節(jié)數(shù)據(jù)。字節(jié)數(shù)據(jù)表可以是一個(gè)或多個(gè)字節(jié)數(shù)據(jù)、字符串或表達(dá)式。該偽指令將字節(jié)數(shù)據(jù)表中的數(shù)據(jù)根據(jù)從左到右的順序依次存放在指定的存儲(chǔ)單元中。一個(gè)數(shù)據(jù)占一個(gè)存儲(chǔ)單元。例如:
ORG9000HDATA1:DB73H,01H,90HDATA2:DB02HDB‘ABCD’,3*25,01H.’1’
11個(gè)數(shù)據(jù)從9000H單元連續(xù)存放。
.2022/12/27三、字節(jié)數(shù)據(jù)定義偽指令DB.2022/12/2684四、字?jǐn)?shù)據(jù)定義偽指令DW[標(biāo)號(hào):]DW字?jǐn)?shù)據(jù)表功能是從標(biāo)號(hào)指定的地址單元開(kāi)始,在程序存儲(chǔ)器中定義字?jǐn)?shù)據(jù)。該偽指令將字或字表中的數(shù)據(jù)根據(jù)從左到右的順序依次存放在指定的存儲(chǔ)單元中。應(yīng)特別注意:16位的二進(jìn)制數(shù),高8位存放在低地址單元,低8位存放在高地址單元。例如:
ORG1400HDATA:DW324AH,3CH
…
…
匯編后,(1400H)=32H,(1401H)=4AH,(1402H)=00H,(1403H)=3CH。.2022/12/27四、字?jǐn)?shù)據(jù)定義偽指令DW.2022/12/2685
在定義中使用dup重復(fù)操作符
格式如下:
<N>dup(<參數(shù)表>)
例如:
ZERO:DB3DUP(0,0)BUFFER:DB‘AB’,2DUP(‘BA’,3DUP(1)).2022/12/27在定義中使用dup重復(fù)操作符
格式如下:
86五、位地址符號(hào)定義偽指令BIT格式為:符號(hào)名BIT位地址表達(dá)式功能是將位地址賦給指定的符號(hào)名。其中,位地址表達(dá)式可以是絕對(duì)地址,也可以是符號(hào)地址。例如:
STBITP1.0將P1.0的位地址賦給符號(hào)名ST,在其后的編程中就可以用ST來(lái)代替P1.0。.2022/12/27五、位地址符號(hào)定義偽指令BIT.2022/12/2687六、賦值偽指令EQU符號(hào)名EQU表達(dá)式功能是將表達(dá)式的值或特定的某個(gè)匯編符號(hào)定義為一個(gè)指定的符號(hào)名。例如:
LENEQU10BLOCKEQU22HMOVR7,#LENMOVR0,#BLOCK命令執(zhí)行后:R7=?R0=?
1022H.2022/12/27六、賦值偽指令EQU命令執(zhí)行后:R7=?R0=?88
匯編語(yǔ)言的語(yǔ)句格式
語(yǔ)句行由四個(gè)字段組成:
[標(biāo)號(hào):]操作碼[操作數(shù)][;注釋]
括號(hào)內(nèi)的部分可以根據(jù)實(shí)際情況取舍。每個(gè)字段之間要用分隔符分隔,可以用作分隔符的符號(hào)有空格、冒號(hào)、逗號(hào)、分號(hào)等。如:LOOP:MOVA,#7FH;A←7FH.2022/12/27匯編語(yǔ)言的語(yǔ)句格式.2022/12/2689一、標(biāo)號(hào)標(biāo)號(hào)是語(yǔ)句地址的標(biāo)志符號(hào),用于引導(dǎo)對(duì)該語(yǔ)句的非順序訪(fǎng)問(wèn)。有關(guān)標(biāo)號(hào)的規(guī)定為:
標(biāo)號(hào)由1~8個(gè)ASCII字符組成。第一個(gè)字符必須是字母,其余字符可以是字母、數(shù)字或其他特定字符;不能使用該匯編語(yǔ)言已經(jīng)定義了的符號(hào)作為標(biāo)號(hào)。如指令助記符、寄存器符號(hào)名稱(chēng)等;標(biāo)號(hào)后邊必須跟冒號(hào)。二、操作碼
操作碼用于規(guī)定語(yǔ)句執(zhí)行的操作。它是匯編語(yǔ)句中唯一不能空缺的部分。它由指令助記符表示。
.2022/12/27一、標(biāo)號(hào).2022/12/2690三、操作數(shù)操作數(shù)用于給指令的操作提供數(shù)據(jù)或地址。在一條匯編語(yǔ)句中操作數(shù)可能是空缺的,也可能包括一項(xiàng),還可能包括兩項(xiàng)或三項(xiàng)。各操作數(shù)間以逗號(hào)分隔。操作數(shù)字段的內(nèi)容可能包括以下幾種情況:(1)工作寄存器名;(2)特殊功能寄存器名;(3)標(biāo)號(hào)名;(4)常數(shù);(5)符號(hào)“$”,表示程序計(jì)數(shù)器PC的當(dāng)前值;(6)表達(dá)式。.2022/12/27三、操作數(shù).2022/12/2691四、注釋
注釋不屬于匯編語(yǔ)句的功能部分,它只是對(duì)語(yǔ)句的說(shuō)明。注釋字段可以增加程序的可讀性,有助于編程人員的閱讀和維護(hù)。注釋字段必須以分號(hào)“;”開(kāi)頭,長(zhǎng)度不限,當(dāng)一行書(shū)寫(xiě)不下時(shí),可以換行接著書(shū)寫(xiě),但換行時(shí)應(yīng)注意在開(kāi)頭使用分號(hào)“;”。五、數(shù)據(jù)的表示形式
8051匯編語(yǔ)言的數(shù)據(jù)可以有以下幾種表示形式:二進(jìn)制數(shù),末尾以字母B標(biāo)識(shí)。如:10001111B;十進(jìn)制數(shù),末尾以字母D標(biāo)識(shí)或?qū)⒆帜窪省略。如:88D,66;十六進(jìn)制數(shù),末尾以字母H標(biāo)識(shí)。如:78H,0A8H(但應(yīng)注意的是,十六進(jìn)制數(shù)以字母A~F開(kāi)頭時(shí)應(yīng)在其前面加上數(shù)字“0”。);ASCII碼,以單引號(hào)括起來(lái)標(biāo)識(shí)。如:‘AB’,‘1245’
.2022/12/27四、注釋.2022/12/2692ORG1000HTAB:DB1,2,3,’1’,’EFGHI’DB2DUP(?)DB2DUP(01H,02H)BUF:DW$-TABDUP(?),0FFHTTEQUBUF-TAB1000H11001H21002H31003H31H1004H45H1005H46H1006H47H1007H48H1008H49H1009HX100AHX100BH01H100CH02H100DH01H100EH02H…………TT=?TT=15.2022/12/27ORG1000H1000H11001H21934.2匯編語(yǔ)言程序設(shè)計(jì)4.2.1簡(jiǎn)單程序設(shè)計(jì)
例1兩個(gè)無(wú)符號(hào)雙字節(jié)數(shù)相加。設(shè)被加數(shù)存放于內(nèi)部RAM的40H(高位字節(jié)),41H(低位字節(jié)),加數(shù)存放于50H(高位字節(jié)),51H(低位字節(jié)),和數(shù)存入40H和41H單元中。.2022/12/274.2匯編語(yǔ)言程序設(shè)計(jì)4.2.1簡(jiǎn)單程序設(shè)計(jì)94程序如下:START:CLRC;將Cy清零MOVR0,#41H;將被加數(shù)地址送數(shù)據(jù)指針R0MOVR1,#51H;將加數(shù)地址送數(shù)據(jù)指針R1AD1:MOVA,@R0;被加數(shù)低字節(jié)的內(nèi)容送入AADDA,@R1;兩個(gè)低字節(jié)相加MOV@R0,A;低字節(jié)的和存入被加數(shù)低字節(jié)中
DECR0;指向被加數(shù)高位字節(jié)
DECR1;指向加數(shù)高位字節(jié)
MOVA,@R0;被加數(shù)高位字節(jié)送入AADDCA,@R1;兩個(gè)高位字節(jié)帶Cy相加
MOV@R0,A;高位字節(jié)的和送被加數(shù)高位字節(jié)
RET這一句省略掉可以不?將這一句的ADDC改為ADD行嗎?這個(gè)程序還可以怎么改?.2022/12/27程序如下:這一句省略掉可以不?將這一句的ADDC改為AD95
例2將兩個(gè)半字節(jié)數(shù)合并成一個(gè)一字節(jié)數(shù)。設(shè)內(nèi)部RAM40H,41H單元中分別存放著8位二進(jìn)制數(shù),要求取出兩個(gè)單元中的低半字節(jié),并成一個(gè)字節(jié)后,存入50H單元中。程序如下:
START:MOVR1,#40H;設(shè)置R1為數(shù)據(jù)指針
MOVA,@R1;取出第一個(gè)單元中的內(nèi)容
ANLA,#0FH;取第一個(gè)數(shù)的低半字節(jié)
SWAPA ;移至高半字節(jié)
INCR1 ;修改數(shù)據(jù)指針
XCHA,@R1 ;取第二個(gè)單元中的內(nèi)容
ANLA,#0FH;取第二個(gè)數(shù)的低半字節(jié)
ORLA,@R1 ;拼字
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 個(gè)人挖機(jī)租賃合同范本
- 借款合同范例房產(chǎn)
- 倉(cāng)儲(chǔ)合同范本標(biāo)
- 三基護(hù)理考試模擬題+答案
- 電子技術(shù)及實(shí)訓(xùn)練習(xí)題+答案
- 上半年房地產(chǎn)銷(xiāo)售工作總結(jié)
- 中醫(yī)康復(fù)治療技術(shù)試題庫(kù)+參考答案
- 制作書(shū)本合同范本
- 中醫(yī)診所勞務(wù)合同范本
- 一本好書(shū)讓我改變自己超越自己演講稿
- 2023年茂名市人民醫(yī)院護(hù)士招聘考試歷年高頻考點(diǎn)試題含答案
- 山東教育出版社(魯教版)八年級(jí)化學(xué)全一冊(cè)教學(xué)課件
- 《外貿(mào)風(fēng)險(xiǎn)管理》完整全套課件
- 公路水運(yùn)工程施工企業(yè)主要負(fù)責(zé)人和安全生產(chǎn)管理人員大綱和題庫(kù)
- 榜樣7航天追夢(mèng)人王亞平事跡介紹PPT英雄航天員王亞平事跡介紹PPT課件(帶內(nèi)容)
- 物理word版2023山東高考答題卡涂準(zhǔn)考證號(hào)和條形碼
- 人教版《道德與法治》三年級(jí)下冊(cè)全冊(cè)全套課件
- GB/T 32294-2015鍛制承插焊和螺紋活接頭
- 部編人教版三年級(jí)語(yǔ)文下冊(cè)《快樂(lè)讀書(shū)吧》精美課件
- 建筑力學(xué) 李前程 第一章 緒 論
- 2023年新教科版科學(xué)六年級(jí)下冊(cè)學(xué)生活動(dòng)手冊(cè)答案
評(píng)論
0/150
提交評(píng)論