![05匯編語言程序設(shè)計(jì)1_第1頁](http://file2.renrendoc.com/fileroot_temp3/2021-6/7/f379f727-af40-4d30-93e3-6f568b2e6846/f379f727-af40-4d30-93e3-6f568b2e68461.gif)
![05匯編語言程序設(shè)計(jì)1_第2頁](http://file2.renrendoc.com/fileroot_temp3/2021-6/7/f379f727-af40-4d30-93e3-6f568b2e6846/f379f727-af40-4d30-93e3-6f568b2e68462.gif)
![05匯編語言程序設(shè)計(jì)1_第3頁](http://file2.renrendoc.com/fileroot_temp3/2021-6/7/f379f727-af40-4d30-93e3-6f568b2e6846/f379f727-af40-4d30-93e3-6f568b2e68463.gif)
![05匯編語言程序設(shè)計(jì)1_第4頁](http://file2.renrendoc.com/fileroot_temp3/2021-6/7/f379f727-af40-4d30-93e3-6f568b2e6846/f379f727-af40-4d30-93e3-6f568b2e68464.gif)
![05匯編語言程序設(shè)計(jì)1_第5頁](http://file2.renrendoc.com/fileroot_temp3/2021-6/7/f379f727-af40-4d30-93e3-6f568b2e6846/f379f727-af40-4d30-93e3-6f568b2e68465.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第第5章章 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì) 本章主要內(nèi)容本章主要內(nèi)容 本章介紹匯編語言程序設(shè)計(jì)的基本方法,包本章介紹匯編語言程序設(shè)計(jì)的基本方法,包 括:順序程序設(shè)計(jì)、分支程序設(shè)計(jì)、循環(huán)程括:順序程序設(shè)計(jì)、分支程序設(shè)計(jì)、循環(huán)程 序設(shè)計(jì)和子程序的設(shè)計(jì)。序設(shè)計(jì)和子程序的設(shè)計(jì)。 5.1 匯編語言源程序設(shè)計(jì)的步驟匯編語言源程序設(shè)計(jì)的步驟 5.1.1 分析問題分析問題 首先必須明確求解問題的意義和任務(wù)。對給出的已首先必須明確求解問題的意義和任務(wù)。對給出的已 知條件和要完成的任務(wù)進(jìn)行詳細(xì)地了解和分析,將知條件和要完成的任務(wù)進(jìn)行詳細(xì)地了解和分析,將 一個實(shí)際的問題轉(zhuǎn)化為計(jì)算機(jī)可以處理的問題。一個實(shí)際的問題轉(zhuǎn)
2、化為計(jì)算機(jī)可以處理的問題。 5.1.2 確定確定算法算法 其次就是確定解決問題的算法。所謂算法,簡單地其次就是確定解決問題的算法。所謂算法,簡單地 說就是說就是計(jì)算機(jī)能夠?qū)崿F(xiàn)的有限的解題計(jì)算機(jī)能夠?qū)崿F(xiàn)的有限的解題步驟步驟。我們知。我們知 道,計(jì)算機(jī)只能進(jìn)行最基本的算術(shù)運(yùn)算和邏輯運(yùn)算,道,計(jì)算機(jī)只能進(jìn)行最基本的算術(shù)運(yùn)算和邏輯運(yùn)算, 要完成較為復(fù)雜的運(yùn)算和控制操作,必須選擇合適要完成較為復(fù)雜的運(yùn)算和控制操作,必須選擇合適 的算法,這是正確編程的基礎(chǔ)。的算法,這是正確編程的基礎(chǔ)。 5.1.3 繪制繪制流程圖流程圖 將提出的算法或編程思想用流程圖的方式畫將提出的算法或編程思想用流程圖的方式畫 出來。圖
3、出來。圖5-1給出了流程圖中較為通用的幾種給出了流程圖中較為通用的幾種 符號。符號。 起始框和終止框起始框和終止框 執(zhí)行框執(zhí)行框 判斷框判斷框 聯(lián)系框聯(lián)系框 5.1.4 程序設(shè)計(jì)程序設(shè)計(jì) 根據(jù)流程圖進(jìn)行程序設(shè)計(jì)就是采用某種程序根據(jù)流程圖進(jìn)行程序設(shè)計(jì)就是采用某種程序 設(shè)計(jì)語言來實(shí)現(xiàn)上面已確定的算法,此過程設(shè)計(jì)語言來實(shí)現(xiàn)上面已確定的算法,此過程 有些書上稱為有些書上稱為編碼編碼。 本書所介紹的是采用匯編語言編寫程序。本書所介紹的是采用匯編語言編寫程序。 采用匯編語言編寫程序應(yīng)注意以下幾個問題:采用匯編語言編寫程序應(yīng)注意以下幾個問題: 必須詳細(xì)了解必須詳細(xì)了解CPU的編程模型、指令系統(tǒng)、的編程模型、
4、指令系統(tǒng)、 尋址方式及相關(guān)偽指令;尋址方式及相關(guān)偽指令; 必須進(jìn)行存儲空間和工作單元的合理分配;必須進(jìn)行存儲空間和工作單元的合理分配; 多次使用的程序段落可采用子程序或宏指令;多次使用的程序段落可采用子程序或宏指令; 盡可能用盡可能用標(biāo)號或變量標(biāo)號或變量來代替絕對地址和常數(shù);來代替絕對地址和常數(shù); 5.1.5 程序程序檢驗(yàn)檢驗(yàn) 程序編寫好以后,必須經(jīng)過書面檢查和上機(jī)程序編寫好以后,必須經(jīng)過書面檢查和上機(jī) 調(diào)試,以便說明程序是否正確。檢驗(yàn)時,應(yīng)調(diào)試,以便說明程序是否正確。檢驗(yàn)時,應(yīng) 預(yù)先選擇典型數(shù)據(jù),檢查是否可以得到預(yù)期預(yù)先選擇典型數(shù)據(jù),檢查是否可以得到預(yù)期 結(jié)果。結(jié)果。 5.1.6 編寫編寫說
5、明說明文件文件 一個完整的軟件應(yīng)有相應(yīng)的說明文件,這不一個完整的軟件應(yīng)有相應(yīng)的說明文件,這不 僅便于用戶使用,也便于對程序的維護(hù)和擴(kuò)僅便于用戶使用,也便于對程序的維護(hù)和擴(kuò) 充。說明文件主要應(yīng)包括程序的功能和使用充。說明文件主要應(yīng)包括程序的功能和使用 方法,程序的基本結(jié)構(gòu)和所采用的主要算法方法,程序的基本結(jié)構(gòu)和所采用的主要算法 以及程序必要說明和注意事項(xiàng)等。以及程序必要說明和注意事項(xiàng)等。 32位微機(jī)系統(tǒng)中,位微機(jī)系統(tǒng)中,CPU可以工作在實(shí)模式、可以工作在實(shí)模式、 保護(hù)模式和虛擬模式下,本章僅介紹基于保護(hù)模式和虛擬模式下,本章僅介紹基于實(shí)實(shí) 模式模式的程序設(shè)計(jì)。的程序設(shè)計(jì)。 5.2 順序程序設(shè)計(jì)順
6、序程序設(shè)計(jì) 順序結(jié)構(gòu)也稱線性結(jié)構(gòu),其特點(diǎn)是其中的語順序結(jié)構(gòu)也稱線性結(jié)構(gòu),其特點(diǎn)是其中的語 句或結(jié)構(gòu)被連續(xù)執(zhí)行,順序程序是句或結(jié)構(gòu)被連續(xù)執(zhí)行,順序程序是最簡單最簡單的,的, 也是也是最基本最基本的一種程序結(jié)構(gòu)形式。的一種程序結(jié)構(gòu)形式。 CPU總是根據(jù)總是根據(jù)CS:IP獲取下一條指令所在存儲獲取下一條指令所在存儲 單元的地址,并自動對單元的地址,并自動對IP不斷執(zhí)行加不斷執(zhí)行加1操作。操作。 這種結(jié)構(gòu)的程序從開始到結(jié)尾一直是順序執(zhí)這種結(jié)構(gòu)的程序從開始到結(jié)尾一直是順序執(zhí) 行的,中途沒有任何分支和循環(huán)。行的,中途沒有任何分支和循環(huán)。 從流程圖來看,順序結(jié)從流程圖來看,順序結(jié) 構(gòu)除了一個起始框,一構(gòu)除了
7、一個起始框,一 個結(jié)束框外,就是若干個結(jié)束框外,就是若干 個執(zhí)行框,沒有判斷框。個執(zhí)行框,沒有判斷框。 具有順序結(jié)構(gòu)的程序叫具有順序結(jié)構(gòu)的程序叫 做簡單程序。做簡單程序。 順序結(jié)構(gòu)順序結(jié)構(gòu) 開始開始 結(jié)束結(jié)束 例:實(shí)現(xiàn)例:實(shí)現(xiàn)625*210M。 M DD ? MOV AX,625 MOV BX,210 MUL BX ;16位乘法:結(jié)果為位乘法:結(jié)果為32位位 MOV M ,AX MOV M+2,DX 注:算術(shù)運(yùn)算指令需要注意注:算術(shù)運(yùn)算指令需要注意字長字長、區(qū)分、區(qū)分無符無符 號號/有符號有符號、溢出溢出等問題。等問題。 例例5.9:P161。 5.3 分支程序設(shè)計(jì)分支程序設(shè)計(jì) 分支程序有分支
8、程序有3種結(jié)構(gòu),即種結(jié)構(gòu),即簡單分支簡單分支、復(fù)合分支、復(fù)合分支 和多分支。和多分支。 復(fù)合分支復(fù)合分支是指通過一個簡單分支不能實(shí)現(xiàn)判是指通過一個簡單分支不能實(shí)現(xiàn)判 斷,必須多個分支合起來才能進(jìn)行判斷的情斷,必須多個分支合起來才能進(jìn)行判斷的情 況。況。 在設(shè)計(jì)多分支轉(zhuǎn)移程序時,如果分支太多,在設(shè)計(jì)多分支轉(zhuǎn)移程序時,如果分支太多, 則平均轉(zhuǎn)移速度太慢??梢圆捎棉D(zhuǎn)移地址表則平均轉(zhuǎn)移速度太慢??梢圆捎棉D(zhuǎn)移地址表 來實(shí)現(xiàn)多分支轉(zhuǎn)移,可以提高平均轉(zhuǎn)移速度。來實(shí)現(xiàn)多分支轉(zhuǎn)移,可以提高平均轉(zhuǎn)移速度。 多分支多分支結(jié)構(gòu)相當(dāng)于一個多路開關(guān),在程序設(shè)結(jié)構(gòu)相當(dāng)于一個多路開關(guān),在程序設(shè) 計(jì)中通常是根據(jù)某計(jì)中通常是根據(jù)
9、某寄存器寄存器或某或某存儲單元存儲單元的內(nèi)的內(nèi) 容容(一個數(shù)字一個數(shù)字)進(jìn)行程序轉(zhuǎn)移。進(jìn)行程序轉(zhuǎn)移。 分支程序的結(jié)構(gòu)示意圖分支程序的結(jié)構(gòu)示意圖 (a) 簡單分支簡單分支 (b) 復(fù)合分支復(fù)合分支 條件成立?條件成立? Y Y 條件成立?條件成立? N 語句語句 語句語句 1語句語句 2 語句語句 1語句語句 2語句語句 n 情況情況1情況情況2情況情況n 表達(dá)式計(jì)算結(jié)果是表達(dá)式計(jì)算結(jié)果是 (c) 多路分支多路分支 1.簡單分支簡單分支 通常,是在執(zhí)行了通常,是在執(zhí)行了算術(shù)比較指令算術(shù)比較指令CMP,或者或者 邏輯比較指令邏輯比較指令TEST之后,根據(jù)之后,根據(jù)Z,S,O,P, C等各種等各種狀
10、態(tài)標(biāo)志狀態(tài)標(biāo)志進(jìn)行條件轉(zhuǎn)移。進(jìn)行條件轉(zhuǎn)移。 如果條件成立:跳轉(zhuǎn)到指定指令開始執(zhí)行;如果條件成立:跳轉(zhuǎn)到指定指令開始執(zhí)行; 否則,順序執(zhí)行轉(zhuǎn)移指令的下一條指令。否則,順序執(zhí)行轉(zhuǎn)移指令的下一條指令。 例例:將一個將一個16位二進(jìn)制數(shù)以二進(jìn)制數(shù)的方式顯示。位二進(jìn)制數(shù)以二進(jìn)制數(shù)的方式顯示。 CODE SEGMENT USE16 ASSUME CS:CODE BEG: MOV BX,5678H ;BX中為將要處理的中為將要處理的16位二進(jìn)制數(shù)位二進(jìn)制數(shù) MOV CX,16 ;每次移出每次移出1位、循環(huán)位、循環(huán)16次次 LAST:MOV DL,0 RCL BX,1 ;BX循環(huán)左移一位循環(huán)左移一位 JNC
11、NEXT ;若進(jìn)位標(biāo)志為若進(jìn)位標(biāo)志為0則轉(zhuǎn),顯示則轉(zhuǎn),顯示0 MOV DL,1 ;為為1時,則顯示時,則顯示1 NEXT: MOV AH,2 INT 21H LOOP LAST MOV AH,4CH INT 21H CODE ENDS END BEG 思考:思考: 例中的例中的RCL換為換為SHL、SAL、ROL,是否可,是否可 行?行? “左移左移”換為換為“右移右移” 是否可行?是否可行? 2.復(fù)雜分支復(fù)雜分支 在簡單分支的某個分支上進(jìn)行其他條件的判在簡單分支的某個分支上進(jìn)行其他條件的判 斷。斷。 【例例】 設(shè)有一個帶符號的設(shè)有一個帶符號的16位數(shù)存于位數(shù)存于ALFA 單元中。編程判斷該數(shù)
12、,若單元中。編程判斷該數(shù),若大于大于0、將、將BETA 單元置為單元置為0FFH;若;若等于等于0、將、將BETA+1單元置單元置 為為0FFH;若;若小于小于0、將、將BETA+2單元置為單元置為 0FFH。 解解:程序設(shè)計(jì)如下程序設(shè)計(jì)如下: START:MOV AX,DATA ;設(shè)置段地址設(shè)置段地址 MOV DS,AX MOV AX,ALFA ;取操作數(shù)取操作數(shù) OR AX,AX ;設(shè)置狀態(tài)標(biāo)志位設(shè)置狀態(tài)標(biāo)志位 ;是否可以改為是否可以改為AND?XOR呢?呢? JS LOOP1 ;SF=1,小于小于0轉(zhuǎn)移轉(zhuǎn)移 JZ LOOP2 ;ZF=0,等于等于0轉(zhuǎn)移轉(zhuǎn)移 MOV BETA,0FFH ;
13、大于大于0 JMP LOOP3 ;能否省略?能否省略? LOOP1:MOV BETA+2, 0FFH JMP LOOP3 ;能否省略?能否省略? LOOP2:MOV BETA+1,0FFH LOOP3: END START 思考:本例可以采用思考:本例可以采用CMP AX,0的做法:的做法: 但是,必須使用但是,必須使用JG/JL,而不能使用,而不能使用JA/JB。 例:實(shí)現(xiàn)下列符號函數(shù)例:實(shí)現(xiàn)下列符號函數(shù)Y的功能,其中:的功能,其中: -128X+127。 1 當(dāng)當(dāng)X0時時 Y 0 當(dāng)當(dāng)X0時時 -1 當(dāng)當(dāng)X0時時 X DB?;自變量自變量X Y DB ?;函數(shù)值函數(shù)值Y MOV AL,0
14、;同時假設(shè)同時假設(shè)Y=0 CMP X,AL JG BIG ;X大于大于0 JZ SAV ;X等于等于0 、Y=0 MOV AL,0FFH ;X小于小于0、Y= -1 JMP SHORT SAV BIG: MOV AL,1 ;Y=1 SAV: MOVY,AL ;保存結(jié)果保存結(jié)果 例例5.11P162復(fù)合判斷。判斷一個復(fù)合判斷。判斷一個無符號數(shù)無符號數(shù) X與已知兩個無符號數(shù)與已知兩個無符號數(shù)N1、N2(N1N2)之間之間 的大小關(guān)系,并顯示判斷結(jié)果。的大小關(guān)系,并顯示判斷結(jié)果。 DATA SEGMENT USE16 MESG1 DB N1=X=N2$ MESG2 DB XN2$ NUMBER DB
15、 ? N1 EQU 22 N2 EQU 88 DATA ENDS CODE SEGMENT USE16 ASSUME CS:CODE,DS:DATA BEG:MOV AX,DATA MOV DS,AX MOV DX,OFFSET MESG1;預(yù)設(shè)一種結(jié)果預(yù)設(shè)一種結(jié)果 CMP NUMBER,N1 ;無需無需PTR JNC NEXT MOV DX,OFFSET MESG2 JMP DISP NEXT:CMP NUMBER,N2+1 JC DISP ;如果上一條指令如果上一條指令N2+1改用改用N2則則JC應(yīng)改為應(yīng)改為JBE MOV DX,OFFSET MESG3 DISP:MOV AH,9 INT
16、 21H MOV AH,4CH INT 21H CODE ENDS END BEG 思考:如果思考:如果NUM的值分別為以下情況、結(jié)果如何:的值分別為以下情況、結(jié)果如何: 55 ? A a -1 3.多分支多分支 在一個程序中,如果分支太多,將會出現(xiàn)連在一個程序中,如果分支太多,將會出現(xiàn)連 續(xù)多次條件判斷,則平均轉(zhuǎn)移速度較慢,即續(xù)多次條件判斷,則平均轉(zhuǎn)移速度較慢,即 程序執(zhí)行程序執(zhí)行效率較低效率較低。 多路分支相對于一個多路多路分支相對于一個多路開關(guān)開關(guān),通常是根據(jù),通常是根據(jù) 一個一個存儲單元存儲單元或者一個或者一個寄存器寄存器的內(nèi)容的內(nèi)容( )進(jìn)行程序:進(jìn)行程序:。 例例5.12P163:
17、設(shè)計(jì)一個支持:設(shè)計(jì)一個支持256個分支的段個分支的段 內(nèi)轉(zhuǎn)移程序。內(nèi)轉(zhuǎn)移程序。 設(shè)設(shè)JUMP中有一個數(shù)中有一個數(shù)X。 若若X=0,轉(zhuǎn)移到標(biāo)號為,轉(zhuǎn)移到標(biāo)號為P000的程序段。的程序段。 若若X=1,轉(zhuǎn)移到標(biāo)號為,轉(zhuǎn)移到標(biāo)號為P001的程序段。的程序段。 若若X=255,轉(zhuǎn)移到標(biāo)號為,轉(zhuǎn)移到標(biāo)號為P255的程序段。的程序段。 圖示;假設(shè)圖示;假設(shè)JUMP為為3。 .486 DATA SEGMENT USE16 JUMP DB ? TAB DW P000 ;P000是標(biāo)號是標(biāo)號 DW P001 . . DW P255 DATA ENDS CODE SEGMENT USE16 ASSUME CS:C
18、ODE,DS:DATA BEG:MOV AX,DATA MOV DS,AX MOV BL,JUMP MOV BH,0 ;2句可否合并進(jìn)入句可否合并進(jìn)入BX? ;能否直接使用;能否直接使用BX? ADD BX,BX ;乘以乘以2操作、為什么?操作、為什么? MOV SI,OFFSET TAB JMP BX+SI P000:. . P001:. . . . P255:. . CODE ENDS END BEG 例例統(tǒng)計(jì)一個班學(xué)生的考試分?jǐn)?shù)在各個分?jǐn)?shù)段統(tǒng)計(jì)一個班學(xué)生的考試分?jǐn)?shù)在各個分?jǐn)?shù)段 的情況。分?jǐn)?shù)在的情況。分?jǐn)?shù)在059的個數(shù)在的個數(shù)在Sort存儲單元,存儲單元, 6069的在的在Sort+1單元
19、,單元,9099的在的在Sort+4 單元。程序如下:單元。程序如下: DATA SEGMENT SORT DB 5 DUP(0) ADDR DW S59,S69,S79,S89,S99 TABLE DB 59,60,68,77,71,78,90,95、 DB * ;循環(huán)結(jié)束標(biāo)志循環(huán)結(jié)束標(biāo)志 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV DI,OFFSET TABLE ;逐個讀取分?jǐn)?shù)逐個讀取分?jǐn)?shù) MOV SI,OFFSET ADDR NEXT:MOV AL,DI ;逐個讀取分?jǐn)?shù)逐個讀取
20、分?jǐn)?shù) CMP AL,* JE OVER INC DI ;準(zhǔn)備讀取下一個數(shù)據(jù)準(zhǔn)備讀取下一個數(shù)據(jù) CMP AL,60 JAE NEXT MOV AL,0 ;當(dāng)分?jǐn)?shù)低于當(dāng)分?jǐn)?shù)低于60時,時,AL直接置直接置0 NEXT :MOV AH,0 ;AL/10 5 MOV BL,10 DIV BL SUB AL,5 ;AL介于介于14 MOV BL,AL MOV BH,0 ;BX介于介于04 ADD BX,BX ;乘以乘以2 JMP SI+BX S59:INC SORT JMP NEXT S69:INC SORT+1 JMP NEXT S79:INC SORT+2 JMP NEXT S89:INC SORT
21、+3 JMP NEXT S99:INC SORT+4 JMP NEXT OVER:MOV CX,5 ;顯示結(jié)果;顯示結(jié)果 MOV SI,OFFSET SORT-1 DISP:MOV AH,2 MOV DL,13 INT 21H MOV AH,2 MOV DL,10 INT 21H INC SI MOV DL,SI ADD DL,30H MOV AH,2 INT 21H LOOP DISP MOV AH,4CH INT 21H CODE ENDS END START 5.4 循環(huán)程序設(shè)計(jì)循環(huán)程序設(shè)計(jì) 循環(huán)程序一般應(yīng)包括以下幾部分:循環(huán)程序一般應(yīng)包括以下幾部分: (1)循環(huán)初始化循環(huán)初始化。通常是
22、指設(shè)置循環(huán)的初始條件,包。通常是指設(shè)置循環(huán)的初始條件,包 括設(shè)置循環(huán)計(jì)數(shù)器的初值等,常使用寄存器或者內(nèi)括設(shè)置循環(huán)計(jì)數(shù)器的初值等,常使用寄存器或者內(nèi) 存單元作為循環(huán)計(jì)數(shù)器。存單元作為循環(huán)計(jì)數(shù)器。 (2)循環(huán)體循環(huán)體。 (3) 循環(huán)控制循環(huán)控制部分。根據(jù)循環(huán)的條件是否滿足來決定部分。根據(jù)循環(huán)的條件是否滿足來決定 程序是否循環(huán),通常用一個簡單分支來實(shí)現(xiàn)循環(huán)控程序是否循環(huán),通常用一個簡單分支來實(shí)現(xiàn)循環(huán)控 制。制。 特別要注意循環(huán)入口和循環(huán)次數(shù)的正確設(shè)置、地址特別要注意循環(huán)入口和循環(huán)次數(shù)的正確設(shè)置、地址 指針及循環(huán)控制條件的修改等,否則會得不到期望指針及循環(huán)控制條件的修改等,否則會得不到期望 的結(jié)果。的
23、結(jié)果。 循環(huán)結(jié)構(gòu)可以分為單循環(huán)、雙循環(huán)和多重循環(huán)。三循環(huán)結(jié)構(gòu)可以分為單循環(huán)、雙循環(huán)和多重循環(huán)。三 重及以上的循環(huán)就比較復(fù)雜了。重及以上的循環(huán)就比較復(fù)雜了。 例例求求最大數(shù)最大數(shù)。假設(shè)從內(nèi)存的。假設(shè)從內(nèi)存的BUF單元開始存單元開始存 有一個以有一個以ASCII碼碼方式表示的字符串,求其中方式表示的字符串,求其中 的最大數(shù)的最大數(shù)(即即ASCII碼最大的字符的碼最大的字符的ASCII值值), 顯示到屏幕上。顯示到屏幕上。 注意:注意:ASCII碼參與比較時視為碼參與比較時視為無符號數(shù)無符號數(shù)! 必須使用必須使用JA/JB,而不能使用,而不能使用JG/JL 解法解法1循環(huán)次數(shù)已知循環(huán)次數(shù)已知 DAT
24、A SEGMENT USE16 BUF DB QWERTYUIOP123 COUNT EQU $-BUF ;統(tǒng)計(jì)字節(jié)個數(shù)、即統(tǒng)計(jì)字節(jié)個數(shù)、即循環(huán)次數(shù)循環(huán)次數(shù) MAX DB MAX=,?,0DH, 0AH, $ DATA ENDS CODE SEGMENT USE16 ASSUME CS:CODE,DS:DATA BEG:MOV AX,DATA MOV DS,AX MOV AL,0 ;最大數(shù)最大數(shù)0送送AL LEA BX,BUF MOV CX,COUNT LAST: CMP BX,AL JB NEXT MOV AL,BX ;大數(shù)大數(shù) NEXT:INC BX LOOP LAST MOV MAX+4
25、,AL MOV AH,9 LEA DX,MAX INT 21H MOV AH,4CH INT 21H CODE ENDS END BEG 在上面的例子里面,循環(huán)次數(shù)已知,在已知在上面的例子里面,循環(huán)次數(shù)已知,在已知N 個數(shù)中,求最大數(shù)時:個數(shù)中,求最大數(shù)時: (1)需要比較)需要比較N次次: 給定一個假設(shè)的最小無符號數(shù)給定一個假設(shè)的最小無符號數(shù)0; (2)只需要)只需要N-1次:次: 假設(shè)第一個數(shù)即是最大數(shù)。假設(shè)第一個數(shù)即是最大數(shù)。 解法解法2 循環(huán)結(jié)束標(biāo)志循環(huán)結(jié)束標(biāo)志 當(dāng)循環(huán)次數(shù)不確定時,采用當(dāng)循環(huán)次數(shù)不確定時,采用循環(huán)結(jié)束標(biāo)志循環(huán)結(jié)束標(biāo)志控控 制循環(huán)。制循環(huán)。 此例中:定義一個值為此例中:
26、定義一個值為-1的的FLAG單元作為字單元作為字 符串的結(jié)束標(biāo)志。符串的結(jié)束標(biāo)志。 解法解法2 求字符串中最大字符,利用求字符串中最大字符,利用結(jié)束標(biāo)志結(jié)束標(biāo)志。 DATA SEGMENT USE16 BUF DB QWERTYUIOP123 FLAG DB -1 MAX DB MAX=,?,0DH, 0AH, $ DATA ENDS CODE SEGMENT USE16 ASSUME CS:CODE,DS:DATA BEG: MOV AX,DATA MOV DS,AX MOV AL,0 ;最小無符號數(shù)最小無符號數(shù)0送送AL LEA BX,BUF LAST:CMP BYTE PTR BX,-1
27、 JE DISP CMP BX,AL JC NEXT MOV AL,BX NEXT:INC BX JMP LAST DISP:MOV MAX+4,AL MOV AH,9 MOV DX,OFFSET MAX INT 21H MOV AH,4CH INT 21H CODE ENDS END BEG 例例設(shè)某數(shù)據(jù)塊存放在設(shè)某數(shù)據(jù)塊存放在BUFFER開始的開始的100個字節(jié)單元中。試個字節(jié)單元中。試 編程統(tǒng)計(jì)數(shù)據(jù)塊中編程統(tǒng)計(jì)數(shù)據(jù)塊中負(fù)數(shù)的個數(shù)負(fù)數(shù)的個數(shù),并將統(tǒng)計(jì)的結(jié)果存放到,并將統(tǒng)計(jì)的結(jié)果存放到 NUMBER單元中。單元中。 解解:程序如下程序如下: START:MOV AX,DATA MOV DS,
28、 AX LEA SI,BUFFER ;設(shè)置數(shù)據(jù)塊指針設(shè)置數(shù)據(jù)塊指針 MOV CX,100 ;設(shè)置循環(huán)次數(shù)設(shè)置循環(huán)次數(shù) MOV BL,0 ;統(tǒng)計(jì)個數(shù)統(tǒng)計(jì)個數(shù) LOOP1:MOV AL,SI ;取數(shù)據(jù)取數(shù)據(jù) OR AL,AL ;設(shè)置設(shè)置狀態(tài)標(biāo)志位狀態(tài)標(biāo)志位 JNS LOOP2 ;非負(fù)轉(zhuǎn)移非負(fù)轉(zhuǎn)移 INC BL ;計(jì)數(shù)器加計(jì)數(shù)器加1 LOOP2:INC SI ;修改指針修改指針 LOOP LOOP1 ;CX0,繼續(xù)循環(huán)繼續(xù)循環(huán) MOV NUMBER, BL END START 例例設(shè)設(shè)STRING開始的區(qū)域中存放著一個字符串開始的區(qū)域中存放著一個字符串,以字符以字符* 作為結(jié)束標(biāo)志。設(shè)計(jì)程序作為結(jié)束
29、標(biāo)志。設(shè)計(jì)程序,統(tǒng)計(jì)字符串的長度統(tǒng)計(jì)字符串的長度,并存入并存入 LENGTH單元中。單元中。 解解:程序如下程序如下: START:MOV AX,DATA MOV DS,AX LEA BX,STRING ;設(shè)置字符串首地設(shè)置字符串首地 MOV CX,0 ;計(jì)數(shù)器清計(jì)數(shù)器清0 LOOP1:MOV AL,BX ;取一個字符取一個字符 CMP AL,* ;與與*比較比較 JZ LOOP2 ;相等轉(zhuǎn)相等轉(zhuǎn)LOOP2 INC CX ;計(jì)數(shù)器加計(jì)數(shù)器加1 INC BX ;修改指針修改指針 JMP LOOP1 ;循環(huán)循環(huán) LOOP2: MOV LENGTH, CX ;存結(jié)果存結(jié)果 END START ;例:
30、內(nèi)存緩沖區(qū)從例:內(nèi)存緩沖區(qū)從BUF+1開始存有若干個單字節(jié)的開始存有若干個單字節(jié)的 有符號數(shù),其個數(shù)放在有符號數(shù),其個數(shù)放在BUF單元,要求找出單元,要求找出最大數(shù)最大數(shù) 送到送到MAX單元,最小數(shù)送到單元,最小數(shù)送到MIN單元單元。 DATA SEGMENT USE16 BUF DB 8, 34,56,-1,7FH,-88,200,22,80H MAX DB ? MIN DB ? DATA ENDS CODE SEGMENT USE16 ASSUME CS:CODE,DS:DATA BEG: MOV AX,DATA MOV DS,AX MOV CH,0 MOV CL,BUF MOV AL,B
31、UF+1 MOV MAX,AL MOV MIN,AL DEC CX MOV BX,OFFSET BUF+2 LAST:MOV AL,BX CMP AL,MAX JG GREAT CMP AL,MIN JL LESS JMP NEXT GREAT: MOV MAX,AL JMP NEXT LESS:MOV MIN,AL NEXT:INC BX LOOP LAST MOV AH,4CH INT 21H CODE ENDS END BEG 例在字型例在字型無序表無序表中找出中找出最大數(shù)最大數(shù)和和最小數(shù)最小數(shù),并分別,并分別 存入存入MAX和和MIN單元。單元。 STACKSG SEGMENT STA
32、CK STK DW 32 DUP(S) STACKSG ENDS DATA SEGMENT BUFFER DW 500,30,56,77,999,67,433,5675,0,9999, 3455,6578,32766,8,0,32560,45,889,5665,09 ;無序表無序表 CN DW ($-BUFFER)/2;元素個數(shù)元素個數(shù) MAX DW ?;存放最大數(shù)單元存放最大數(shù)單元 MIN DW ? ;存放最小數(shù)單元存放最小數(shù)單元 DATA ENDS CODE SEGMENT MAIN PROC FAR ASSUME CS:CODE,DS:DATA PUSH DS XOR AX,AX PUS
33、H AX MOV AX,DATA MOV DS,AX LEA SI,BUFFER ;初始化地址指針初始化地址指針 MOV CX,CN ;元素個數(shù)元素個數(shù) MOV AX,SI ;取第一數(shù)取第一數(shù) MOV MAX,AX ;初始化最大數(shù)初始化最大數(shù) MOV MIN,AX ;初始化最小數(shù)初始化最小數(shù) DEC CX ;循環(huán)次數(shù)減循環(huán)次數(shù)減1 COMP:ADD SI,2 ;修改地址指針修改地址指針 MOV AX,SI;取下一個數(shù)取下一個數(shù) CMP AX,MAX;與當(dāng)前的最大數(shù)比較與當(dāng)前的最大數(shù)比較 JL NEXT;若小于轉(zhuǎn)若小于轉(zhuǎn) MOV MAX,AX ;若大于則把此數(shù)作為最大數(shù)保存若大于則把此數(shù)作為最大
34、數(shù)保存 JMP SHORT LOP NEXT:CMP AX,MIN;與當(dāng)前的最小數(shù)比較與當(dāng)前的最小數(shù)比較 JG LOP;若大于轉(zhuǎn)若大于轉(zhuǎn) MOV MIN,AX;若小于則把此數(shù)作為最小數(shù)保存若小于則把此數(shù)作為最小數(shù)保存 LOP: LOOP COMP;決定循環(huán)繼續(xù)還是終止決定循環(huán)繼續(xù)還是終止 RET MAIN ENDP CODE ENDS END MAIN 多重循環(huán)程序設(shè)計(jì)多重循環(huán)程序設(shè)計(jì) 例編制用軟件延時例編制用軟件延時200ms的程序。的程序。 假設(shè),以下程序片段可以延時假設(shè),以下程序片段可以延時10ms: DELAY10: MOV CX,2801 ;置循環(huán)次數(shù)置循環(huán)次數(shù) WT: LOOP W
35、T 則延時則延時200ms只需把以上程序片段只需把以上程序片段循環(huán)循環(huán)20次次即即 可,如下所示:可,如下所示: DELAY PROC MOV BL,20;置外循環(huán)次數(shù)置外循環(huán)次數(shù) DELAY10: MOV CX,2801;置內(nèi)循環(huán)次數(shù)置內(nèi)循環(huán)次數(shù) WT: LOOP WT;內(nèi)循環(huán)體、循環(huán)次數(shù)修改及循環(huán)控制內(nèi)循環(huán)體、循環(huán)次數(shù)修改及循環(huán)控制 DEC BL;修改外循環(huán)次數(shù)修改外循環(huán)次數(shù) JNZ DELAY10;外循環(huán)控制外循環(huán)控制 RET DELAY ENDP 5.5 子程序設(shè)計(jì)子程序設(shè)計(jì) 子程序子程序(即即:過程過程)是相對獨(dú)立的程序,當(dāng)程序中經(jīng)常是相對獨(dú)立的程序,當(dāng)程序中經(jīng)常 需要完成某一項(xiàng)操作
36、時,為了簡化程序和閱讀方便,需要完成某一項(xiàng)操作時,為了簡化程序和閱讀方便, 常常把完成某項(xiàng)操作的程序單獨(dú)設(shè)計(jì)為一個子程序,常常把完成某項(xiàng)操作的程序單獨(dú)設(shè)計(jì)為一個子程序, 需要時就調(diào)用它。需要時就調(diào)用它。 子程序通常用子程序通常用PROC/ENDP作為定界語句,用作為定界語句,用CALL 指令調(diào)用,子程序用指令調(diào)用,子程序用RET返回。返回。 從子程序相對于調(diào)用指令的位置來看,分為從子程序相對于調(diào)用指令的位置來看,分為段內(nèi)段內(nèi)和和 段間段間子程序。分別用子程序。分別用NEAR和和FAR表示其屬性。表示其屬性。 根據(jù)子程序入口地址給出的方式不同,子程序的調(diào)根據(jù)子程序入口地址給出的方式不同,子程序的
37、調(diào) 用也可以分為用也可以分為直接直接和和間接調(diào)用間接調(diào)用兩種方式。兩種方式。 1調(diào)用程序和子程序在調(diào)用程序和子程序在同一個代碼段同一個代碼段的程序結(jié)構(gòu)的程序結(jié)構(gòu) (子程序類型可缺省,注意(子程序類型可缺省,注意END后必須跟主程序名)后必須跟主程序名) CODE SEGMENT MAINPROC FAR CALLSUB1 RET MAINENDP SUB1PROC RET SUB1ENDP CODEENDS ENDMAIN 2調(diào)用程序和子程序在調(diào)用程序和子程序在不同段不同段的程序結(jié)構(gòu)的程序結(jié)構(gòu)(SUB2既被既被段間段間調(diào)用又被調(diào)用又被段內(nèi)段內(nèi) 調(diào)用調(diào)用,必須是必須是FAR屬性屬性。CALL要顯
38、式說明是要顯式說明是FAR屬性)屬性) CODE1SEGMENT MAINPROC FAR CALLFAR PTR SUB2 RET MAINENDP CODE1ENDS CODE2SEGMENT SUB2PROC FAR RET SUB2ENDP SUB3PROC CALLFAR PTR SUB2 RET SUB3ENDP CODE2ENDS ENDMAIN 子程序分為無參數(shù)和有參數(shù)兩種。子程序分為無參數(shù)和有參數(shù)兩種。 調(diào)用有參數(shù)的子程序時,向子程序調(diào)用有參數(shù)的子程序時,向子程序傳遞參數(shù)的方法傳遞參數(shù)的方法 有三種:有三種: (1)利用利用寄存器寄存器。使用方便,適合于傳遞。使用方便,適合于
39、傳遞參數(shù)較少參數(shù)較少的的 場合;場合; (2)利用利用堆棧堆棧;例如:;例如:C語言中的動態(tài)存儲區(qū)語言中的動態(tài)存儲區(qū) (3)利用利用內(nèi)存單元內(nèi)存單元。如果使用連續(xù)多個存儲單元:實(shí)。如果使用連續(xù)多個存儲單元:實(shí) 際上是傳遞一片連續(xù)存儲單元的首地址指針,際上是傳遞一片連續(xù)存儲單元的首地址指針, 即:把即:把首地址首地址的偏移地址放在某個的偏移地址放在某個寄存器寄存器里面。里面。 注意,若調(diào)用程序和子程序在注意,若調(diào)用程序和子程序在同一模塊同一模塊(源程序)(源程序) 中,子程序可以直接訪問模塊中的變量。中,子程序可以直接訪問模塊中的變量。 通常情況下,一個子程序或函數(shù):通常情況下,一個子程序或函數(shù)
40、: 只有只有一個入口一個入口:調(diào)用子程序?qū)嶋H上是根據(jù):調(diào)用子程序?qū)嶋H上是根據(jù)CS:IP指向指向 子程序子程序第一條第一條指令的地址;指令的地址; 可以有可以有多個出口多個出口(多條多條RET指令指令); 但返回主程序的同一個位置:但返回主程序的同一個位置:一個斷點(diǎn)一個斷點(diǎn); 實(shí)際上,如果需要、子程序可以提供實(shí)際上,如果需要、子程序可以提供多個入口多個入口:此:此 時,調(diào)用子程序時可以從第二條、第三條指令開始時,調(diào)用子程序時可以從第二條、第三條指令開始 執(zhí)行;執(zhí)行; 類似地,通常、子程序返回時通常是返回到調(diào)用程類似地,通常、子程序返回時通常是返回到調(diào)用程 序的斷點(diǎn),即:序的斷點(diǎn),即:CALL指令
41、的下一條指令。但實(shí)際指令的下一條指令。但實(shí)際 上,如果需要、也可以上,如果需要、也可以不返回斷點(diǎn)不返回斷點(diǎn)(CALL的下一條的下一條 指令指令)、而是返回任意指定的位置、而是返回任意指定的位置。 理解:因?yàn)?,無論是多個入口或多個出口或多個斷理解:因?yàn)?,無論是多個入口或多個出口或多個斷 點(diǎn),本質(zhì)含義都是通過指令引導(dǎo)點(diǎn),本質(zhì)含義都是通過指令引導(dǎo)CPU根據(jù)指定的根據(jù)指定的 CS:IP的內(nèi)容進(jìn)行跳轉(zhuǎn)。的內(nèi)容進(jìn)行跳轉(zhuǎn)。 例例3個個16位操作數(shù)加法程序位操作數(shù)加法程序 解法解法1主程序通過主程序通過內(nèi)存單元內(nèi)存單元(把內(nèi)存單元的首地址放把內(nèi)存單元的首地址放 入入SI)傳遞參數(shù)給傳遞參數(shù)給COMPUTE,通
42、過通過寄存器寄存器BX直接直接 傳遞參數(shù)給子程序傳遞參數(shù)給子程序DISP顯示結(jié)果。顯示結(jié)果。 DATA SEGMENT USE16 NUM DW 1122H DW 3344H DW 5566H ;參數(shù)在存儲單元中參數(shù)在存儲單元中 DATA ENDS STACK_ SEGMENT STACK USE16 DB 100H DUP(?) STACK_ ENDS CODE SEGMENT USE16 ASSUME CS:CODE,DS:DATA,SS:STACK_ BEG:MOV AX,DATA MOV DS,AX MOV ,OFFSET NUM CALL COMPUTE ;BX中為中為3個數(shù)之和個數(shù)
43、之和 ;-COMPUTE-;參數(shù)在數(shù)據(jù)段參數(shù)在數(shù)據(jù)段(DS) ;入口參數(shù):三個入口參數(shù):三個16位加數(shù)放在內(nèi)存位加數(shù)放在內(nèi)存DS:SI開始處開始處 ;出口參數(shù):出口參數(shù):16位和放在位和放在BX中中 ;功能:完成三個功能:完成三個16位數(shù)相加位數(shù)相加 COMPUTE PROC NEAR MOV BX,0 ;累加和累加和 ADD BX,SI+0 ;加第一個數(shù)加第一個數(shù) ADD BX,SI+2 ADD BX,SI+4 ;省略省略DS,參數(shù)在存儲單元中,參數(shù)在存儲單元中 RET COMPUTE ENDP CODE SEGMENT USE16 ASSUME CS:CODE,DS:DATA,SS:STA
44、CK_ BEG:MOV AX,DATA MOV DS,AX MOV ,OFFSET NUM CALL COMPUTE ;BX中為中為3個數(shù)之和個數(shù)之和 CALL DISP MOV AH,4CH INT 21H ;-DISPLAY ;將將BX中的數(shù)值以二進(jìn)制中的數(shù)值以二進(jìn)制 ASCII碼顯示到屏幕碼顯示到屏幕 DISP PROC NEAR MOV CX,16 LAST:MOV DL,0 RCL BX,1 JNC NEXT MOV DL,1 NEXT:MOV AH,2 INT 21H LOOP LAST RET DISP ENDP CODE ENDS END BEG 解法解法2主程序通過主程序通過
45、堆棧堆棧傳遞參數(shù)給子程序傳遞參數(shù)給子程序 COMPUTE DATA SEGMENT USE16 NUM DW 1122H ;加數(shù)加數(shù)N1 DW 3344H ;加數(shù)加數(shù)N2 DW 5566H ;加數(shù)加數(shù)N3 DATA ENDS STACK_ SEGMENT STACK USE16 DB 100H DUP(?) STACK_ ENDS CODE SEGMENT USE16 ASSUME CS:CODE,DS:DATA,SS:STACK_ BEG:MOV AX,DATA MOV DS,AX MOV SI,OFFSET NUM ;圖示:圖示:SP的變化的變化:初始為初始為SP0 PUSH WORD P
46、TR SI+0 ; SP0-2 、 1122H入棧入棧 PUSH WORD PTR SI+2 ; SP0-4 、 3344H入棧入棧 PUSH WORD PTR SI+4 ; SP0-6 、 5566H入棧入棧 CALL COMPUTE ; SP0-8(段內(nèi)段內(nèi)) 、斷點(diǎn)入棧、斷點(diǎn)入棧 XYZ: ;-COMPUTE-;參數(shù)在堆棧段參數(shù)在堆棧段(SS) ; 子程序子程序COMPUTE中:中:SP當(dāng)前值當(dāng)前值: SP0-8 ; 輸入?yún)?shù)輸入?yún)?shù): 在在堆棧中的堆棧中的SS:SP0-8+2,SS:SP0-8+4, ;SS:SP0-8+6中:中:分別為分別為N3, N2, N1 COMPUTE PRO
47、C NEAR MOV BP,SP MOV BX,0 ;累加和累加和 ADD BX,BP+2;操作數(shù)在堆棧中操作數(shù)在堆棧中:N3 ADD BX,BP+4;操作數(shù)操作數(shù)N2 ADD BX,SS:BP+6;操作數(shù)操作數(shù)N1 RET 6; 堆?;謴?fù)原狀堆?;謴?fù)原狀:SP恢復(fù)恢復(fù)初始值初始值SP0 COMPUTE ENDP CODE SEGMENT USE16 ASSUME CS:CODE,DS:DATA,SS:STACK_ BEG:MOV AX,DATA MOV DS,AX MOV SI,OFFSET NUM ;圖示:圖示:SP的變化的變化:初始為初始為SP0 PUSH WORD PTR SI+0 ;
48、 SP0-2 、 1122H入棧入棧 PUSH WORD PTR SI+2 ; SP0-4 、 3344H入棧入棧 PUSH WORD PTR SI+4 ; SP0-6 、 5566H入棧入棧 CALL COMPUTE ; SP0-8(段內(nèi)段內(nèi)) 、斷點(diǎn)入棧、斷點(diǎn)入棧 XYZ:CALL DISP MOV AH,4CH INT 21H ;-DISPLAY DISP PROC NEAR MOV CX,16 LAST:MOV DL,0 RCL BX,1 JNC NEXT MOV DL,1 NEXT:MOV AH,2 INT 21H LOOP LAST RET DISP ENDP CODE ENDS
49、END BEG 解法解法3主程序仍然通過主程序仍然通過內(nèi)存單元內(nèi)存單元(內(nèi)存單元的首地址內(nèi)存單元的首地址 放入放入SI)傳遞參數(shù)給傳遞參數(shù)給COMPUTE。 注意:注意:斷點(diǎn)斷點(diǎn)的含義!的含義! CODE SEGMENT USE16 ASSUME CS:CODE,SS:STACK_ BEG: CALL COMPUTE ;將將OFFSET NUM值壓入堆棧值壓入堆棧 NUM DW 1122H ; CS段段圖示:圖示:數(shù)數(shù)N1 DW 3344H ; 數(shù)數(shù)N2 DW 5566H ; 數(shù)數(shù)N3 ;注意:注意:數(shù)據(jù)定義在代碼段數(shù)據(jù)定義在代碼段!(類似于類似于COM格式格式) ;理解:指令;理解:指令CA
50、LL COMPUTE的的斷點(diǎn)斷點(diǎn)是是下一個存下一個存 儲單元的地址儲單元的地址(內(nèi)容是數(shù)據(jù)內(nèi)容是數(shù)據(jù)22H) !且壓入堆棧。!且壓入堆棧。 此時:此時:斷點(diǎn)斷點(diǎn)指示的存儲單元存放數(shù)據(jù)而指示的存儲單元存放數(shù)據(jù)而不是指令不是指令! XYZ:CALL DISP ; CALL COMPUTE正確斷點(diǎn)正確斷點(diǎn)應(yīng)該是應(yīng)該是XYZ MOV AH,4CH INT 21H ;-COMPUTE-;參數(shù)在參數(shù)在代碼段代碼段(CS) COMPUTE PROC NEAR MOV BP,SP MOV SI,BP+0 ;SI棧頂棧頂OFFSET NUM MOV BX,0 ;初始和為初始和為0 ADD BX,CS:SI+0
51、; 加數(shù)加數(shù)N1;CS不能省略不能省略 ;理解:加數(shù)可以用理解:加數(shù)可以用CS:NUM尋址尋址 ADD BX,CS:SI+2 ; 加數(shù)加數(shù)N2 ADD BX,CS:SI+4 ; 加數(shù)加數(shù)N3 POP AX ;將棧頂元素將棧頂元素OFFSET NUM值拋棄值拋棄 MOV AX,OFFSET XYZ PUSH AX ;把真正的斷點(diǎn)把真正的斷點(diǎn)OFFSET XYZ壓入堆棧壓入堆棧 RET ;彈出斷點(diǎn)彈出斷點(diǎn)IP,返回主程序返回主程序XYZ處處 COMPUTE ENDP ;-DISPLAY DISP PROC NEAR ; 顯示顯示BX中各個二進(jìn)制位中各個二進(jìn)制位 MOV CX,16 LAST:MOV
52、 DL,0 RCL BX,1 JNC NEXT MOV DL,1 NEXT:MOV AH,2 INT 21H LOOP LAST RET DISP ENDP CODE ENDS END BEG 【例例4.31】設(shè)設(shè)NUM開始的單元中存放著開始的單元中存放著10個個無符號無符號字型字型數(shù)組數(shù)組 元素元素,利用利用子程序子程序求出該數(shù)組中求出該數(shù)組中最大值最大值與與最小值最小值,分別存入分別存入 MAX和和MIN單元中。單元中。 解解:說明文件及程序如下說明文件及程序如下: 子程序名子程序名:MAX_MIN 子程序功能子程序功能:求數(shù)組中的最大值與最小值。求數(shù)組中的最大值與最小值。 入口參數(shù)入口參
53、數(shù):SI存放存放數(shù)組首地址數(shù)組首地址,CX存放存放數(shù)組元素個數(shù)數(shù)組元素個數(shù)。 出口參數(shù)出口參數(shù):最大數(shù)存入最大數(shù)存入MAX單元單元,最小數(shù)存入最小數(shù)存入MIN單元單元。 子程序用到的寄存器子程序用到的寄存器:SI、CX、AX和和BX 程序代碼如下程序代碼如下: DATA SEGMENT NUM DW 980,435H,4,547DH,1234H,320H,456H,7890H,234,128 MAX DW ? MIN DW ? DATA ENDS STACK SEGMENT STACK DW 256 DUP(?) TOP LABEL WORD ;TOP為字地址為字地址 STACK ENDS C
54、ODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK MAIN: MOV AX, DATA MOV DS, AX MOV AX, STACK MOV SS, AX MOV SP, OFFSET TOP LEA SI, NUM ;SI指向數(shù)據(jù)緩沖區(qū)指向數(shù)據(jù)緩沖區(qū)第一個第一個數(shù)組元素數(shù)組元素 MOV CX, 9 ;剩余剩余9個個元素需要比較元素需要比較 CALL MAX_MIN MOV AH,CH ;AH00 INT 21H ;返回返回DOS MAX_MIN PROC NEAR PUSH AX PUSH BX PUSH CX PUSH SI MOV AX,SI ;
55、最大數(shù)最大數(shù) MOV BX,AX ;最小數(shù)最小數(shù) LOPX: ADD SI , 2 CMP SI , AX ; 與較大的與較大的AX比較比較 JC MINU ; 如果小于較大的如果小于較大的AX, 則繼續(xù)與較小的則繼續(xù)與較小的BX比比 較較 JZ NEXT;等于;等于AX MOV AX,SI;大于大于AX JMP NEXT;能否省略能否省略 MINU: CMP SI,BX JNC NEXT ;大于大于BX MOV BX,SI;小于小于BX NEXT: LOOP LOPX MOV MAX,AX ;保存較大數(shù)保存較大數(shù) MOV MIN,BX ;保存較小數(shù)保存較小數(shù) POP SI POP CX PO
56、P BX POP AX RET MAX_MIN ENDP CODE ENDS END MAIN 設(shè)計(jì)子程序時應(yīng)注意的問題:設(shè)計(jì)子程序時應(yīng)注意的問題: 1子程序說明;子程序說明; 2寄存器的保存與恢復(fù);寄存器的保存與恢復(fù); 3密切注意堆棧狀態(tài)。密切注意堆棧狀態(tài)。 若調(diào)用程序和子程序在若調(diào)用程序和子程序在同一模塊同一模塊中,子程序可以直中,子程序可以直 接訪問模塊中的變量。接訪問模塊中的變量。 例實(shí)現(xiàn)例實(shí)現(xiàn)數(shù)組求和數(shù)組求和功能。要求數(shù)組求和(不考慮溢功能。要求數(shù)組求和(不考慮溢 出情況)由子程序?qū)崿F(xiàn),其數(shù)組元素及結(jié)果均為字出情況)由子程序?qū)崿F(xiàn),其數(shù)組元素及結(jié)果均為字 型數(shù)據(jù)。型數(shù)據(jù)。 STACKS
57、G SEGMENT STACK STK DW 32 DUP(S) STACKSG ENDS DATA SEGMENT ARY DW 1,2,3,4,5,6,7,8,9,10 COUNT DW ($-ARY)/2;數(shù)組元素個數(shù)數(shù)組元素個數(shù) SUM DW ?;數(shù)組和的地址數(shù)組和的地址 DATA ENDS CODE1 SEGMENT MAIN PROC FAR ASSUME CS:CODE1,DS:DATA PUSH DS XOR AX,AX PUSH AX MOV AX,DATA MOV DS,AX CALL FAR PTR ARY_SUM RET MAIN ENDP CODE1 ENDS COD
58、E2 SEGMENT ASSUME CS:CODE2 ARY_SUM PROC FAR;數(shù)組求和子程序數(shù)組求和子程序 PUSH AX;保存寄存器保存寄存器 PUSH CX PUSH SI LEA SI,ARY;取數(shù)組起始地址取數(shù)組起始地址 MOV CX,COUNT;取元素個數(shù)取元素個數(shù) XOR AX,AX;清清0累加器累加器 NEXT: ADD AX,SI;累加和累加和 ADD SI,TYPE ARY;修改地址指針修改地址指針 LOOP NEXT MOV SUM,AX;存和存和 POP SI;恢復(fù)寄存器恢復(fù)寄存器 POP CX POP AX RET ARY_SUM ENDP CODE2 END
59、S END MAIN 通過通過地址表地址表傳遞參數(shù)地址傳遞參數(shù)地址 適用于參數(shù)較多的情況。具體方法是先建立適用于參數(shù)較多的情況。具體方法是先建立 一個地址表,該表由參數(shù)地址構(gòu)成。然后把一個地址表,該表由參數(shù)地址構(gòu)成。然后把 表的首地址通過寄存器或堆棧傳遞給子程序。表的首地址通過寄存器或堆棧傳遞給子程序。 例編寫一個數(shù)組求和子程序,其數(shù)組元素例編寫一個數(shù)組求和子程序,其數(shù)組元素 及結(jié)果均為字型數(shù)據(jù)。另定義兩個數(shù)組,并及結(jié)果均為字型數(shù)據(jù)。另定義兩個數(shù)組,并 編寫一個主程序,通過調(diào)用數(shù)組求和子程序編寫一個主程序,通過調(diào)用數(shù)組求和子程序 分別求出兩個數(shù)組的和。分別求出兩個數(shù)組的和。 STACKSG S
60、EGMENT STACK STK DW 32 DUP(S) STACKSG ENDS DATA SEGMENT ARY DW 1,2,3,4,5,6,7,8,9,10 ;數(shù)組數(shù)組1 COUNT DW ($-ARY)/2;數(shù)組數(shù)組1的元素個數(shù)的元素個數(shù) SUM DW ?;數(shù)組數(shù)組1的和地址的和地址 NUM DW 10,20,30,40,50;數(shù)組數(shù)組2 CT DW ($-NUM)/2;數(shù)組數(shù)組2的元素個數(shù)的元素個數(shù) TOTAL DW ?;數(shù)組數(shù)組2的和地址的和地址 TABLE DW 3 DUP(?);地址表地址表 DATA ENDS CODE1SEGMENT MAINPROC FAR ASSUM
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 承攬房屋裝修工程合同
- 房地產(chǎn)轉(zhuǎn)讓合同集錦
- 兼職勞務(wù)合同
- 人力資源服務(wù)合同
- 德漢翻譯服務(wù)合同
- 節(jié)能設(shè)備購銷合同協(xié)議
- 禽蛋類采購合同
- 物業(yè)管理市場分析與競爭策略
- 爆破工程技術(shù)服務(wù)合同
- 軟件銷售代理合作合同
- 全國大學(xué)生英語競賽詞匯大綱
- 情緒障礙跨診斷治療的統(tǒng)一方案
- 聚焦幼兒作品分析的游戲觀察與評價
- 胸外科手術(shù)圍手術(shù)期處理
- 《企業(yè)管理課件:團(tuán)隊(duì)管理知識點(diǎn)詳解PPT》
- 配網(wǎng)設(shè)備缺陷分類及管理重點(diǎn)標(biāo)準(zhǔn)
- 反腐倡廉廉潔行醫(yī)
- UI與交互設(shè)計(jì)人機(jī)交互設(shè)計(jì)(第二版)PPT完整全套教學(xué)課件
- 《插畫設(shè)計(jì)》課程標(biāo)準(zhǔn)
- 高考作文答題卡(作文)
- 在鄉(xiāng)村治理中深化推廣運(yùn)用清單制、積分制、一張圖工作方案
評論
0/150
提交評論