《微型計(jì)算機(jī)系統(tǒng) (5)》由會(huì)員分享,可在線(xiàn)閱讀,更多相關(guān)《微型計(jì)算機(jī)系統(tǒng) (5)(36頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、第第 5 5 章章匯編語(yǔ)言程序設(shè)計(jì) 第第5 5章章 匯編語(yǔ)言程序設(shè)計(jì)匯編語(yǔ)言程序設(shè)計(jì) 本章重點(diǎn)本章重點(diǎn):結(jié)合實(shí)例理解匯編語(yǔ)言程序設(shè)計(jì)的基本步驟;掌握匯編語(yǔ)言程序設(shè)計(jì)的基本方法;熟練運(yùn)用循環(huán)、分支和子程序的程序設(shè)計(jì)方法解決問(wèn)題。本章難點(diǎn):本章難點(diǎn):依據(jù)所要解決的問(wèn)題,選擇正確的程序設(shè)計(jì)方法,正確地運(yùn)用指令編寫(xiě)實(shí)用的匯編原程序。匯編語(yǔ)言是一種用助記符來(lái)表示指令的操作碼和操作數(shù),用標(biāo)號(hào)和符號(hào)來(lái)代替地址、常量和變量的符號(hào)語(yǔ)言。用匯編語(yǔ)言編寫(xiě)的程序不能由機(jī)器直接執(zhí)行,而必須翻譯成由機(jī)器代碼組成的目標(biāo)程序,這個(gè)翻譯過(guò)程稱(chēng)為匯編。5.1 概述 用來(lái)把匯編語(yǔ)言編寫(xiě)的程序自動(dòng)翻譯成目標(biāo)程序的軟件叫匯編程序。匯編
2、程序的建立及匯編過(guò)程如圖所示。編輯程序編輯程序匯編程序匯編程序連接程序連接程序EXP.ASMEXP.OBJEXP.EXE 8086的匯編語(yǔ)言的源程序是分段的,由若干個(gè)段形成一個(gè)源程序。源程序的一般格式為:NAME1 SEGMENT語(yǔ)句語(yǔ)句N(xiāo)AME1 ENDSNAME2 SEGMENT語(yǔ)句 語(yǔ)句 NAME2 ENDSEND 5.1 概述 每一個(gè)段有一個(gè)名字,以符號(hào)SEGMENT作為段的開(kāi)始,以語(yǔ)句ENDS作為段的結(jié)束。這兩者都必須有名字,而且名字必須相同。由若干個(gè)段組成一個(gè)源程序,整個(gè)源程序以語(yǔ)句END作為結(jié)束。5.1 概述 總之,8086的源程序是由若干段組成的,而一個(gè)段又是由若干個(gè)語(yǔ)句行組成
3、的。所以,語(yǔ)句行是匯編源程序的基礎(chǔ)。8086匯編的一個(gè)語(yǔ)句行也是由4個(gè)部分組成的,即 標(biāo)號(hào) 操作碼 操作數(shù) ;注釋 各部分之間至少要用一個(gè)空格作為間隔。5.1 概述 語(yǔ)句行是由標(biāo)記及分隔符按照一定規(guī)則組織起來(lái)的,標(biāo)記是匯編語(yǔ)言源程序的最小的、具有意義的單位,如標(biāo)識(shí)符、保留字、界符、常數(shù)和注釋?zhuān)羞@些都稱(chēng)為標(biāo)記。在8086匯編語(yǔ)言中,有數(shù)值表達(dá)式和地址表達(dá)式兩種,由各種常量與運(yùn)算符連接成的式子,稱(chēng)為數(shù)值表達(dá)式。將常量、變量、標(biāo)號(hào)、寄存器內(nèi)容和運(yùn)算符、操作符組合成的有意義的式子,稱(chēng)為地址表達(dá)式。單個(gè)常量,變量、標(biāo)號(hào)是表達(dá)式的最簡(jiǎn)形式。在匯編過(guò)程中,匯編程序按操作運(yùn)算符約定的優(yōu)先規(guī)則對(duì)表達(dá)式進(jìn)行計(jì)
4、算,得到一個(gè)數(shù)值或一個(gè)地址。5.2 語(yǔ)句行構(gòu)成 偽指令用來(lái)指示匯編程序應(yīng)該如何去處理匯編語(yǔ)言的源程序。它們?cè)趨R編時(shí)被解釋執(zhí)行,除了部分語(yǔ)句可以申請(qǐng)存儲(chǔ)空間以外,不產(chǎn)生任何目標(biāo)代碼。5.3 偽指令 2等號(hào)語(yǔ)句 格式:符號(hào)名=表達(dá)式 功能:把表達(dá)式的值賦值給符號(hào)名,等號(hào)語(yǔ)句與等值語(yǔ)句具有相同的功能。5.3.1 5.3.1 符號(hào)定義偽指令符號(hào)定義偽指令1等值語(yǔ)句 格式:符號(hào)名 EQU 表達(dá)式 功能:用一個(gè)符號(hào)名來(lái)代替表達(dá)式,使該符號(hào)名與表達(dá)式同義。格式:變量名 數(shù)據(jù)定義符 操作數(shù),操作數(shù),功能:方括號(hào)中的變量名為可選項(xiàng)。操作數(shù)可以不止一個(gè),多個(gè)操作數(shù)時(shí)用逗號(hào)分開(kāi)。數(shù)據(jù)定義符號(hào)是DB、DW、DD、DQ
5、、DT。DB定義字節(jié)類(lèi)型變量,DW定義字類(lèi)型變量,DD定義雙字類(lèi)型變量,DQ定義四字類(lèi)型變量,DT定義十字節(jié)類(lèi)型變量。5.3.2 5.3.2 數(shù)據(jù)定義偽指令數(shù)據(jù)定義偽指令DATA DB l0H,20HSTRl DBCOMPUTERDATAlDB20 DUP(?)DATA2DW?DATA3DB 20 DUP(30H)5.3.2 5.3.2 數(shù)據(jù)定義偽指令數(shù)據(jù)定義偽指令格式:段名 SEGMENT 定位類(lèi)型 組合類(lèi)型 類(lèi)別名 段名 ENDS功能:用來(lái)把程序分成若干邏輯段,實(shí)現(xiàn)存儲(chǔ)器的分段管理,在匯編和連接程序時(shí),控制不同段的定位,組合和連接,以便形成一個(gè)可執(zhí)行程序。5.3.3 5.3.3 段定義偽指
6、段定義偽指 段尋址偽指令用來(lái)告訴匯編程序當(dāng)前使用的各個(gè)段的段地址將要存放在哪個(gè)段寄存器中。格式:ASSUME段寄存器名:段名,段寄存器 名:段名功能:設(shè)置或撤消在SEGMENTENDS偽指令中 定義過(guò)的段名所使用的段寄存器。5.3.4 5.3.4 段尋址偽指令段尋址偽指令格式:過(guò)程名 PROC NEARFAR RET 過(guò)程名 ENDP功能:定義一個(gè)過(guò)程,并指明過(guò)程名和過(guò)程的屬性。過(guò)程名實(shí)際上是過(guò)程入口的符號(hào)地址,PROC和 ENDP前的過(guò)程名必須相同,它們之間的部分是過(guò)程體。過(guò)程的類(lèi)型可以是NEAR,表示所定義的過(guò)程是一個(gè)近過(guò)程。過(guò)程類(lèi)型為FAR表示是一個(gè)遠(yuǎn)過(guò)程,5.3.5 5.3.5 過(guò)程定
7、義偽指令過(guò)程定義偽指令一般說(shuō)來(lái),編制一個(gè)匯編程序的步驟如下:(1)分析題意,確定算法。(2)根據(jù)算法畫(huà)出程序框圖。(3)根據(jù)框圖編寫(xiě)程序。(4)上機(jī)調(diào)試程序。程序有順序、循環(huán)、分支和子程序四種結(jié)構(gòu)形式。順序程序結(jié)構(gòu)是指完全按順序逐條執(zhí)行的指令序列,這在程序段中是大量存在的,但作為完整的程序則很少見(jiàn)。5.4 程序設(shè)計(jì)舉例 1分支程序的結(jié)構(gòu)形式 分支程序結(jié)構(gòu)可以有兩種形式,如圖所示。判定條件判定條件NY 判定條件判定條件(a)IF_THEN_ELSE(b)CASE 分支程序的結(jié)構(gòu)形式圖5.4 程序設(shè)計(jì)舉例 2分支程序設(shè)計(jì)方法 程序的分支一般用條件轉(zhuǎn)移指令來(lái)產(chǎn)生,下面一些例子來(lái)分析分支程序的設(shè)計(jì)方法
8、。例5.6 編程求符號(hào)函數(shù),設(shè)x在AL中5.4.1 5.4.1 分支程序設(shè)計(jì)分支程序設(shè)計(jì) 程序:DATASEGMENT ;定義數(shù)據(jù)段XXDB10YYDB?DATAENDSCODE SEGMENT ;定義代碼段 ASSUME CS:CODE,DS:DATASTART PROC FARBEGIN:PUSH DS ;DS:00 壓棧 MOVAX,0PUSH AXMOVAX,DATAMOVDS,AX;置數(shù)據(jù)段MOVAL,XX;AL=XXCMPAL,0;AL與0比較JGEBIGR;大于,等于轉(zhuǎn)BIGRMOVAL,0FFH;AL=-1JMPEQUT;轉(zhuǎn)EQUTBIGR:JEEQUT ;等于0,轉(zhuǎn)EQUTM
9、OVAL,01;AL=1EQUT:MOVYY,AL;符號(hào)函數(shù)的結(jié)果存入YY單元RETSTART ENDPCODE ENDSENDBEGIN 1循環(huán)程序的結(jié)構(gòu)形式 循環(huán)程序可以有兩種結(jié)構(gòu)形式,如圖所示。循環(huán)初始狀態(tài)循環(huán)控制條件循環(huán)體NY N循環(huán)控制條件循環(huán)初始狀態(tài)循環(huán)體Y(1)Do While結(jié)構(gòu)(2)Do UNTIL結(jié)構(gòu)5.4.2 5.4.2 循環(huán)程序設(shè)計(jì)循環(huán)程序設(shè)計(jì)2循環(huán)程序設(shè)計(jì)方法例5.10 求S=1+2+3+100程序:DATA SEGMENT ;定義數(shù)據(jù)段MAX DW 100SUM DW?DATA ENDSSTACK SEGMENT PARA STACK;定義堆棧段 DW 20H DU
10、P(?)STACK ENDS5.4.2 5.4.2 循環(huán)程序設(shè)計(jì)循環(huán)程序設(shè)計(jì)CODE SEGMENT ;定義代碼段START PROC FAR ASSUME CS:CODE,DS:DATA,SS:STACKBEGIN:PUSH DS ;DS壓棧 MOVAX,0 PUSH AX ;00壓棧 MOV AX,DATA MOV DS,AX ;置數(shù)據(jù)段 MOV AX,0 ;累加器清0 MOVCX,MAX ;循環(huán)控制CX=MAX MOVBX,1;初始加數(shù)用1AGAIN:ADDAX,BX ;累加求和 INCBX;下一個(gè)數(shù) LOOP AGAIN;循環(huán)轉(zhuǎn)AGAIN MOVSUM,AX;求和結(jié)果存SUM中 RET
11、 START ENDPCODE ENDSEND BEGIN 例5.10 求 N!程序:DATASEGMENT;定義數(shù)據(jù)段NDW 5YYDW?DATAENDSSTACKSEGMENT PARA STACK;定義堆棧段 DW50H DUP (?)STACKENDSCODE SEGMENT;定義代碼段START PROC FAR ASSUME CS:CODE,DS:DATA,SS:STACKBEGIN:PUSH DS;DS壓棧 MOV AX,0 PUSH AX;00壓棧 MOV AX,DATA MOV DS,AX ;置數(shù)據(jù)段 MOV AX,N;AX=N CMP AX,0 ;比較是否為0 JNE NO
12、Z ;非0轉(zhuǎn)NOZ INCAX;0則AX=1 JMPEXIT ;轉(zhuǎn)EXITNOZ:MOV BX,AX ;BX=AX=N MOV AX,1 ;累積AX=1AGAIN:MULBX ;相乘AX*BX-AX DEC BX;BX減1 JNEAGAIN;非0繼續(xù)EXIT:MOV YY,AX ;保存N!結(jié)果到Y(jié)Y中 RET START ENDPCODE ENDS END BEGIN 子程序又稱(chēng)為過(guò)程,它相當(dāng)于高級(jí)語(yǔ)言中的過(guò)程和函數(shù)。在一個(gè)程序的不同部分,往往用功能和結(jié)構(gòu)形式都相同的程序段,只是某些變量的賦值不同,此時(shí)就可以把這些程序段寫(xiě)成子程序形式,在需要時(shí)可以調(diào)用它。在匯編語(yǔ)言程序中,子程序定義的偽指令是
13、PROC和ENDP,子程序有NEAR和FAR屬性調(diào)用子程序和從子程序返回的指令是CALL和RET5.4.3 子程序結(jié)構(gòu) 子程序設(shè)計(jì)中,應(yīng)注意幾點(diǎn):子程序設(shè)計(jì)中,應(yīng)注意幾點(diǎn):現(xiàn)場(chǎng)保護(hù)和恢復(fù)子程序的嵌套和遞歸調(diào)用參數(shù)傳遞編寫(xiě)子程序調(diào)用方法說(shuō)明 5.4.3 子程序結(jié)構(gòu) 程序要求從鍵盤(pán)取得一個(gè)十進(jìn)制數(shù),然后把該數(shù)以十六進(jìn)制形式在屏幕上顯示出來(lái)。采用一個(gè)子程序DECIBIN實(shí)現(xiàn)從鍵盤(pán)取得十進(jìn)制數(shù)并把它轉(zhuǎn)換為二進(jìn)制數(shù);另一個(gè)子程序BINIHEX把此二進(jìn)制數(shù)以十六進(jìn)制數(shù)的形式在屏幕上顯示出來(lái)。為避免屏幕上的重疊,另外用CRLF子程序取得回車(chē)和換行效果。整個(gè)程序結(jié)構(gòu)如圖所示。各個(gè)子程序之間用BX寄存器來(lái)傳送信
14、息。在過(guò)程DECIBIN中取得的輸入數(shù)據(jù)轉(zhuǎn)換為二進(jìn)制數(shù)后保存在BX寄存器中,而過(guò)程BINIHEX需要把BX寄存器中的數(shù)用十六進(jìn)制形式顯示出來(lái)。例5.17 編寫(xiě)十進(jìn)制到十六進(jìn)制數(shù)轉(zhuǎn)換程序。開(kāi)始調(diào)用DECIBIN調(diào)用CRLF調(diào)用BINIHEX調(diào)用CRLF結(jié) 束從鍵盤(pán)取得十進(jìn)制數(shù),保存在BX中顯示回車(chē)和換行用十六進(jìn)制數(shù)形式表達(dá)顯示BX中的數(shù)十進(jìn)制到十六進(jìn)制數(shù)轉(zhuǎn)換的程序結(jié)構(gòu)圖程序:DECIHEX SEGMENT;定義代碼段ASSUME CS:DECIHEXMAIN PROC FAR;主程序REPEAT:CALL DECIBIN;調(diào)用子程序輸入十進(jìn)制數(shù) CALL CRLF;顯示回車(chē)、換行 CALL BI
15、NIHEX;以十六進(jìn)制數(shù)輸出 CALL CRLF ;顯示回車(chē)、換行 JMP REPEAT;轉(zhuǎn)REPEAT,繼續(xù)MAIN ENDPDECIBIN PROC NEAR;十進(jìn)制數(shù)輸入子程序 MOV BX,0;BX保存輸入數(shù)NEWCHAR:MOV AH,1 INT 21H;調(diào)用DOS功能輸入字符 SUB AL,30H;轉(zhuǎn)為數(shù)0-9 JL EXIT;小于0,不是數(shù)字 CMP AL,9D;與9比較 JG EXIT;大于,不是數(shù)字 CBW;AL=AX XCHG AX,BX;AX、BX互換 MOV CX,10D ;CX=10 MUL CX ;AX=AX*CX XCHG AX,BX ;AX、BX互換 ADD B
16、X,AX ;BX為前面輸入的結(jié)果 JMP NEWCHAREXIT:RET DECIBIN ENDP BINIHEX PROC NEAR MOV CH,4 ;CH循環(huán)次數(shù)ROTATE:MOV CL,4 ;每次循環(huán)輸出一位十六 進(jìn)制數(shù) ROL BX,CL ;即移位4個(gè)二進(jìn)制位 MOV AL,BL ;AL=BL AND AL,0FH ;取低4位 ADD AL,30H ;轉(zhuǎn)變?yōu)锳SCII碼 CMP AL,3AH ;是否為0-9 JL PRINTIT ;是轉(zhuǎn)PRINTIT ADD AL,7H ;否轉(zhuǎn)為A-FPRINTIT:MOV DL,AL ;DL=輸出字符 MOV AH,2 INT 21H ;調(diào)用DOS中斷,顯示字符 DEC CH JNZ ROTATE ;沒(méi)循環(huán)結(jié)束,繼續(xù) RET ;返回BINIHEX ENDPCRLF PROC NEAR ;輸出回車(chē)、換行 MOV DL,0DH MOV AH,2 INT 21H ;輸出回車(chē) MOV DL,0AH MOV AH,2 INT 21H ;輸出換行 RETCRLF ENDPDECIHEX ENDS END MAIN 本章完本章完謝謝大家謝謝大家