匯編語言及應用程序設計_第1頁
匯編語言及應用程序設計_第2頁
匯編語言及應用程序設計_第3頁
匯編語言及應用程序設計_第4頁
匯編語言及應用程序設計_第5頁
已閱讀5頁,還剩57頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

匯編語言及應用程序設計第1頁,共62頁,2023年,2月20日,星期一

9.1偽指令

偽指令是對匯編過程起控制作用,但本身并沒有對應的機器代碼的指令。一、匯編起始指令ORG

指令格式為:ORGnn

該指令的作用是指明后面的程序或數據塊的起始地址,它總是出現在每段源程序或數據塊的開始。式中,nn為16位地址,匯編時nn確定了此語句后面第一條指令或第一個數據的地址,此后的源程序或數據塊就依次連續(xù)存放在以后的地址內,直到遇到另一個ORG指令為止。第2頁,共62頁,2023年,2月20日,星期一例:ORG2000HMOVSP,#60HMOVR0,#2FHMOVR2,#0FFHORG偽指令說明其后面程序的目標代碼在存儲器中存放的起始地址是2000H,即存儲器地址目標程序

2000H7581602003H782F2005H7AFF注意:一般要求ORG定義空間地址由小到大,且地址不能重疊。第3頁,共62頁,2023年,2月20日,星期一

二、定義字節(jié)指令DB

指令格式:

<標號:>DB<項或項表>其中:項或項表是指一個字節(jié),數或字符串,或以引括起來的ASCII碼字符串(一個字符用ASCII

碼表示,就相當于一個字節(jié))。功能:把項或項表的數值(字符則用它的ASCII碼)存入從標號開始的連續(xù)單元中。第4頁,共62頁,2023年,2月20日,星期一例:ORG1000HSEG1:DB53H,74H,78H,‘1’,‘2’SEG2:DB23H,‘DAY’END則:(1000H)=53H

(1001H)=74H

(1002H)=78H

(1003H)=31H數字1的ASCII碼(1004H)=32H數字2的ASCII碼(1005H)=23H

(1006H)=34H

(1007H)=41H‘DAY’的ASCII碼(1008H)=59H

第5頁,共62頁,2023年,2月20日,星期一

三、定義字指令DW

指令格式:

<標號:>DW<項或項表>其中:

DW的基本含義與DB相同,但DB一般用于定

8位數據(一個字節(jié)),而DW則定義16位數據,即一個字(規(guī)定為兩個字節(jié),即一個字為

16位二進制數)。注意:在執(zhí)行匯編程序時,機器會自動按高位字節(jié)在前,低位字節(jié)在后的格式排列(與程序中的地址規(guī)定一致),DW偽指令常用來建立地址表。第6頁,共62頁,2023年,2月20日,星期一四、預留存儲區(qū)DS

指令格式:

<標號:>DS<表達式>功能:由標號指定單元開始,定義一個存儲區(qū),以備源程序使用,存儲區(qū)預留的存儲單元數由表達式的值決定。例如:ORG3C40HTEMP:DS10

即由3C40H地址開始保留連續(xù)的10個存儲單元的存儲區(qū)。

第7頁,共62頁,2023年,2月20日,星期一

五、標號指令EQU

指令格式:

<標號:>EQUnn或表達式

功能:將語句操作數的值賦予本語句的標號,故又稱為等值指令。注意:由EQU等值的字符名稱必須先賦值后使用,且在同一程序中,用EQU偽指令對標號賦值后,該標號的值在整個程序中不能改變。

第8頁,共62頁,2023年,2月20日,星期一例:PA8155EQU8001H

即給標號PA8155賦值為8001H。使用等值指令可給程序的編制、調試、修改帶來方便,如果在程序中要多次使用到某一地址,由

EQU指令將其賦值給一個字符名稱,一旦需要對其進行變動,只要改變EQU命令后面的數字即可,而不需要對程序中涉及到該地址的所有指令逐句進行修改。第9頁,共62頁,2023年,2月20日,星期一

六、源程序結束END

指令格式:

<標號:>END<表達式>

功能:是一個結束語句,告訴匯編程序段已結束注意:該語句必須放在整個程序(包括偽指令)之后,若END語句出現在代碼塊中間,則匯編語言將不匯編END后面的語句。

第10頁,共62頁,2023年,2月20日,星期一9.2匯編語言源程序的匯編過程自動編排目標程序中的指令存放地址把源程序翻譯成機器碼分析源程序語法,若出錯,給出錯誤信息輸出目標程序及源程序文件列表第11頁,共62頁,2023年,2月20日,星期一

9.3MCS-51匯編語言使用程序舉例9.3.1簡單程序設計9.3.2分支程序設計9.3.3運算程序設計9.3.4循環(huán)程序設計9.3.5代碼轉換程序設計9.3.6邏輯操作程序設計9.3.7查表程序設計

第12頁,共62頁,2023年,2月20日,星期一9.3.1簡單程序設計

例1兩個無符號雙字節(jié)數相加。

設被加數存放于內部RAM的40H(高位字節(jié)),41H(低位字節(jié)),加數存放于50H(高位字節(jié)),51H(低位字節(jié)),和數存入

40H和41H單元中。第13頁,共62頁,2023年,2月20日,星期一程序如下:START:CLRC;將Cy清零

MOVR0,#41H;將被加數地址送數據指針R0MOVR1,#51H;將加數地址送數據指針R1AD1:MOVA,@R0;被加數低字節(jié)的內容送入AADDA,@R1;兩個低字節(jié)相加

MOV@R0,A;低字節(jié)的和存入被加數低字

DECR0;指向被加數高位字節(jié)

DECR1;指向加數高位字節(jié)

MOVA,@R0;被加數高位字節(jié)送入AADDCA,@R1;兩個高位字節(jié)帶Cy相加

MOV@R0,A;高位字節(jié)的和送被加數高位字

RET第14頁,共62頁,2023年,2月20日,星期一

例2將兩個半字節(jié)數合并成一個一字節(jié)數。設內部RAM40H#,41H單元中分別存放著8位二進制數,要求取出兩個單元中的低半字節(jié),并成一個字節(jié)后,存入50H單元中。第15頁,共62頁,2023年,2月20日,星期一程序如下:START:MOVR1,#40H;設置R1為數據指針MOVA,@R1;取出第一個單元中的內容ANLA,#0FH;取第一個數的低半字節(jié)SWAPA ;移至高半字節(jié)INCR1;修改數據指針XCHA,@R1;取第二個單元中的內容ANLA,#0FH;取第二個數的低半字節(jié)ORLA,@R1;拼字MOV50H,A;存放結果RET第16頁,共62頁,2023年,2月20日,星期一9.3.2分支程序設計圖9.1分支結構框圖(a)單分支流程;(b)多分支流程

第17頁,共62頁,2023年,2月20日,星期一例3x,y均為8位二進制數,設x存入R0,y存入R1,求解:y=syn(x)圖9.2第18頁,共62頁,2023年,2月20日,星期一程序如下:

START:CJNER0,#00H,SUL1;R0中的數與00比較不等轉移

MOVR1,#00H;相等,R1←0SJMPSUL2SUL1:JCNEG;兩數不等,若(R0)<0,轉向NEGMOVR1,#01H;(R0)>0,則R1←01HSJMPSUL2NEG:MOVR1,#0FFH;(R0)<0,則R1←0FFHSUL2:RET第19頁,共62頁,2023年,2月20日,星期一例4比較兩個無符號數的大小。設外部RAM的存儲單元ST1和ST2中存放兩個不帶符號的二進制數,找出其中的大數存入外部RAM中的ST3單元中。

圖9.3第20頁,共62頁,2023年,2月20日,星期一程序如下: ORG1000HST1 EQU2000HST2EQU2100HST3EQU2200HSTART:CLRC ;清零Cy MOVDPTR,#ST1;第一個數的指針MOVXA,@DPTR;取第一個數MOVR2,A;保存MOVDPTR,#ST2;第二個數的指針MOVXA,@DPTR;取第二個數CLRC第21頁,共62頁,2023年,2月20日,星期一SUBBA,R2;兩數比較JNCBIG2;若第二個數大,則轉XCHA,R2;第一個數大BIG1:MOVDPTR,#ST3MOVX@DPTR,A;存大數RETBIG2:MOVXA,@DPTR;第二個數大SJMPBIG1RET第22頁,共62頁,2023年,2月20日,星期一9.3.3運算程序設計一、加、減法程序例5將40H開始存放的10個字節(jié)的數與50H開始存放的10個字節(jié)的數相減(假設被減數大于減數)。設被減數指針為R0,減數指針為R1,差數放回被減數單元,R5存放字節(jié)個數,則程序如下:

第23頁,共62頁,2023年,2月20日,星期一SUB:MOVR0,#40H MOVR1,#50H MOVR5,#10 CLRCSUB1:MOVA,@R0 SUBBA,@R1 MOV@R0,A INCR0 INCR1 DJNZR5,SUB1 RET第24頁,共62頁,2023年,2月20日,星期一二、乘法運算程序

在計算機中,常將乘法采用移位和加法來實現。例6將(R2R3)和(R6R7)中雙字節(jié)無符號數相乘,結果存入R4R5R6R7。此乘法可以采用部分積右移的方法來實現,其程序框圖如圖4.6所示,程序如下:

NMUL:MOVR4,#0;初始化 MOVR5,#0 CLRC MOVR0,#16第25頁,共62頁,2023年,2月20日,星期一NMUL1:MOVA,R4;CyR4R5R6R7右移一位 RRCA MOVR4,A MOVA,R5 RRCA MOVR5,A MOVA,R6 RRCA MOVR6,A MOVA,R7 RRC MOVR7,A JNCNMUL2;C為移出乘數的最低位 MOVA,R5;(R4R5)+(R6F7)→(R4R5)

第26頁,共62頁,2023年,2月20日,星期一ADDA,R3MOVR5,AMOVA,R4ADDCA,R2MOVR4,ANMUL2:DJNZR0,NMUL1;循環(huán)16位MOVA,R4;最后結果再移一位RRCAMOVR4,AMOVA,R5RRCAMOVR5,AMOVA,R6第27頁,共62頁,2023年,2月20日,星期一RRCAMOVR6,AMOVA,R7RRCAMOVR7,ARET第28頁,共62頁,2023年,2月20日,星期一圖9.4NMUL程序框圖第29頁,共62頁,2023年,2月20日,星期一

三、除法運算程序除法是乘法的逆運算,用移位、相減的方法來完成。首先比較被除數的高位字與除數,如被除數高位大于除數,則商為1,并從被除數中減去除數,形成一個部分余數;否則商位為0,不執(zhí)行減法。然后把新的部分余數左移一位,并與除數再次進行比較。循環(huán)此步驟,直到被除數的所有位都處理完為止,一般商的字長為n,則需循環(huán)n次。一般計算機中,被除數均為雙倍位,即如果除數和商為雙字節(jié),則被除數為四字節(jié)。如果在除法中發(fā)生商大于規(guī)定字節(jié),稱為溢出。在進行除法前,應該檢查是否會產生溢出。一般可在進行除法前,先比較被除數的高位與除數,如被除數高位大于除數,則溢出,置溢出標志,不執(zhí)行除法。第30頁,共62頁,2023年,2月20日,星期一圖9.5除法程序的流程第31頁,共62頁,2023年,2月20日,星期一

例7將(R4R5R6R7)除以(R2R3),商放在(R6R7)中,余數放在(R4R5)中。NDIV:MOVA,R5;判商是否產生溢出 CLRC SUBBA,R3 MOVA,R4 SUBBA,R2 JNCNDIV1;溢出,轉溢出處理 MOVB,#16;無溢出,執(zhí)行除法第32頁,共62頁,2023年,2月20日,星期一NDIV2:CLRC;被除數左移一位,低位送0MOVA,R7RLCAMOVR7,AMOVA,R6RLCAMOVR6,AMOVA,R5RLCAMOVR5,AXCHA,R4RLCAXCHA,R4第33頁,共62頁,2023年,2月20日,星期一MOVF0,C;保護移出的最高位CLRCSUBBA,R3;部分余數與除數比較MOVR1,AMOVA,R4SUBBA,R2JBF0,NDIV3;移出的高位為1,肯定夠減JCNDIV4;否則,(Cy)=0才夠減NDIV3:MOVR4,A;回送減法結果MOVA,R1MOVR5,AINCR7;商上1第34頁,共62頁,2023年,2月20日,星期一NDIV4:DJNZB,NDIV2;循環(huán)次數減1,若不為零則循環(huán)CLRF0;正常執(zhí)行無溢出F0=0RETNDIV1:SETBF0;溢出F0=1RET第35頁,共62頁,2023年,2月20日,星期一9.3.4循環(huán)程序設計一、單重循環(huán)

圖9.6第36頁,共62頁,2023年,2月20日,星期一循環(huán)程序一般由四個主要部分組成:(1)初始化部分:為循環(huán)程序做準備,如規(guī)定循環(huán)次數、給各變量和地址指針預置初值。(2)處理部分:為反復執(zhí)行的程序段,是循環(huán)程序的實體,也是循環(huán)程序的主體。(3)循環(huán)控制部分:這部分的作用是修改循環(huán)變量和控制變量,并判斷循環(huán)是否結束,直到符合結束條件時,跳出循環(huán)為止。(4)結束部分:這部分主要是對循環(huán)程序的結果進行分析、處理和存放。第37頁,共62頁,2023年,2月20日,星期一

例8設在內部RAM的BLOCK單元開始處有長度為LEN個的無符號數據塊,試編一個求和程序,并將和存入內部RAM的SUM單元(設和不超過8位)。BLOCKEQU20HLENEQU30HSUMEQU40HSTART:CLRA;清累加器AMOVR2,#LEN;數據塊長度送R2MOVR1,#BLOCK;數據塊首址送R1LOOP:ADDA,@R1;循環(huán)加法INCR1;修改地址指針DJNZR2,LOOP;修改計數器并判斷MOVSUM,A;存和RET第38頁,共62頁,2023年,2月20日,星期一

二、多重循環(huán)

多重循環(huán)程序,即在一個循環(huán)體中又包含了其它的循環(huán)程序,使用多重循環(huán)時,必須注意:(1)循環(huán)嵌套,必須層次分明,不允許產生內外層循環(huán)交叉。(2)外循環(huán)可以一層層向內循環(huán)進入,結束時由里往外一層層退出。(3)內循環(huán)可以直接轉入外循環(huán),實現一個循環(huán)由多個條件控制的循環(huán)結構方式。

第39頁,共62頁,2023年,2月20日,星期一

例9在外部RAM中,BLOCK開始的單元中有一無符號數據塊,其個數為LEN個字節(jié)。試將這些無符號數按遞減次序重新排列,并存入原存儲區(qū)。

ORG1000HSTART:MOVDPTR,#BLOCK;置地址指針MOVP2,DPH;P2作地址指針高字節(jié)MOVR7,#LEN;置外循環(huán)計數初值DECR7;比較與交換n-1次

第40頁,共62頁,2023年,2月20日,星期一LOOP0:CLRF0;交換標志清0MOVR0,DPL;MOVR1,DPL;置相鄰兩數地址指針低字節(jié)INCR1MOVR6,R7;置內循環(huán)計數器初值LOOP1:MOVXA,@R0;取數MOVB,A;暫存MOVXA,@R1;取下一個數CJNEA,B,NEXT;相鄰兩數比較,不等轉SJMPNOCHA;相等不交換

第41頁,共62頁,2023年,2月20日,星期一NEXT:JCNOCHA;Cy=1,則前者大于后者,不必交換SETBF0;否則,置交換標志MOVX@R0,A;XCHA,B;兩數交換,大者在前,小者在后MOVX@R1,A;NOCHA:INCR0INCR1;修改指針DJNZR6,LOOP1;內循環(huán)未完,則繼續(xù)JNBF0,EXIT;若從未交換,則結束DJNZR7,LOOP0;外循環(huán)未完,則繼續(xù)EXIT:RET第42頁,共62頁,2023年,2月20日,星期一圖9.7第43頁,共62頁,2023年,2月20日,星期一9.3.5代碼轉換程序設計例104位二進制數轉化為ASCII代碼分析:從ASCII編碼表可知,若4位二進制數小于10,則此二進制數加上30H即變成相應的ASCII碼;若大于10(包括等于10),則應加37H方可。入口:轉換前4位二進制數存R2出口:轉換后的ASCII碼存R2第44頁,共62頁,2023年,2月20日,星期一源程序如下:

ORG2000HASCB1:MOVA,R2;ANLA,#0FH;取出四位二進制數

PUSHA;壓入堆棧

CLRCSUBBA,#0AH;POPA;彈回A中

JCLOOP;該數小于10去LOOPADDA,#07H;否則加07HLOOP:ADDA,#30H;加30HMOVR2,A;轉換之ASCII碼送R2中

RET;返回主程序第45頁,共62頁,2023年,2月20日,星期一

例11設4位BCD碼依次存放在內存RAM中40H~43H單元的低4位,高4位都為0,要求將其轉換為二進制數,結果存入R2R3中。分析:一個十進制數可表示為:Dn×10n+Dn-1×10n-1+…+D0×100=(…((Dn×10+Dn-1)×10+Dn-2)×10+…)+D0當n=3時,上式可表示為:((D3×10+D2)×10+D1)×10+D0

第46頁,共62頁,2023年,2月20日,星期一BCDHEX:MOVR0,#40H;R0指向最高位地址MOVR1,#03;計數值送R1MOVR2,#0;存放結果的高位清零MOVA,@R0MOVR3,ALOOP:MOVA,R3MOVB,#10MULABMOVR3,A;(R3)×10的低8位送R3MOVA,BXCHA,R2;(R3)×10的高8位暫存R2MOVB,#10第47頁,共62頁,2023年,2月20日,星期一MULABADDA,R2MOVR2,A;R2×10+(R3×10)高8位送R2INCR0;取下一個BCD數MOVA,R3ADDA,@R0MOVR3,AMOVA,R2ADDCA,#0;加低字節(jié)來的進位MOVR2,ADJNZR1,LOOPRET第48頁,共62頁,2023年,2月20日,星期一9.3.6邏輯操作程序設計一.邏輯“與”函數的程序模擬例12:某控制用的計算機在執(zhí)行初始化程序后,需要接收到:(1)準備就緒信號為邏輯“1”;(2)主回路工作正常信號為邏輯“1”;(3)啟動開關閉信號為邏輯“1”;方可執(zhí)行主程序,否則進行循環(huán)檢測,等待條件的滿足。第49頁,共62頁,2023年,2月20日,星期一設該三個信號由P1口的P1.2、P1.4、P1.6位輸入,分別稱作D2、D4、D6,則當D2=D4=D6=1時,邏輯函數f=D2.D4.D6=1,方執(zhí)行主程序,否則踏步等待。實現這一要求的流程如圖9.8所示:圖9.8邏輯“與”模擬流程圖第50頁,共62頁,2023年,2月20日,星期一“與”函數f=D2.D4.D6的模擬程序片斷如下:

AND1:MOVA,P1;取狀態(tài)字:D7D0ANLA,#54H;送屏蔽字:01010100CJNEA,#54H,AND1;比較跳轉,若f=1,

執(zhí)行主程序

MAIN否則f=0,循環(huán)檢測第51頁,共62頁,2023年,2月20日,星期一二.邏輯“或”函數的程序模擬例13:在報警程序中,只要主電路工作異常,或者過壓,或者過流,或者過載,都應當及時發(fā)出聲光報警信號。

設過壓、過流、過載信號分別由P1口的P1.0、P1.3、P1.6輸入分別稱作D0、D3、D6,則當D0=D3=D6=0時,邏輯函數f=D0+D3+D6=0,連續(xù)循環(huán)檢測,否則發(fā)出報警信號。第52頁,共62頁,2023年,2月20日,星期一“或”函數f=D0+D3+D6的模擬程序片斷如下:

OR10:MOVA,P1;取狀態(tài)字:D7D0ANLA,#49H;送屏蔽字:01001001JZA,OR10;比較跳轉,若f=1,

發(fā)出報警信號

DONE:否則f=0,循環(huán)檢測第53頁,共62頁,2023年,2月20日,星期一三.任意邏輯函數的程序模擬步驟:先把給定邏輯函數化為最小化“與-或”表達式然后畫出實現該函數程序模擬的流程圖編寫模擬程序第54頁,共62頁,2023年,2月20日,星期一例14求其模擬程序。設變量均由P1口輸入,連接如下:將最小化F2最小化為:以原變量化簡:以反變量化簡:

第55頁,共62頁,2023年,2月20日,星期一圖9.9F2函數程序模擬流程圖F2函數程序模擬流程圖如圖9.9所示:第56頁,共62頁,2023年,2月20日,星期一編寫源程序片斷如下:以原變量編程:F2MOVA,P1;取狀態(tài)字

ANLA,#09H;送屏蔽字

XRLA,#08H;比較

JZBRAN1;F2=1去BRAN1MOVA,P1;

ANL

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論