《微型計算機系統(tǒng) (5)》由會員分享,可在線閱讀,更多相關(guān)《微型計算機系統(tǒng) (5)(36頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、第第 5 5 章章匯編語言程序設(shè)計 第第5 5章章 匯編語言程序設(shè)計匯編語言程序設(shè)計 本章重點本章重點:結(jié)合實例理解匯編語言程序設(shè)計的基本步驟;掌握匯編語言程序設(shè)計的基本方法;熟練運用循環(huán)、分支和子程序的程序設(shè)計方法解決問題。本章難點:本章難點:依據(jù)所要解決的問題,選擇正確的程序設(shè)計方法,正確地運用指令編寫實用的匯編原程序。匯編語言是一種用助記符來表示指令的操作碼和操作數(shù),用標號和符號來代替地址、常量和變量的符號語言。用匯編語言編寫的程序不能由機器直接執(zhí)行,而必須翻譯成由機器代碼組成的目標程序,這個翻譯過程稱為匯編。5.1 概述 用來把匯編語言編寫的程序自動翻譯成目標程序的軟件叫匯編程序。匯編
2、程序的建立及匯編過程如圖所示。編輯程序編輯程序匯編程序匯編程序連接程序連接程序EXP.ASMEXP.OBJEXP.EXE 8086的匯編語言的源程序是分段的,由若干個段形成一個源程序。源程序的一般格式為:NAME1 SEGMENT語句語句NAME1 ENDSNAME2 SEGMENT語句 語句 NAME2 ENDSEND 5.1 概述 每一個段有一個名字,以符號SEGMENT作為段的開始,以語句ENDS作為段的結(jié)束。這兩者都必須有名字,而且名字必須相同。由若干個段組成一個源程序,整個源程序以語句END作為結(jié)束。5.1 概述 總之,8086的源程序是由若干段組成的,而一個段又是由若干個語句行組成
3、的。所以,語句行是匯編源程序的基礎(chǔ)。8086匯編的一個語句行也是由4個部分組成的,即 標號 操作碼 操作數(shù) ;注釋 各部分之間至少要用一個空格作為間隔。5.1 概述 語句行是由標記及分隔符按照一定規(guī)則組織起來的,標記是匯編語言源程序的最小的、具有意義的單位,如標識符、保留字、界符、常數(shù)和注釋,所有這些都稱為標記。在8086匯編語言中,有數(shù)值表達式和地址表達式兩種,由各種常量與運算符連接成的式子,稱為數(shù)值表達式。將常量、變量、標號、寄存器內(nèi)容和運算符、操作符組合成的有意義的式子,稱為地址表達式。單個常量,變量、標號是表達式的最簡形式。在匯編過程中,匯編程序按操作運算符約定的優(yōu)先規(guī)則對表達式進行計
4、算,得到一個數(shù)值或一個地址。5.2 語句行構(gòu)成 偽指令用來指示匯編程序應(yīng)該如何去處理匯編語言的源程序。它們在匯編時被解釋執(zhí)行,除了部分語句可以申請存儲空間以外,不產(chǎn)生任何目標代碼。5.3 偽指令 2等號語句 格式:符號名=表達式 功能:把表達式的值賦值給符號名,等號語句與等值語句具有相同的功能。5.3.1 5.3.1 符號定義偽指令符號定義偽指令1等值語句 格式:符號名 EQU 表達式 功能:用一個符號名來代替表達式,使該符號名與表達式同義。格式:變量名 數(shù)據(jù)定義符 操作數(shù),操作數(shù),功能:方括號中的變量名為可選項。操作數(shù)可以不止一個,多個操作數(shù)時用逗號分開。數(shù)據(jù)定義符號是DB、DW、DD、DQ
5、、DT。DB定義字節(jié)類型變量,DW定義字類型變量,DD定義雙字類型變量,DQ定義四字類型變量,DT定義十字節(jié)類型變量。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 定位類型 組合類型 類別名 段名 ENDS功能:用來把程序分成若干邏輯段,實現(xiàn)存儲器的分段管理,在匯編和連接程序時,控制不同段的定位,組合和連接,以便形成一個可執(zhí)行程序。5.3.3 5.3.3 段定義偽指
6、段定義偽指 段尋址偽指令用來告訴匯編程序當前使用的各個段的段地址將要存放在哪個段寄存器中。格式:ASSUME段寄存器名:段名,段寄存器 名:段名功能:設(shè)置或撤消在SEGMENTENDS偽指令中 定義過的段名所使用的段寄存器。5.3.4 5.3.4 段尋址偽指令段尋址偽指令格式:過程名 PROC NEARFAR RET 過程名 ENDP功能:定義一個過程,并指明過程名和過程的屬性。過程名實際上是過程入口的符號地址,PROC和 ENDP前的過程名必須相同,它們之間的部分是過程體。過程的類型可以是NEAR,表示所定義的過程是一個近過程。過程類型為FAR表示是一個遠過程,5.3.5 5.3.5 過程定
7、義偽指令過程定義偽指令一般說來,編制一個匯編程序的步驟如下:(1)分析題意,確定算法。(2)根據(jù)算法畫出程序框圖。(3)根據(jù)框圖編寫程序。(4)上機調(diào)試程序。程序有順序、循環(huán)、分支和子程序四種結(jié)構(gòu)形式。順序程序結(jié)構(gòu)是指完全按順序逐條執(zhí)行的指令序列,這在程序段中是大量存在的,但作為完整的程序則很少見。5.4 程序設(shè)計舉例 1分支程序的結(jié)構(gòu)形式 分支程序結(jié)構(gòu)可以有兩種形式,如圖所示。判定條件判定條件NY 判定條件判定條件(a)IF_THEN_ELSE(b)CASE 分支程序的結(jié)構(gòu)形式圖5.4 程序設(shè)計舉例 2分支程序設(shè)計方法 程序的分支一般用條件轉(zhuǎn)移指令來產(chǎn)生,下面一些例子來分析分支程序的設(shè)計方法
8、。例5.6 編程求符號函數(shù),設(shè)x在AL中5.4.1 5.4.1 分支程序設(shè)計分支程序設(shè)計 程序: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;符號函數(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è)計循環(huán)程序設(shè)計2循環(huán)程序設(shè)計方法例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è)計循環(huán)程序設(shè)計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;下一個數(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 子程序又稱為過程,它相當于高級語言中的過程和函數(shù)。在一個程序的不同部分,往往用功能和結(jié)構(gòu)形式都相同的程序段,只是某些變量的賦值不同,此時就可以把這些程序段寫成子程序形式,在需要時可以調(diào)用它。在匯編語言程序中,子程序定義的偽指令是
13、PROC和ENDP,子程序有NEAR和FAR屬性調(diào)用子程序和從子程序返回的指令是CALL和RET5.4.3 子程序結(jié)構(gòu) 子程序設(shè)計中,應(yīng)注意幾點:子程序設(shè)計中,應(yīng)注意幾點:現(xiàn)場保護和恢復子程序的嵌套和遞歸調(diào)用參數(shù)傳遞編寫子程序調(diào)用方法說明 5.4.3 子程序結(jié)構(gòu) 程序要求從鍵盤取得一個十進制數(shù),然后把該數(shù)以十六進制形式在屏幕上顯示出來。采用一個子程序DECIBIN實現(xiàn)從鍵盤取得十進制數(shù)并把它轉(zhuǎn)換為二進制數(shù);另一個子程序BINIHEX把此二進制數(shù)以十六進制數(shù)的形式在屏幕上顯示出來。為避免屏幕上的重疊,另外用CRLF子程序取得回車和換行效果。整個程序結(jié)構(gòu)如圖所示。各個子程序之間用BX寄存器來傳送信
14、息。在過程DECIBIN中取得的輸入數(shù)據(jù)轉(zhuǎn)換為二進制數(shù)后保存在BX寄存器中,而過程BINIHEX需要把BX寄存器中的數(shù)用十六進制形式顯示出來。例5.17 編寫十進制到十六進制數(shù)轉(zhuǎn)換程序。開始調(diào)用DECIBIN調(diào)用CRLF調(diào)用BINIHEX調(diào)用CRLF結(jié) 束從鍵盤取得十進制數(shù),保存在BX中顯示回車和換行用十六進制數(shù)形式表達顯示BX中的數(shù)十進制到十六進制數(shù)轉(zhuǎn)換的程序結(jié)構(gòu)圖程序:DECIHEX SEGMENT;定義代碼段ASSUME CS:DECIHEXMAIN PROC FAR;主程序REPEAT:CALL DECIBIN;調(diào)用子程序輸入十進制數(shù) CALL CRLF;顯示回車、換行 CALL BI
15、NIHEX;以十六進制數(shù)輸出 CALL CRLF ;顯示回車、換行 JMP REPEAT;轉(zhuǎn)REPEAT,繼續(xù)MAIN ENDPDECIBIN PROC NEAR;十進制數(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)輸出一位十六 進制數(shù) ROL BX,CL ;即移位4個二進制位 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 ;沒循環(huán)結(jié)束,繼續(xù) RET ;返回BINIHEX ENDPCRLF PROC NEAR ;輸出回車、換行 MOV DL,0DH MOV AH,2 INT 21H ;輸出回車 MOV DL,0AH MOV AH,2 INT 21H ;輸出換行 RETCRLF ENDPDECIHEX ENDS END MAIN 本章完本章完謝謝大家謝謝大家