版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、1,2.4匯編語言程序設(shè)計(jì),分析問題:通過詳細(xì)的了解和分析,將一個(gè)實(shí)際問題轉(zhuǎn)化為一個(gè)計(jì)算機(jī)可以處理的問題。 確定算法:抽象出描述問題的數(shù)學(xué)模型,并確定實(shí)現(xiàn)數(shù)學(xué)模型的算法. 算法就是計(jì)算機(jī)能夠?qū)崿F(xiàn)的操作方法和操作步驟。 算法的流程圖描述法:流程圖中較為通用的幾種符號(hào):,2.4.1基本步驟,起始框:,執(zhí)行框:,判斷框:,連接符,2,起始和終止框是表示程序開始和結(jié)束的符號(hào),它總是在一個(gè)流程圖的開頭或結(jié)尾處; 執(zhí)行框用來表示須完成的某項(xiàng)功能,它可以是一條指令或一段程序,但是無論哪種情況,該框只能有一個(gè)入口和一個(gè)出口; 判斷框是用來表示程序在此處要根據(jù)不同情況形成分支,框內(nèi)需寫明比較的條件,此框有一個(gè)入
2、口,兩個(gè)出口; 連接符是用來連接兩個(gè)流程框圖的符號(hào),圓形符號(hào)內(nèi)可寫入標(biāo)識(shí)符,不同流程框圖中連接符中的標(biāo)識(shí)符相同的各點(diǎn)將連接在一起,2.4匯編語言程序設(shè)計(jì),2.4.1基本步驟,3,編寫程序 采用匯編語言編寫程序應(yīng)注意以下幾個(gè)問題: 必須詳細(xì)了解所用CPU的編程模型、指令系統(tǒng)、尋址方式及有關(guān)偽指令; 必須進(jìn)行存儲(chǔ)空間和工作單元的合理分配; 多次使用的程序段可采用子程序或宏指令; 盡可能用標(biāo)號(hào)或變量來代替絕對(duì)地址和常數(shù)。,2.4匯編語言程序設(shè)計(jì),2.4.1基本步驟,4,程序檢驗(yàn) 程序編好以后,必須經(jīng)過書面檢查和上機(jī)調(diào)試,以便說明程序是否正確。檢驗(yàn)時(shí),應(yīng)預(yù)先選擇典型數(shù)據(jù),檢查是否可以得到預(yù)期結(jié)果。 編
3、寫文檔 一個(gè)完整的軟件必須有相應(yīng)的說明文件,這不僅便于用戶使用,也便于對(duì)程序的維護(hù)和擴(kuò)充。說明文件主要包括程序的功能和使用方法,程序的基本結(jié)構(gòu)和所采用的主要算法以及程序的必要說明和注意事項(xiàng)等。,2.4匯編語言程序設(shè)計(jì),2.4.1基本步驟,5,按照指令執(zhí)行的順序,程序的結(jié)構(gòu)可以劃分成以下三種。 順序結(jié)構(gòu):程序按照它編寫的順序執(zhí)行,每條指令只執(zhí)行一 次,這樣的程序稱為“順序結(jié)構(gòu)”的程序。 循環(huán)結(jié)構(gòu):一組指令被反復(fù)地執(zhí)行,這樣的程序稱為“循環(huán)結(jié) 構(gòu)”或者“重復(fù)結(jié)構(gòu)”的程序。 選擇結(jié)構(gòu):根據(jù)某個(gè)條件,一部分指令被執(zhí)行,另一部分指 令沒有被執(zhí)行,這樣的程序稱為“選擇結(jié)構(gòu)”或者 “分支結(jié)構(gòu)”的程序。 一個(gè)
4、實(shí)際運(yùn)行的程序,常常是由以上三種結(jié)構(gòu)的程序組合而成的, 上面的三種結(jié)構(gòu)稱為程序的“基本結(jié)構(gòu)”。使用這三種基本結(jié)構(gòu),可 以編寫出任何所需要的程序。,2.4匯編語言程序設(shè)計(jì),6,2.4匯編語言程序設(shè)計(jì),2.4.2順序程序,例2-4-2-1 將存儲(chǔ)器中的二個(gè)字節(jié)相加,結(jié)果(和)送到另一個(gè)存儲(chǔ)器單元中。 此題的算法及思路是: 1、先將一個(gè)字節(jié)數(shù)據(jù)從存儲(chǔ)單元送入累加器; 2、然后再把累加器的內(nèi)容與第二個(gè)存儲(chǔ)單元的數(shù)據(jù)相加(和不超過一個(gè)字節(jié)); 3、將結(jié)果(和)再從累加器送回存儲(chǔ)器存放結(jié)果的單元中。,7,2.4匯編語言程序設(shè)計(jì),2.4.2順序程序,DATA SEGMENT BUFFER1 DB 47H,6
5、AH SUM1 DB ? DATA ENDS STAK SEGMENT PARA STACK STACK DB 10 DUP(0) TOP LABEL WORD STAK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STAK START:MOV AX,DATA MOV DS,AX MOV AX, STAK MOV SS,AX MOV SP OFFSET TOP MOV AH,BUFFER1 ADD AH,BUFFER1+1 ;兩數(shù)據(jù)相加 MOV SUM1,AH ;存放結(jié)果 MOV AH,00H;退出程序,返回DOS INT 21H CODE ENDS
6、 END START,8,2.4匯編語言程序設(shè)計(jì),2.4.2順序程序,例2-4-2-2將一字節(jié)壓縮BCD碼轉(zhuǎn)換為兩個(gè)ASCII 1、首先將一字節(jié)壓縮BCD碼從BCDBUF中取入寄存器; 2、然后將此二位BCD碼一分為二拆開,形成二位非壓縮的BCD碼(并使它們的高四位都置0);3、然后都加以30H,形成二個(gè)ASCII碼; 4、再按先高后低的次序存入ASCBUF符號(hào)地址的連續(xù)二個(gè)單元中(此次序正好滿足將來輸出顯示和打印的次序),程序流程圖如圖所示:,9,2.4匯編語言程序設(shè)計(jì),2.4.2順序程序,DATA SEGMENT BCDBUF DB 96H ASCBUF DB 2 DUP(?) DATA
7、ENDS STAK SEGMENT PARA STACK STACK DB 10 DUP(0) TOP LABEL WORD STAK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STAK START: MOV AX,DATA MOV DS,AX MOV AX, STAK MOV SS,AX MOV SP OFFSET TOP MOV AL,BCDBUF ;AL(BCD BUF) MOV BL,AL ;BL(BCD BUF) MOV CL,4 SHR AL,CL ;BCD碼中高位移入低位,高位補(bǔ)0 ADD AL,30H ;形成BCD高位的ASCII碼
8、。 MOV ASCBUF,AL ;送入ASC BUF單元中 AND BL,0FH ;取BCD碼低位,高位補(bǔ)0 ADD BL,30H ;形成BCD低位的ASCII碼。 MOV ASCBUF+1,BL;送入ASC BUF+1單元中。 MOV AH,00H;退出程序,返回DOS INT 21H CODE ENDS END START,10,分支程序結(jié)構(gòu) 分支程序概念:計(jì)算機(jī)在完成某種運(yùn)算或某個(gè)過程的控制時(shí),經(jīng)常需要根據(jù)不同的情況(條件)實(shí)現(xiàn)不同的功能,這就要求在程序的執(zhí)行過程中能夠進(jìn)行某種條件的判定,并根據(jù)判定結(jié)果決定程序的流向,這就是分支程序 。 分支程序分類:分為二分支結(jié)構(gòu)和多分枝結(jié)構(gòu) 二分支結(jié)
9、構(gòu)只進(jìn)行二中選一的判定,程序中只出現(xiàn)一個(gè)分支; 多分枝結(jié)構(gòu)是進(jìn)行多選一。,2.4匯編語言程序設(shè)計(jì),2.4.3分支程序,11,2.4匯編語言程序設(shè)計(jì),二分支結(jié)構(gòu)只進(jìn)行二中選一的判定,程序中只出現(xiàn)一個(gè)分支;其流程圖如下:,2.4.3分支程序,12,2.4匯編語言程序設(shè)計(jì),多分枝結(jié)構(gòu)是進(jìn)行多選一,其流程圖如下:,2.4.3分支程序,13,2.4匯編語言程序設(shè)計(jì),分支程序設(shè)計(jì) 分支程序設(shè)計(jì)時(shí)必須注意以下幾個(gè)要點(diǎn): 正確選擇判定條件和相應(yīng)的條件轉(zhuǎn)移指令; 在編程時(shí)必須保證每條分支都能有完整的結(jié)果; 在檢查和調(diào)試時(shí)必須逐條分支進(jìn)行,因?yàn)橐粭l或其中幾條分支正確還不足以說明整個(gè)程序正確。,2.4.3分支程序,
10、14,2.4匯編語言程序設(shè)計(jì),分支程序設(shè)計(jì) 計(jì)算AX |AX| 的兩種判斷方法:,2.4.3分支程序,15,2.4匯編語言程序設(shè)計(jì),分支程序設(shè)計(jì) 例2 4-3-1 求X的絕對(duì)值,并送回原處。 分析:按題義要求,運(yùn)算結(jié)果X的值與原給出的X值關(guān)系如下:,2.4.3分支程序,16,2.4匯編語言程序設(shè)計(jì),2.4.3分支程序,DATA SEGMENT ;定義數(shù)據(jù)段 XADR DW 3456H , 8192H ;定義數(shù)據(jù)X N EQU 2 DATA ENDS STAK SEGMENT STACK STACK DB 10 DUP(0) TOP LABEL WORD STAK ENDS CODE SEGME
11、NT ;定義代碼段 ASSUME CS:CODE, DS:DATA,SS:STAK START: MOV AX, DATA MOV DS, AX MOV AX, STAK MOV SS,AX MOV SP , OFFSET TOP LEA BX, XADR MOV CX, N LOP1: MOV AX, BX ;取數(shù)據(jù)X AND AX, AX JNS DONE ;非負(fù)數(shù)則轉(zhuǎn) NEG AX ;否則,取負(fù) MOV BX, AX DONE: INC BX INC BX LOOP LOP1 MOV AH, 4CH ;退出 INT 21H CODE ENDS ENDSTART,17,例2-4-3-2 在
12、某串中查找某個(gè)特定字符,找到顯示Y,未找到顯示N。,DATASEGMENT STRING DB How are you!,welcome to China! N EQU STRING DATAENDS CODESEGMENT ASSUME CS:CODE,ES:DATA START:MOVAX,DATA;置ES段初值 MOV ES,AX LEA DI,STRING MOV CX,N CLD,18,MOV AH,1 INT 21H;從鍵盤輸入待查字符 REPNE SCASB JZ FOUND;轉(zhuǎn)到找到分支 MOVDL,N;未找到處理,顯示N JMP DISP;轉(zhuǎn)到后續(xù)公共位置處 FOUND:MO
13、V DL,Y;找到顯示Y DISP: MOV AH,2 INT 21H MOV AH,4CH;返回DOS INT 21H CODEENDS ENDSTART,19,2.4匯編語言程序設(shè)計(jì),分支程序設(shè)計(jì) 例2 4-3-3 將4位二進(jìn)制轉(zhuǎn)換成對(duì)應(yīng)的十六進(jìn)制字符 本題要求將0000轉(zhuǎn)換成0,0001轉(zhuǎn)換成1,1010轉(zhuǎn)換成A,.1111 轉(zhuǎn)換成F。二進(jìn)制數(shù)X和十六進(jìn)制字符Y之間的轉(zhuǎn)換實(shí)際上是計(jì)算分 段函數(shù)。,2.4.3分支程序,MOVAL, X CMPAL, 9 JAALPH ADDAL, 30H JMPDONE ALPH: ADDAL, 37H DONE: MOVY, AL,0、1、2、3.9的A
14、SCII為:30、31、32、3339 A、B、C.F的ASCII為:41、42、4346,MOVAL, X ORAL, 30H CMPAL, 9 JBEDONE ADDAL, 7 DONE: MOVY, AL,20,例2-4-3-4 從鍵盤輸入一位十六進(jìn)制數(shù),將其轉(zhuǎn)換為數(shù)值。,在選擇結(jié)構(gòu)程序里,如果可供選擇的程序塊多于兩個(gè),這樣的結(jié)構(gòu)稱為多分支選擇結(jié)構(gòu),如下圖 (b)是匯編語言程序的實(shí)現(xiàn)方法。,21,例2-4-3-4 從鍵盤輸入一位十六進(jìn)制數(shù),將其轉(zhuǎn)換為數(shù)值。,CODESEGMENT ASSUME CS:CODE AGAIN:MOV AH,l INT 21H CMP AL,0 JB AGAI
15、N CMP AL,9 JBE BET0_9 CMP AL,A JB AGAIN,CMPAL,F(xiàn) JBE BETA_F JMP AGAIN BET0_9:SUBAL,30H JMP EXIT BETA_F :SUB AL,37H ;AL中存放轉(zhuǎn)化后 ; 的結(jié)果 EXIT:MOV AH,4CH INT21H CODEENDS END AGAIN,22,2.4.3分支程序,例2-4-3-5從鍵盤上輸入數(shù)字“1”到“3”,根據(jù)輸入選擇對(duì)應(yīng)程序塊執(zhí)行。,DATASEGMENT PROMPTDB0DH, 0AH, “Input a number (13): $” MSG1 DB0DH, 0AH, “FUN
16、CTION 1 EXECUTED . $” MSG2 DB0DH, 0AH, “FUNCTION 2 EXECUTED . $” MSG3 DB0DH, 0AH, “FUNCTION 3 EXECUTED . $” DATAENDS CODESEGMENT ASSUMECS: CODE, DS: DATA START:MOVAX, DATA MOVDS, AX INPUT:LEADX, PROMPT MOVAH, 9 INT21H;輸出提示信息 MOVAH, 1 INT21H;從鍵盤上輸入一個(gè)數(shù)字(字符ASCII ) CMPAL, 1 JBINPUT;“0”或非數(shù)字,重新輸入 JEF1,23,
17、CMPAL, 2 JEF2;數(shù)字“2”,轉(zhuǎn)F2 CMPAL, 3 JEF3;數(shù)字“3”,轉(zhuǎn)F3 JMPINPUT;大于“3”,重新輸入 F1:LEADX, MSG1;F1程序塊 JMPOUTPUT F2:LEADX, MSG2;F2程序塊 JMPOUTPUT F3:LEADX, MSG3;F3程序塊 OUTPUT: MOVAH, 9 INT21H MOVAX, 4C00H INT21H CODEENDS ENDSTART,例2-4-3-5從鍵盤上輸入數(shù)字“1”到“3”,根據(jù)輸入選擇對(duì)應(yīng)程序塊執(zhí)行。,24,2.4匯編語言程序設(shè)計(jì),循環(huán)程序的基本結(jié)構(gòu),2.4.4循環(huán)程序,循環(huán)準(zhǔn)備部分:這是為循環(huán)做
18、準(zhǔn)備的,它不在循環(huán)體內(nèi)。 循環(huán)工作部分:這部分是循環(huán)程序解題所需的核心程序。這部分程序可以很簡單,也可以很復(fù)雜,甚至包括循環(huán)結(jié)構(gòu)。 調(diào)整部分:這部分主要用來更新某些數(shù)據(jù),以保證每次循環(huán)所完成的功能不是完全重復(fù)的。此外,調(diào)整部分還必須修正循環(huán)控制的參數(shù)。為實(shí)現(xiàn)正常循環(huán),調(diào)整部分是不可缺少的。因此,在進(jìn)行循環(huán)程序設(shè)計(jì)時(shí),就必須預(yù)先考慮哪些參數(shù)是需要在循環(huán)過程中加以調(diào)整的。若需調(diào)整參數(shù)為地址,應(yīng)將起始地址放在基址或變址寄存器中,采用寄存器間接尋址方式。 循環(huán)出口判定:循環(huán)程序中至少要有一個(gè)出口判定,以保證循環(huán)程序正常結(jié)束。,25,2.4匯編語言程序設(shè)計(jì),例24-4-1 編制計(jì)算SUM=A1+A2+A
19、3+A4+A5+A6+A7+A8+A9+A10。 已知A1、A2、A3、A4、A5、A6、A7、A8、A9、A10連續(xù)存 放在以BUFFER為首址的數(shù)據(jù)區(qū)中,每個(gè)數(shù)據(jù)占一個(gè)字節(jié),和 SUM不超過一個(gè)字節(jié)。 分析:這個(gè)求和問題的程序設(shè)計(jì)并不困難,可以用我們學(xué)過的順 序結(jié)構(gòu)方法來編程,但是10 次加法運(yùn)算指令完全相同,重復(fù)10 次。用順序編寫就比較麻煩了,并且占用大量的時(shí)間和存儲(chǔ)空 間。所以我們采用循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)。注意兩個(gè)問題: 1、必須要設(shè)置控制計(jì)算機(jī)重復(fù)執(zhí)行某公共程序段的指令。 2、必須要對(duì)循環(huán)參數(shù)進(jìn)行修改,以便使相同指令的公共程序段能完成不同參數(shù)的操作處理。,2.4.4循環(huán)程序,26,2
20、.4匯編語言程序設(shè)計(jì),例24-4-1 下面我們畫出程序流程圖,并根據(jù)流程圖編寫程序。,2.4.4循環(huán)程序,DATA SEGMENT BUFFER DB 0,2,3,14,5,16,7,8,19,10 SUM DB ? DATA ENDS STAK SEGMENT PARA STACK STACK DB 10 DUP(0) STAK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STAK START:MOV AX,DATA MOV DS,AX MOV AX, STAK MOV SS,AX MOV AL,0 ;AL清0 MOV DI,OFFSET SUM
21、;DI存放結(jié)果地址 MOV BX,OFFSET BUFFER;BX操作數(shù)地址 MOV CX,10 ;CX循環(huán)次數(shù) ;是循環(huán)準(zhǔn)備部分 LOP: ADD AL,BX ; 循環(huán)工作部分 INC BX ;修改操作數(shù)地址. DEC CX ;循環(huán)計(jì)數(shù)控制 JNZ LOP ;循環(huán)判斷部分 MOV DI,AL ;存放結(jié)果(和). MOV AH,00H ;退出程序,返回DOS INT 21H CODE ENDS END START,27,2.4匯編語言程序設(shè)計(jì),例2 4-4-2 將ASCII碼表示的5位十進(jìn)制數(shù)轉(zhuǎn)換成兩字節(jié)二進(jìn)制數(shù)。 分析:設(shè)用ASCII碼表示的5位十進(jìn)制數(shù)存放在以ADEC為首地址的數(shù)據(jù)區(qū)中,轉(zhuǎn)
22、換后的兩字節(jié)二進(jìn)制數(shù)存放在同一數(shù)據(jù)段的RESULT字單元中。,2.4.4循環(huán)程序,實(shí)際處理算式: (30H-30H)*10+(31H-30H)*10+(33H-30H)*10+(30H-30H)*10+(38H-30H) = (0*10)+1*10+3*10+0*10+8 = 1*10+13*10+0*10+8 =13*10+0*10+8 =130*10+8 =1308D=051CH=0000010100011100B,28,2.4匯編語言程序設(shè)計(jì),具體轉(zhuǎn)換算法如下: 設(shè)AX為存結(jié)果的寄存器 1、AX AX*10 ;按權(quán)相乘, 2、BX 取一位十進(jìn)制數(shù)的ASCII 3、BX BX-30H;轉(zhuǎn)換
23、成09 4、AX AX+BX;合并結(jié)果 5、重復(fù)14步,直到5位十進(jìn)制數(shù)處理完,2.4.4循環(huán)程序,DATA SEGMENT ADEC DB 30H,31H,33H,30H,38H;定義5位十進(jìn)制數(shù)01308D COUNT EQU $-ADEC RESULT DW ? DATA ENDS STACK SEGMENT PARA STACKSTACK DB 10DUP(?) STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK TRDEC PROC FAR START:MOV AX,DATA MOV DS,AX MOV SI,OFFSET
24、ADEC MOV CX,COUNT XOR AX,AX ;結(jié)果寄存器清0 AGAIN : ADD AX,AX;結(jié)果*2 MOV BX,AX ADD AX,AX ;結(jié)果*4 ADD AX,AX;結(jié)果*8 ADD AX,BX;結(jié)果*10 MOV BH,0 MOV BL,SI;取一位十進(jìn)制數(shù) SUB BX,30H ;轉(zhuǎn)換成09 ADD AX,BX;并入結(jié)果 INC SI ;修改地址 LOOP AGAIN ;如未到5次,則繼續(xù) MOV RESULT ,AX;存放16位二進(jìn)制結(jié)果 RET ;返回 TRDEC ENDP CODE ENDS END START,29,2.4匯編語言程序設(shè)計(jì),多重循環(huán)程序 如
25、果一個(gè)循環(huán)的循環(huán)體內(nèi)包含了另一個(gè)循環(huán),稱這個(gè)循環(huán)為多重環(huán)。 多重結(jié)構(gòu)的循環(huán)程序設(shè)計(jì)的基本方法與單重循環(huán)程序設(shè)計(jì)是一致的,應(yīng)分別考慮各重循環(huán)的控制條件及其程序?qū)崿F(xiàn)。需要特別注意的是,在每次通過外層循環(huán)再次進(jìn)入內(nèi)層循環(huán)時(shí),初始條件必須重新設(shè)置。,2.4.4循環(huán)程序,30,2.4匯編語言程序設(shè)計(jì),2、例24-4-3 在數(shù)據(jù)區(qū)DATBUF中存放著一組數(shù)據(jù),數(shù)據(jù)的個(gè)數(shù)是N,要求對(duì)該數(shù)據(jù)區(qū)中的數(shù)據(jù)按遞增關(guān)系排序。 算法分析: :解決這個(gè)問題通常采用冒泡排序法。從第一個(gè)數(shù)開始依次對(duì)相臨的兩個(gè)數(shù)兩兩進(jìn)行比較,如果次序正確則不做任何操作,否則就將兩個(gè)數(shù)交換位置。這樣,在做了第一遍的N-1次比較后,最大的數(shù)已經(jīng)放
26、在了最后,因此,第二遍比較只需要考慮N-1個(gè)數(shù)的排序,需要做N-2次比較;第三遍需做N-3次比較,總共要進(jìn)行N-1次比較才能完成排序。 假設(shè)有5 個(gè)數(shù): 22,34,56,78,12 22,34,56, 12, 78 22,34, 12 ,56 ,78 22,12, 34, 56 ,78 12, 22, 34, 56 ,78,2.4.4循環(huán)程序,31,2.4匯編語言程序設(shè)計(jì),多重循環(huán)程序 在很多情況下,數(shù)組可能在比較遍數(shù)并未達(dá)到N-1遍就已經(jīng)整序完畢,而程序仍然要繼續(xù)運(yùn)行到N-1遍才能結(jié)束。 為了提高效率,可以設(shè)立一個(gè)交換標(biāo)志位,其初值為1。 在進(jìn)入外循環(huán)后,我們首先判斷交換標(biāo)志位,如果為1,
27、則設(shè)置內(nèi)循環(huán)的初始條件,進(jìn)入內(nèi)循環(huán),在內(nèi)循環(huán)中,如果交換過數(shù)據(jù)次序,則將交換標(biāo)志置1,否則置0;如果為0,說明在內(nèi)循環(huán)過程中,沒有交換數(shù)據(jù)的次序,即數(shù)據(jù)已按要求排序,可以結(jié)束程序。 假設(shè)有5 個(gè)數(shù): 22,34,12,56,78 22,12, 34 ,56 ,78 12,22, 34, 56 ,78,2.4.4循環(huán)程序,32,2.4匯編語言程序設(shè)計(jì),程序流程圖: 假設(shè)有5 個(gè)數(shù):22,34,56,12,78 一、小循環(huán) 1、22與34比較, 2212,交換位置。 22,34,12,56,78 打一標(biāo)志。 4、56與78比較,5678,不交換位置。 二、大循環(huán) 判斷是否有交換標(biāo)志? 1、有:設(shè)置
28、內(nèi)循環(huán)初始條件重新進(jìn)入內(nèi)循環(huán)。 2、無: 說明已排好順序12,22,34,56,78 結(jié)束程序。,2.4.4循環(huán)程序,33,2.4匯編語言程序設(shè)計(jì),2.4.4循環(huán)程序,STAK SEGMENT PARA STACK STACK DB 10 DUP(0) STAK ENDS DATA SEGMENT DATBUF DB 22, 35, 18, 54, 10, 88 ;共N個(gè)數(shù)據(jù),這里給出的是一組隨機(jī)數(shù) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA, SS : STAK START: MOV AX,DATA MOV DS,AX MOV CX,N ;要排
29、序的數(shù)據(jù)個(gè)數(shù)送CX DEC CX ;外循環(huán)計(jì)數(shù)指針,循環(huán)比較N-1遍 MOV BL,1 ;設(shè)置交換標(biāo)志,初值為1 LOOP1: CMP BL,0 JZ DONE ;交換標(biāo)志為0,說明已排序完畢 PUSH CX ;進(jìn)入內(nèi)循環(huán)之前,保存外循環(huán)計(jì)數(shù)值 MOV BL,0 ;設(shè)置進(jìn)入內(nèi)循環(huán)的初始條件 MOV SI,OFFSET DATBUF ;SI指向DATBUF首地址 LOOP2: MOV AL,SI CMP AL,SI+1 ;相臨兩數(shù)比較 JNA NEXT ;不大于則轉(zhuǎn)下一個(gè) XCHG AL,SI+1 ;否則,交換位置 MOV SI,AL MOV BL,1 ;數(shù)據(jù)交換后,交換標(biāo)志置1 NEXT: I
30、NC SI ;修正數(shù)的位置,為下一次比較作準(zhǔn)備 LOOP LOOP2 POP CX ;恢復(fù)外循環(huán)計(jì)數(shù)值 LOOP LOOP1 DONE: MOV AH,4CH INT 21H CODE ENDS END START,34,2.4匯編語言程序設(shè)計(jì),子過程及過程定義 子程序 子程序是完成確定功能的獨(dú)立的程序段,它可以被其他程序調(diào)用,在完成確定功能后,又可自動(dòng)返回到調(diào)用程序處。 使用子程序的優(yōu)缺點(diǎn): 避免了程序中多次重復(fù)的書寫程序,節(jié)省了內(nèi)存空間; 由于一些常用的子程序可以事先編好,一旦需要時(shí)可以隨時(shí)調(diào)用,因而也方便了程序的編制和調(diào)試。 但子程序的調(diào)用和返回需要占用時(shí)間,并且子程序通常具有一定的通用
31、性和獨(dú)立性,因此在調(diào)用時(shí),需要保存某些寄存器的內(nèi)容,以防止子程序運(yùn)行過程中破壞調(diào)用程序已產(chǎn)生的中間結(jié)果,所以子程序在運(yùn)行時(shí)間上將有所損失。,2.4.5子過程及過程定義,35,2.4匯編語言程序設(shè)計(jì),調(diào)用子程序的程序通常稱為主程序 主程序在調(diào)用子程序時(shí),應(yīng)為子程序提供運(yùn)算所需的初始數(shù)據(jù);而子程序返回時(shí),應(yīng)將運(yùn)算結(jié)果以一定的方式提交給主程序,通常稱為主程序與子程序之間的參數(shù)傳遞。,2.4.5子過程及過程定義,36,2.4匯編語言程序設(shè)計(jì),過程定義 用PROC和ENDP偽指令定義過程,格式為: 過程名PROC類型 RET 過程名ENDP 過程的執(zhí)行是由調(diào)用指令CALL調(diào)用后進(jìn)行的,調(diào)用FAR類型的過
32、程執(zhí)行段間調(diào)用操作,而調(diào)用NEAR類型的過程執(zhí)行段內(nèi)調(diào)用操作。 返回指令執(zhí)行段內(nèi)返回還是段間返回與過程的類型有關(guān),若類型為FAR,其相應(yīng)的返回指令執(zhí)行段間返回操作;若類型為NEAR,那么,其返回指令執(zhí)行段內(nèi)返回操作。,2.4.5子過程及過程定義,37,2.4匯編語言程序設(shè)計(jì),子程序的調(diào)用和返回 1、段內(nèi)調(diào)用和返回 調(diào)用程序和子程序在同一個(gè)代碼段的程序結(jié)構(gòu). 注意:其中主程序,子程序名自已起.程序結(jié)束偽指令END后必須跟主程序名,2.4.5子過程及過程定義,CODE SEGMENT MAIN PROC FAR ;定義MAIN主過程 CALL SUB1;段內(nèi)調(diào)用子程序SUB1 RET MAIN E
33、NDP SUB1 PROC NEAR ;定義SUB1段內(nèi)調(diào)用子程序 RET SUB1 ENDP CODE ENDS END MAIN,38,2.4匯編語言程序設(shè)計(jì),子程序的調(diào)用和返回 2、段間調(diào)用和返回 調(diào)用程序和子程序在不同的代碼段的程序結(jié)構(gòu). 注意:由于SUB2既被段間調(diào)用又被段內(nèi)調(diào)用,所以必須定義為FAR屬性,另外程序結(jié)束偽指令END后必須跟主程序名.,2.4.5子過程及過程定義,CODE1 SEGMENT MAIN PROC FAR ;定義MAIN主過程 CALL FAR PTR SUB2 RET MAIN ENDP CODE1 ENDS CODE2 SEGMENT SUB1 PROC
34、 FAR ;定義SUB1段間調(diào)用子程序 CALL FAR PTR SUB2 RET SUB1 ENDP SUB2 PROC FAR ;定義SUB2段間調(diào)用子程序 RET SUB2 ENDP CODE2 ENDS END MAIN,39,2.4匯編語言程序設(shè)計(jì),主程序與子程序之間的參數(shù)傳遞 主程序在調(diào)用子程序之前需要將某些初始數(shù)據(jù)提交給子程序,而子程序運(yùn)行結(jié)束后也需將結(jié)果返回主程序,這就是兩者之間的參數(shù)傳遞; 主程序給子程序提供的初始數(shù)據(jù)或獲得初始數(shù)據(jù)的信息稱為子程序的入口參數(shù); 子程序返回主程序的結(jié)果常稱為子程序的出口參數(shù)。,2.4.5子過程及過程定義,40,2.4匯編語言程序設(shè)計(jì),主程序與子
35、程序之間的參數(shù)傳遞 寄存器傳遞參數(shù)方式 寄存器傳遞參數(shù)方式是指子程序的入口參數(shù)和出口參數(shù)都是通過寄存器傳遞的。適用于參數(shù)較少的情況,傳遞速度較快. 例2-4-5-1 CODE1SEGMENT MOV AL, BCDBUFF ;讀取待轉(zhuǎn)換的壓縮BCD碼到AL CALL FAR PTR BCD2 ;調(diào)BCD2子程序 CODE1 ENDS,2.4.5子過程及過程定義,41,2.4匯編語言程序設(shè)計(jì),;名稱:BCD2 ;功能:將一個(gè)字節(jié)的壓縮BCD碼轉(zhuǎn)換成二進(jìn)制數(shù) ;所用寄存器:CX ;入口參數(shù):AL存放兩位BCD碼 ;出口參數(shù):AL存放二進(jìn)制數(shù) ;調(diào)用其它子程序;無 ;* CODE2SEGMENT A
36、SSUME CS: CODE2 BCD2 PROC FAR PUSH CX ;保護(hù)現(xiàn)場 MOV CH, AL ;AL中是一字節(jié)的BCD碼.(入口參數(shù)) AND CH, 0FH ;存低8位 (保留個(gè)位,在CH中) MOV CL, 4 SHR AL, CL ;高8位右移4位 MOV CL, 10 MUL CL ; 高8位右移4位后乘10 (AX=AL*CL) ADD AL, CH ;高8位右移4位后乘10加低8位 ;(AL=BCD高*10+BCD低) POP CX ;恢復(fù)現(xiàn)場 RET BCD2 ENDP CODE2 ENDS,2.4.5子過程及過程定義,42,2.4匯編語言程序設(shè)計(jì),2.4.5子過
37、程及過程定義,例如4-4-5-2寄存器傳遞參數(shù). 求數(shù)組ARRAY中所有元素之和(65535)并存于SUM單元中. STAK SEGMENT PARA STACK STACK DB 100 DUP(?) STAK ENDS DATA SEGMENT ARRAY DB 1, 2, 3, 4, 5,6,7,8,9,10,11,12,13,14,15,16 COUNT EQU $-ARRAY SUM DW ? DATA ENDS CODE SEGMENT ASSUM CS:CODE, DS:DATA,SS:STAK START: MOV AX, DATA MOV DS, AX LEA SI, ARR
38、AY; 入口參數(shù)準(zhǔn)備,將需要傳遞的參數(shù)送入寄存器 MOV CX, COUNT CALL SUM1 ;調(diào)用子程序求和,返回值在AX中 MOV SUM, AX ;和存于SUM單元 MOV AH, 4CH ;返回DOS INT 21H,43,2.4匯編語言程序設(shè)計(jì),2.4.5子過程及過程定義,;名稱:SUM1 ;功能:求字節(jié)數(shù)組和. ;所用寄存器:AX,CX,SI ;入口參數(shù):SI=數(shù)組首址,CX=數(shù)組長度 ;出口參數(shù):AX=數(shù)組和 ;調(diào)用其它子程序;無 ;* SUM1 PROC NEAR MOV AX , 0 ;數(shù)組和通過AX寄存器回送到主程序 AGAIN: ADD AL, SI ADC AH,
39、0 INC SI LOOP AGAIN RET SUM1 ENDP CODE ENDS END START,44,2.4匯編語言程序設(shè)計(jì),指定內(nèi)存單元參數(shù)傳遞方式 參數(shù)直接通過內(nèi)存單元傳遞。 主程序在調(diào)用前應(yīng)將子程序中所用的數(shù)據(jù)送入指定數(shù)據(jù)區(qū),所需結(jié)果也從指定數(shù)據(jù)區(qū)中取。 在進(jìn)入子程序后,子程序則直接從指定數(shù)據(jù)區(qū)中取數(shù)據(jù)和存放結(jié)果。此時(shí),子程序必須指出它所用的指定內(nèi)存區(qū)的段及有關(guān)變量。 當(dāng)子程序中所用的數(shù)據(jù)量比較大時(shí),調(diào)用前數(shù)據(jù)轉(zhuǎn)移的工作量就比較大,因此指定內(nèi)存單元傳遞參數(shù)的另一種方法是分別在指定單元中存放數(shù)據(jù)的首地址和數(shù)據(jù)長度,而不是數(shù)據(jù)本身。,2.4.5子過程及過程定義,45,2.4匯編語
40、言程序設(shè)計(jì),指定內(nèi)存單元參數(shù)傳遞方式 例:2-4-5-3數(shù)據(jù)段定義二個(gè)數(shù)組,編寫程序?qū)崿F(xiàn)數(shù)組段分別求和(不計(jì)益出). 本例是通過存儲(chǔ)器來傳遞參數(shù)的,需要傳遞的數(shù)組的數(shù)保留在存儲(chǔ)器中,調(diào)用前只需將數(shù)組偏移地址放入SI寄存器,在過程中通過寄存器間址就可取得存儲(chǔ)器中的操作數(shù),運(yùn)算結(jié)果直接由過程寫回到存儲(chǔ)器中,回送給調(diào)用程序.,2.4.5子過程及過程定義,46,2.4匯編語言程序設(shè)計(jì),例:2-4-5-3數(shù)據(jù)段定義二個(gè)數(shù)組,編寫程序?qū)崿F(xiàn)數(shù)組段分別求和(不計(jì)益出). DATA SEGMENT ARY1 DW 100 DUP(45) ;定義數(shù)組1 SUM1 DW ? ARY2 DW 100 DUP(33)
41、;定義數(shù)組2 SUM2 DW ? DATA ENDS STAK SEGMENT STACK SA DW 50 DUP(?) TOP LABEL WORD STAK ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA, SS:STAK START: MOV AX , DATA MOV DS, AX MOV AX, STAK MOV SS, AX MOV SP ,OFFSET TOP LEA SI, ARY1 ;數(shù)組1首地址,入口參數(shù) MOV CX, LENGTH ARY1 ;數(shù)組1長度,入口參數(shù) CALL SUM ;調(diào)用求和子程序 LEA SI, ARY2 ;數(shù)組
42、2首地址,入口參數(shù) MOV CX, LENGTH ARY2 ;數(shù)組2長度,入口參數(shù) ; (注意:LENGTH返回存儲(chǔ)區(qū)必須用DUP()來定義,否則返回1.) CALL SUM ;調(diào)用求和子程序 MOV AH, 4CH INT 21H,2.4.5子過程及過程定義,47,2.4匯編語言程序設(shè)計(jì),;名稱:SUM ;功能:求數(shù)組和. ;所用寄存器:AX, SI ;入口參數(shù):SI=數(shù)組首址, ;出口參數(shù):AX=數(shù)組和 ;調(diào)用其它子程序;無 ;* SUM PROC NEAR ;子程序 XOR AX, AX ;AX清0 L1: ADD AX,WORD PTR SI ;加數(shù)組元素 INC SI INC SI
43、LOOP L1 MOV WORD PTR SI ,AX ;數(shù)組和送入SUM? RET SUM ENDP CODE ENDS END START,2.4.5子過程及過程定義,48,2.4匯編語言程序設(shè)計(jì),堆棧傳遞參數(shù)方式 堆棧傳遞參數(shù)方式是指子程序的入口參數(shù)和出口參數(shù)是通過堆棧傳遞 。 主程序在調(diào)用子程序之前應(yīng)將需傳送給子程序的參數(shù)壓入堆棧,子程序則從堆棧中取出參數(shù),經(jīng)過運(yùn)算后,將運(yùn)算結(jié)果也壓入堆棧中;返回后,主程序在從堆棧中取出結(jié)果。 主程序壓入?yún)?shù)的順序與子程序傳遞結(jié)果的方式必須事先約定。,2.4.5子過程及過程定義,49,2.4匯編語言程序設(shè)計(jì),堆棧傳遞參數(shù)方式 例:2-4-5-4通過堆棧傳遞參數(shù)實(shí)現(xiàn)數(shù)組求和并存入SUM單元中,要求主程序和子程序不在同一個(gè)代碼段中,要進(jìn)行段間調(diào)用. STAK SEGMENT PARA STACK STACK DB 100 DUP(?) TOP LABEL WORD STAK ENDS DATA SEGMENT ARRAY DW d1,d2,d3.,dn COUNT DW N SUM DW ? DATA ENDS,2.4.5子過程及過程定義,50,2.4匯編語言程序設(shè)計(jì),堆棧傳遞參數(shù)方式 CODE1 SEGMENT ASSUME CS:COD
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年大學(xué)(農(nóng)學(xué))植物生理學(xué)代謝階段測試題及解析
- 2025年中職歷史(世界近現(xiàn)代史)試題及答案
- 2025年高職秘書學(xué)(商務(wù)秘書實(shí)務(wù))試題及答案
- 2025年大學(xué)消防工程(消防設(shè)計(jì))試題及答案
- 2025年中職飛機(jī)機(jī)電設(shè)備維修(航電系統(tǒng)故障排除)試題及答案
- 2025年大學(xué)(機(jī)械電子工程)液壓與氣動(dòng)技術(shù)模擬試題及解析
- 2025年高職(云計(jì)算技術(shù)應(yīng)用)云遷移技術(shù)試題及解析
- 2025年大學(xué)體育學(xué)(運(yùn)動(dòng)解剖學(xué))試題及答案
- 2025年大學(xué)發(fā)育生物學(xué)(發(fā)育生物學(xué)基礎(chǔ))試題及答案
- 2025年大學(xué)第一學(xué)年(口腔醫(yī)學(xué))口腔材料學(xué)綜合測試試題及答案
- 市城區(qū)控制性詳細(xì)規(guī)劃編制服務(wù)方案投標(biāo)文件(技術(shù)方案)
- 北京鐵路局考試機(jī)考題庫2025
- 酒駕滿分考試題庫及答案2025
- 庫房安全管理規(guī)范培訓(xùn)課件
- 酒店運(yùn)營經(jīng)理年終總結(jié)
- 華潤燃?xì)獍踩嘤?xùn)
- 高??蒲薪?jīng)費(fèi)財(cái)會(huì)監(jiān)督機(jī)制的優(yōu)化路徑與實(shí)證研究
- 高中物理化學(xué)生物專題復(fù)習(xí)資料
- 學(xué)堂在線 雨課堂 學(xué)堂云 信息素養(yǎng)-學(xué)術(shù)研究的必修課 章節(jié)測試答案
- 市政工程施工組織資源配備計(jì)劃
- 銀行消防管理辦法
評(píng)論
0/150
提交評(píng)論