基本結(jié)構(gòu)程序設(shè)計(jì)方法_第1頁
基本結(jié)構(gòu)程序設(shè)計(jì)方法_第2頁
基本結(jié)構(gòu)程序設(shè)計(jì)方法_第3頁
基本結(jié)構(gòu)程序設(shè)計(jì)方法_第4頁
基本結(jié)構(gòu)程序設(shè)計(jì)方法_第5頁
已閱讀5頁,還剩81頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第五節(jié)基本結(jié)構(gòu)程序設(shè)計(jì)方法一、順序程序設(shè)計(jì)二、

分支程序設(shè)計(jì)三、循環(huán)程序設(shè)計(jì)四、子程序設(shè)計(jì)

1概述匯編語言程序設(shè)計(jì)的一般步驟流程圖2匯編語言程序設(shè)計(jì)的一般步驟匯編語言程序設(shè)計(jì)一般有以下幾個(gè)步驟:1.分析問題,確定算法2.繪制流程圖3.根據(jù)流程圖編制程序4.調(diào)試程序3流程圖1.流程圖的概念 流程圖是由特定的幾何圖形、指向線、文字說明來表示數(shù)據(jù)處理的步驟,形象描述邏輯控制結(jié)構(gòu)以及數(shù)據(jù)流程的示意圖。流程圖具有簡潔、明了、直觀的特點(diǎn)。2.流程圖符號(hào)表示(1)起止框:表示程序的開始和結(jié)束。起止框4(2)判斷框

(3)處理框

(4)調(diào)用框

5(5)指向線

(6)連接框

6一、順序程序設(shè)計(jì)順序結(jié)構(gòu)順序結(jié)構(gòu)的程序一般是簡單程序,其特點(diǎn)是程序順序執(zhí)行,無分支,無循環(huán)與轉(zhuǎn)移。例4.4內(nèi)存中TABLE開始存放0~9的平方值,通過人機(jī)對話,對任意給定的數(shù)(0~9),查表得的平方值,將其放在AL中。datasegmenttabledb0,1,4,9,16,25,36,49,64,81dufdb’pleaseinputontnumber(0~9):’0dh,0ah,’$’dataendsstacksegmentparastack’stack’stapadb100dup(?)codesegmentassumecs:code,ds:data,ss:stack7start:pushaxmovax,datamovds,axmovax,stackmovss,axmovsp,topmovbx,offsettablenext:movdx,offsetbuf;9號(hào)功能調(diào)用,顯示字符串,提示輸入一個(gè)數(shù)movah,9int21h8movah,1;1號(hào)功能調(diào)入,等待鍵入一個(gè)數(shù)且送ALint21hmovah,0;查表得鍵入數(shù)的平方值andal,0fh;屏蔽高4位addbx,axmoval,[bx]movah,4chint21hcodeendsendstart9

二、分支結(jié)構(gòu)一個(gè)大的程序完全順序結(jié)構(gòu)實(shí)際上并不可能,經(jīng)常會(huì)遇到有分支的情況,分支結(jié)構(gòu)程序通常采用條件轉(zhuǎn)移或轉(zhuǎn)移表來實(shí)現(xiàn)。典型的分支結(jié)構(gòu)如教材圖4.3所示。下面舉例說明分支結(jié)構(gòu):例4.5給符號(hào)函數(shù)建立標(biāo)志。=1當(dāng)>0符號(hào)函數(shù)y=0當(dāng)=0=-1當(dāng)<0要實(shí)現(xiàn)符號(hào)函數(shù),只要把從內(nèi)存中取出來,執(zhí)行一次“與”或“或”操作,就可以把的數(shù)值特征反映在標(biāo)志上,再根據(jù)標(biāo)志來轉(zhuǎn)移。程序框圖如教材圖4.4所示。10源程序序如下下:datasegmentxdw15ydw?dataendsstacksegmentstack’’stack’db100dup(?)stackendscodesegmentassumecs:code,ds:data,ss:stack11start:pushaxmovax,datamovds,axmovax,xandax,axjzxerojnszeromovbx,offffhjmpdone12zero:movbx,0jmpdoneplus:movbx,1done:movy,bxmovah,4chint21hcodeendsendstart13三、循循環(huán)結(jié)結(jié)構(gòu)循環(huán)結(jié)結(jié)構(gòu)是是程序序設(shè)計(jì)計(jì)中最最常用用的結(jié)結(jié)構(gòu)。。凡需需要重重復(fù)做做的工工作,,在計(jì)計(jì)算機(jī)機(jī)中都都可以以用循循環(huán)結(jié)結(jié)構(gòu)程程序來來實(shí)現(xiàn)現(xiàn)。循循環(huán)程程序有有兩種種結(jié)構(gòu)構(gòu)形式式,一一種是是“先先執(zhí)行行,后后判斷斷”,,另一一種為為“先先判斷斷,后后執(zhí)行行”。。這后后一種種結(jié)構(gòu)構(gòu)實(shí)現(xiàn)現(xiàn)上允允許0次循循環(huán),,因而而對有有些程程序更更有效效,它它適合合于循循環(huán)次次數(shù)不不固定定的程程序。。14循環(huán)程程序的的常見見結(jié)構(gòu)構(gòu)形式式15無論哪哪種循循環(huán)結(jié)結(jié)構(gòu),,都包包括以以下四四個(gè)部部分::(1))初始始化::為循循環(huán)作作準(zhǔn)備備,設(shè)設(shè)置循循環(huán)計(jì)計(jì)數(shù)值值,設(shè)設(shè)置變變量初初值。。(2))循環(huán)環(huán)體::循環(huán)環(huán)部分分的核核心,,包括括循環(huán)環(huán)的全全部指指令。。(3))修改改參數(shù)數(shù):修修改操操作數(shù)數(shù)地址址,為為下次次循環(huán)環(huán)作準(zhǔn)準(zhǔn)備。。(4))循環(huán)環(huán)控制制:修修改計(jì)計(jì)數(shù)器器值,,判斷斷循環(huán)環(huán)控制制條件件,決決定是是否跳跳出循循環(huán)。。對“先先執(zhí)行行,后后判斷斷”結(jié)結(jié)構(gòu),,進(jìn)入入循環(huán)環(huán)后至至少要要執(zhí)行行一次次循環(huán)環(huán)體,,再判判判斷斷循環(huán)環(huán)是否否結(jié)束束。對對“先先判斷斷,后后執(zhí)行行”結(jié)結(jié)構(gòu),,進(jìn)入入循環(huán)環(huán)后,,先判判斷循循環(huán)結(jié)結(jié)構(gòu)條條件,,再?zèng)Q決定是是否執(zhí)執(zhí)行循循環(huán)體體,可可能循循環(huán)體體一次次也不不執(zhí)行行,即即循環(huán)環(huán)次數(shù)數(shù)為0。16例4.6若將將內(nèi)存2000H:0100H開始始的256個(gè)個(gè)字節(jié)的數(shù)據(jù)據(jù)塊移動(dòng)到內(nèi)內(nèi)存2000H:0200Hmovax,2000h;;初始化,,為循環(huán)工作作準(zhǔn)備movds,axmovsi,0100h;;設(shè)置源數(shù)數(shù)據(jù)塊地址指指針movdi,0200h;;設(shè)置目的的地址指針movcx,100h;;設(shè)置循環(huán)環(huán)次數(shù)next:moval,[si];;循循環(huán)體mov[di],alincsi;;修改參數(shù)數(shù)incdiloopnext;;循環(huán)控制制movah,4chint21h17例4.7BX寄存器器中有一個(gè)16位二進(jìn)制制數(shù),編程統(tǒng)統(tǒng)計(jì)該數(shù)中1的個(gè)數(shù),將將其結(jié)果放到到CL寄存器器中。xorcl,cl;;初始化,,為循環(huán)作準(zhǔn)準(zhǔn)備lopl:andbx,bx;;循環(huán)控制jzstopshlbx,1::循環(huán)體jnclop1inccljmplop1stop:movah,4ch;;程程序中止int21h18有些循環(huán)結(jié)構(gòu)構(gòu)比較復(fù)雜,,需要用多重重循環(huán)完成。。多重循環(huán)設(shè)設(shè)計(jì)方法與單單重循環(huán)設(shè)計(jì)計(jì)方法相,但但應(yīng)注意:(1)各重循循環(huán)的初始控控制條件及程程序?qū)崿F(xiàn)。(2)內(nèi)循環(huán)環(huán)可以嵌套在在外循環(huán)中,,也可以多層層嵌套,但各各層循環(huán)這間間不能交叉,,可以從內(nèi)循循環(huán)跳到外循循環(huán),不可以以從外循環(huán)中中直接跳進(jìn)內(nèi)內(nèi)循環(huán)。(3)防止出出沒死循環(huán),,即不能讓循循環(huán)回到初始始條件,引起起死循環(huán)。例4.8設(shè)設(shè)有N個(gè)符符號(hào)數(shù),要求求將這N個(gè)數(shù)數(shù)由小到大排排列。采用冒泡排序序法。從第一一個(gè)數(shù)據(jù)開始始相信的數(shù)進(jìn)進(jìn)行比較,若若次序不對,,兩數(shù)交換位位置。第一遍遍就完成了排排序,這樣共共有兩重循環(huán)環(huán)19datasegmentbufdb15h,37h,86hdb0a7h,0c8h,90h,7eh,50hdb80h,23hcoutequ$-bufdataendsstacksegmentstack’’stack’sapdb100dup(?)topequlengthsapstackendscodesegmentassumecs:code,ds:data,ss:stack20start:movax,datamovds,axmovax,stackmovss,axmovsp,topmovbx,offsetbufmovcx,cout-121lpo1:movdx,cxlpo2:moval,[bx]cmpal,[bx+1]jlenextxchgal,[bx+1]mov[bx],almext:incbxlooplop2movcx,dxlooplop1movah,4chint21hcodeendsendstart22四、子程序結(jié)結(jié)構(gòu)若一段指令語語句在一個(gè)程程序中多次使使用,或在多多個(gè)程序中用用到,則通常常把這段指令令語句當(dāng)作一一個(gè)獨(dú)立的模模塊處理,這這段模塊稱為為子程序或““過程”。需需要執(zhí)行這個(gè)個(gè)模塊時(shí),就就進(jìn)行過程調(diào)調(diào)用,執(zhí)行完完畢后,再返返回原來調(diào)用用它的程序。。采用子程序序結(jié)構(gòu)編程,,使程序結(jié)構(gòu)構(gòu)模塊化,清清晰明了,容容易修改。在在匯編語言中中,每一個(gè)子子程序都包括括在過程定義義語句PROC…ENDP中間。過過程定義有屬屬性NEAR或FAR,,若調(diào)用子程程序的程序在在同一代碼段段中,則用NEAR屬性性,若不在同同一段中,使使用FAR屬屬性。231.子程序序清單通常編寫子程程序或過程時(shí)時(shí),寫一個(gè)子子程序說明或或清單,能使使模塊結(jié)構(gòu)一一目了然,且且使調(diào)用者知知道如何使用用該程序。子子程序清單包包括:(1)子程序序的名稱,功功能說明;(2)子程序序中用到的寄寄存器和存儲(chǔ)儲(chǔ)單元;(3)子程序序的入口參數(shù)數(shù),出口參數(shù)數(shù);(4)子程序序中調(diào)用其他他子程序的名名稱。242.參數(shù)傳傳遞方法主程序與子程程序相互之間間可以傳遞參參數(shù)。在許多多情況下,希希望子程序更更具有通用性性,更靈活,,這時(shí)就希望望子程序除了了有使用說明明外,還能夠夠接受調(diào)用程程序傳來的入入口參數(shù),在在子程序執(zhí)行行完畢后把出出口參數(shù)傳遞遞給調(diào)用程序序。參數(shù)的傳傳遞通有三種種方法:(1)用寄存存器傳遞:適適合于參數(shù)較較少的情況,,傳遞速度較較較快;(2)用存儲(chǔ)儲(chǔ)器傳遞:適適合參數(shù)較多多的情況,需需要先在存儲(chǔ)儲(chǔ)器中建立一一個(gè)參數(shù)表。。(3)用堆棧棧傳遞:適合合于參數(shù)較多多且子程序有有嵌套、遞歸歸調(diào)用的情況況。25例4.11在在數(shù)據(jù)段段中定義了兩兩個(gè)數(shù)組,編編程實(shí)現(xiàn)數(shù)組組分別求和。。datasegmentart1db12,23,34,45,56,67,78,89,90,18contlequ$-ary1sum1dw?ary2db13h,24h,57h,68h,9ah,0bch,0cdh,0deh,80h,80hcont2equ$-ary2sum2dw?dataendscodesegmentassumecs:code,cs:data26start:movax,datamovds,axleasiary1;;入口參數(shù),,數(shù)據(jù)塊1首首址movcx,cont1;;入口參數(shù),,數(shù)據(jù)塊1長長度callsum;;調(diào)用求和子子程序leasi,ary2;;入口參數(shù),,數(shù)據(jù)塊2首首址movcx,cont2;;入口參數(shù),,數(shù)據(jù)塊2長長度callsummovah,4chint21h27sumproc;;子程序序sumxorax,ax;;ax清0,,存放和next1:addal,[si];;數(shù)組組元素相加adcah,0;;高位放在ah中incsiloopmext1mov[si],ax;;數(shù)組和存入入內(nèi)存單元retsumendpcodeendsendstar28【例4.8】試編寫一程程序,要求比比較兩個(gè)字符符串STR1和STR所含字符是否否相同,若相相同則顯示‘‘MATCH!’,若不相相同則顯示‘‘NOMATCH!’。(程序序略)其流程圖如圖圖4.7所示。29圖4.7程序流程圖30【例4.9】】試編一個(gè)程程序?qū)⒆謫卧狟UF中所所含1的個(gè)數(shù)數(shù)存入COUNT單元中中。要測出BUF字單元所含含1的個(gè)數(shù),,首先將BUF中的數(shù)送送給寄存器AX,然后將將AX寄存器器邏輯左移一一次,如果CF=1,則則表明AX中中的最高位為為1,則計(jì)數(shù)數(shù)器CL計(jì)數(shù)數(shù)1次,如果果CF=0,,表明AX最最高位為0,,這樣依次將將最高位移入入CF中去測測試。移位之之后,判斷AX的值是否否為0,如果果為0則結(jié)束束循環(huán),不為為0,則繼續(xù)續(xù)循環(huán)。其流程圖如圖圖4.8所示示。2.條件控制制3132程序如下:STACKSEGMENTSTACKDB200DUP(0)STACKEDNSDATASEGMENTCOUNTDB?DATAENDSCODESEGMENTASSUMEDS:DATA,CS:CODE,SS:STACK33START::MOV AX,DATAMOV DS,AXMOV AX,BUFMOV CL,0 ;計(jì)計(jì)數(shù)器為0LOPA:ANDAX,AX;使CF位為0JE EXIT ;(AX)=0,,結(jié)束循環(huán)SHLAX,1;;AX左移移一位JNC LOPAINC CL;產(chǎn)生進(jìn)位,,(CL)+1→CLJMPLOPAEXIT:MOVCOUNT,,CLMOV AH,4CHINT 21HCODEENDSEND START34多多重循環(huán)環(huán)程序設(shè)計(jì)【例4.10】在以BUF為首址的的字存儲(chǔ)區(qū)中中存放有N個(gè)個(gè)有符號(hào)數(shù),,現(xiàn)需將它們們按大到小的的順序排列在在BUF存儲(chǔ)儲(chǔ)區(qū)中,試編編寫其程序。。我們采用冒泡排序算法從第一個(gè)個(gè)數(shù)開始依次次對相鄰兩個(gè)個(gè)數(shù)進(jìn)行比較較,如次序?qū)?,則不交換換兩數(shù)位置;;如次序不對對則使這兩個(gè)個(gè)數(shù)交換位置置。可以看出出,第一遍需比較較(N-1))次,此時(shí),最小的數(shù)已經(jīng)經(jīng)放到了最后后;第二遍比較只只需考慮剩下下的(N-1)個(gè)數(shù),即即只需比較((N-2)次次;第三遍只需需比較(N-3)次,………整個(gè)排序序過程最多需需(N-1)遍遍。如下面的4個(gè)數(shù)即是采采用冒泡排序序比較的例子子。35數(shù)10 816 9032第一遍10 1690 32 8第二遍16 9032 10 8第三遍90 3216 10 8程序流程圖如如圖4.9所示。3637程序如下:DATASEGMENTBUF DW3,-4,6,7,9,2,,0,-8,,-9,-10,20N=($-BUF)/2DATAENDSSTACKSEGNMENTSTACKDB200DUP(0)STACKENDSCODESEGMENTASSUMECS::CODE,,DS:DATA,SS:STACK38START:: MOVAX,DATAMOVDS,AXMOVCX,NDECCX;設(shè)計(jì)數(shù)數(shù)器CX內(nèi)循循環(huán)39LOOP1: MOVDX,CX;設(shè)計(jì)數(shù)數(shù)器DX外循循環(huán)MOVBX,0LOOP2: MOVAX,BUF[BX]CMPAX,BUF[BX+2]JGEL;>=,不不變,否則交交換XCHGAX,BUF[BX+2]MOVBUF[BX],AXL: ADD BX,2DECCXJNELOOP2;相當(dāng)于LOOPLOOP2MOVCX,DX;;LOOPLOOP140MOV AH,4CHINT 21HCODEENDSEND START程序運(yùn)行后,,BUF區(qū)中中的內(nèi)容如下下:20,9,7,6,3,,2,0,-4,-8,,-9,-10若要對N個(gè)無無符號(hào)數(shù)按由由小到大的順順序排列,只只需將指令“JGEL”改改為“JLEL”即即可。414.5子程序設(shè)計(jì)子子程序的的概念子子程序的的定義子子程序設(shè)設(shè)計(jì)方法子子程序應(yīng)應(yīng)用舉例子子程序的的嵌套與遞歸歸調(diào)用42子子程序的的概念在程序設(shè)計(jì)中中,我們會(huì)發(fā)發(fā)現(xiàn)一些多次次無規(guī)律重復(fù)的的程序段或語句序列。解決此類問問題一個(gè)行之之有效的方法法就是將它們們設(shè)計(jì)成可供供反復(fù)調(diào)用的的獨(dú)立的子程序序結(jié)構(gòu),以便在在需要時(shí)調(diào)用用。在匯編語語言中,子程程序又稱過程。調(diào)用子程序的的程序稱為主主調(diào)程序或主主程序。43子子程序的的定義子程序的定義義是由過程定定義偽指令PROC和ENDP來完完成的。其格格式如下:過程名PROC[NEAR/FAR]┆過程名ENDP其中PROC表示過程定義開始始,ENDP表示過程定義結(jié)束束。過程名是過過程入口地址址的符號(hào)表示示。一般過程名同同標(biāo)號(hào)一樣,,具有三種屬屬性,即段屬屬性、偏移地地址屬性以及及類型屬性。。44子子程序設(shè)設(shè)計(jì)方法1.信息的保護(hù)護(hù)與恢復(fù)2.主程序與子子程序參數(shù)傳傳遞方式451.信息的保保護(hù)與恢復(fù)例如:若子子程序PROG中改變了寄寄存器AX,BX,CX,DX的值,則可可采用如下下方法保護(hù)護(hù)和恢復(fù)現(xiàn)現(xiàn)場。PROGPROCPUSHAXPUSHBXPUSHCX;保護(hù)現(xiàn)場場PUSHDX┆46┆POPDXPOPCXPOPBX;恢復(fù)現(xiàn)場場POPAXRET;返回?cái)帱c(diǎn)點(diǎn)處PROCENDP472.主程序序與子程序序參數(shù)傳遞遞方式(1)寄存器法法(2)約定單元元法(3)堆棧法484.5.4子程程序應(yīng)用舉舉例【例4.12】將一個(gè)給給定的二進(jìn)進(jìn)制數(shù)按位位轉(zhuǎn)換成相相應(yīng)的ASCII碼字符串,,送到指定定的存儲(chǔ)單單元并顯示示。如二進(jìn)進(jìn)制數(shù)10010011轉(zhuǎn)換成字符符串為‘10010011’。要求將將轉(zhuǎn)換過程程寫成子程程序,且子子程序應(yīng)具具有較好的的通用性,,而必須能能實(shí)現(xiàn)對8倍和16倍二進(jìn)制數(shù)數(shù)的轉(zhuǎn)換。。49入口參數(shù):DX存放待轉(zhuǎn)換換的二進(jìn)制制數(shù)CX存放待轉(zhuǎn)換換數(shù)的位數(shù)數(shù)(8位或16位)DI存放ASCII碼首地址出口參數(shù):轉(zhuǎn)換后的字字符串存放放在以DI作指針的字字節(jié)存貯區(qū)區(qū)中程序如下::DATASEGMENTNUM8DB93HNUM16 DW0ABCDHASCBUF DB 20DUP(0)DATAENDS50CODESEGMENTASSUMEDS:DATA,CS:CODE,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVDX,0MOVDL,NUM8;;轉(zhuǎn)換二進(jìn)進(jìn)制數(shù)送DXMOVCX,8;;置位位數(shù)8LEADI,ASCBUF;;字字符串首址址→DICALLBTASC;調(diào)用子程程序BTASCMOVBYTEPTR[DI],0DHMOVBYTEPTR[DI+1],0AH51MOVBYTEPTR[DI+2],‘$’LEADX,ASCBUFMOVAH,9INT21HMOVDX,NUM16MOVCX,16;置位數(shù)16LEADI,ASCBUFCALLBTASCMOVBYTEPTR[DI],0DHMOVBYTEPTR[DI+1],0AHMOVBYTEPTR[DI+2],‘$’;顯示轉(zhuǎn)換后后的字符串串LEADX,ASCBUFMOVAH,9INT21H52BTASC PROCPUSHAX;保存AXMOVAL,0CMPCX,8;比較8位數(shù)JNEL1;直接轉(zhuǎn)換換16位數(shù)MOVDH,DL;8位數(shù)轉(zhuǎn)換送送DHL1:ROLDX,,1;DX最高位移入入CFRCLAL,1;CF移入AL最低位ADDAL,30HMOV[DI],ALINCDILOOPL1POPAXRETBTASC ENDP53CODEENDSENDSTART544.5.5子程程序的嵌套套與遞歸調(diào)調(diào)用1.子程序的的嵌套子程序不但但可以被主主程序調(diào)用用,而且也也可以被其其他子程序序調(diào)用。我我們把一個(gè)個(gè)子程序調(diào)調(diào)用另一個(gè)個(gè)子程序稱稱為子程序序的嵌套調(diào)調(diào)用。2.子程序的的遞歸調(diào)用用子程序的遞遞歸調(diào)用是是指一個(gè)子子程序直接接或間接地地調(diào)用自己己。遞歸子子程序一般般對應(yīng)于數(shù)數(shù)學(xué)上對函函數(shù)的遞歸歸定義,它它往往能設(shè)設(shè)計(jì)出效率率較高的程程序,完成成相當(dāng)復(fù)雜雜的計(jì)算,,因而是很很有用的。。55【例4.16】計(jì)算5!的程序示示例,RESULT是保存階乘乘的存儲(chǔ)單單元。程序如下::STACK SEGMENTSTACKDB200DUP(0)STACK ENDSDATASEGMENTN DW5RESULT DW?DATAENDSCODESEGMENTASSUMECS:CODE,SS:STACK,DS:DATA56START:MOVAX,DATAMOVDS,AXMOVAX,NCALLFACTMOVAX,RESULTMOVAH,4CHINT21H57FACTPROCCMPAX,0JNEL1MOVRESULT,1JMPEXITL1:PUSHAXDECAXCALLFACTPOPAXMOVRESULT,AXEXIT:RETFACTENDPCODEENDSENDSTART584.6模塊化程序序設(shè)計(jì)1.PUBLIC偽指令格式:PUBLIC符號(hào)[,符號(hào)]功能:說明明其后的符符號(hào)是全局局符號(hào)。全局符號(hào)能能被其他模模塊引用。。2.EXTRN偽指令格式:EXTRN符號(hào):類型型[,符號(hào):類類型]功能:說明明在本模塊中需需要引用的的、由其他模塊塊定義的符符號(hào),即外外部符號(hào)。59【例4.17】用模塊化化程序設(shè)計(jì)計(jì)方法建立立兩個(gè)模塊塊MOD1ASM和MOD2ASM的數(shù)據(jù)通訊訊。NAMEMOD1EXTRNDISP:FARPUBLICSTR1,N,BUFDATA1 SEGMENTSTR1DB‘HOWDOYOUDO?’N =$-STR1BUFDB‘THISISANEXAMPLEOFMODULESPROGRAM$′DATAENDS60STACK SEGMENTSTACKDB200DUP(0)STACK ENDSCODE1 SEGMENTASSUMECS:CODE1,DS:DATA1,SS:STACKSTART:MOVAX,DATAMOVDS,AXCALLDISPMOVAH,4CHINT21HCODE1 ENDSENDSTART61NAMEMOD2EXTRNSTR1:BYTE,STR2:BYTE,N:ABSPUBLICDISPDATA2 SEGMENTSTR2DB81DUP(0)DATA2 ENDSCODE2 SEGMENTASSUMECS:CODE2,ES:DATA2DISPPROC FARMOVAX,DATA2MOVES,AX62LEABX,STR1MOVCX,NLEASI,STR2NEXT:MOVAL,[BX]MOVES:[SI],ALINCBXINCSILOOPNEXTLEADX,BUFMOVAH,9INT21HRETDISPENDPCODE2 ENDSEND63典型問題的的編程思路路一、進(jìn)進(jìn)制轉(zhuǎn)換1.十進(jìn)制制轉(zhuǎn)換成十十六進(jìn)制數(shù)數(shù)4.16以兩個(gè)字87654321為例:0*10+8=AXAX*10+7=AXAH為全0AL*10+6=AXAX*10+5=DX,AXDX為為全0以字為單位位按上述方方法進(jìn)行轉(zhuǎn)轉(zhuǎn)換,再將將高位字轉(zhuǎn)轉(zhuǎn)換結(jié)果*10000+低位位字。2.十六進(jìn)轉(zhuǎn)換換成十進(jìn)制制制數(shù)除10例4.3中給出。3.二進(jìn)制轉(zhuǎn)換換成十六進(jìn)進(jìn)制數(shù)4.16給出。64二、鍵盤盤輸入與屏屏幕顯示1.顯示字字符串在數(shù)據(jù)段設(shè)設(shè)置字符串串,以’$’結(jié)束。。(4.2)MOVDX,字字符串首首址MOVAH,9INT21H2.人機(jī)對對話(4.2)第一步:用用顯示字符符串功能顯顯示計(jì)算機(jī)機(jī)提問內(nèi)容容(9號(hào)功功能調(diào)用)。第二步:鍵鍵盤輸入接接受用戶選選擇(0A號(hào)功能調(diào)調(diào)用)。第三步:顯顯示用戶輸輸入內(nèi)容(9號(hào)功能能調(diào)用)。。653.?dāng)?shù)值顯顯示第一步:把把字節(jié)數(shù)據(jù)據(jù)分解為2個(gè)1位十十六進(jìn)制數(shù)數(shù)。第二步:1位十六進(jìn)進(jìn)制數(shù)轉(zhuǎn)換換為ASCII碼后后再以字符符顯示。注:0-9的ASCII碼為為30-39H,A-F的ASCII碼為41-46H。轉(zhuǎn)換方法(AL低4位存有1位十六進(jìn)進(jìn)制數(shù)轉(zhuǎn)換換方法)::方法一:DAAADDAL,0F0HADCAL,40H66方法二:ADDAL,90HDAAADCAL,40HDAA方法三:CMPAL,10JBSADDAL,7S:ADDAL,30H674.日期顯顯示4.3第一步:DOS系統(tǒng)統(tǒng)功能調(diào)用用,取日期期功能2A第二步:將將得到的日日期進(jìn)行轉(zhuǎn)轉(zhuǎn)換第三步:將將轉(zhuǎn)換后的的日期輸出出顯示68三、、多多字字節(jié)節(jié)運(yùn)運(yùn)算算1..組組合合型型BCD碼碼求求和和程程序序4.18從多多字字節(jié)節(jié)低低位位開開始始計(jì)計(jì)算算,,事事先先將將串串操操作作相相關(guān)關(guān)初初始始條條件件給給出出。。do:lodsbadcal,[bx];如如果果是是兩兩個(gè)個(gè)組組合合型型BCD碼碼求求差差計(jì)計(jì)算用用sbb語語句句,,daa改改成成dasdaa;如如果果是是兩兩個(gè)個(gè)二二進(jìn)進(jìn)制制數(shù)數(shù)據(jù)據(jù)求求和和該該句句省省略略stosbdecbxloopdo2..組合合型型BCD碼碼求求差差程程序序3..二進(jìn)進(jìn)制制數(shù)數(shù)據(jù)據(jù)求求和和4.11或或采采用用串串操操作作方方法法如如上上69四、、數(shù)數(shù)據(jù)據(jù)排排序序與與檢檢索索排序序從從大大到到小小,,或或從從小小到到大大;;4.9檢索索最最大大值值,,最最小小值值;;4.10五、、統(tǒng)統(tǒng)計(jì)計(jì)、、求求和和、、求求平平均均值值統(tǒng)計(jì)計(jì)某某數(shù)數(shù)中中1的個(gè)個(gè)數(shù)數(shù),,正正數(shù)數(shù)、、負(fù)負(fù)數(shù)數(shù)、、零零的的個(gè)個(gè)數(shù)數(shù);;4.7,求和和如如三三;;求平平均均值值;;70例3,取取當(dāng)當(dāng)前前日日期期,并并顯顯示示第一一步步:取取日日期期,并并保保存存第二二步步:將將日日期期轉(zhuǎn)轉(zhuǎn)換換為為ASCII碼碼第三三步步:顯顯示示字字符符串串Bx內(nèi)內(nèi)容容最最低低位位開開始始數(shù)據(jù)據(jù)傳傳送送AL\AX除10,商商AL/AX,余余數(shù)數(shù)DL/DX取余余數(shù)數(shù)DL/DX+30→→ASCII碼碼71一、、順順序序結(jié)結(jié)構(gòu)構(gòu)例4.4三三個(gè)個(gè)步步驟驟通通過過人人機(jī)機(jī)對對話話查查表表得得某某數(shù)數(shù)的的平平方方值值顯示示字字符符串串提提示示輸輸入入一一個(gè)個(gè)數(shù)數(shù):9號(hào)號(hào)功功能能輸入入一一個(gè)個(gè)字字符符:1號(hào)號(hào)功功能能得得出出ASCII值值查表表BX:表表的的首首地地址址AL:指指出出待待查查的的值值A(chǔ)L與與0F使使之之小小于于16XLAT得得到到的的值值送送到到AL72二、、分分支支結(jié)結(jié)構(gòu)構(gòu)條件件轉(zhuǎn)轉(zhuǎn)移移或或轉(zhuǎn)轉(zhuǎn)移移表表例4.5見見書書中中流流程程三、、循循環(huán)環(huán)結(jié)結(jié)構(gòu)構(gòu)初始始化化循環(huán)環(huán)次次數(shù)數(shù)固固定定:串操操作作loop循環(huán)環(huán)次次數(shù)數(shù)不不固固定定:跳跳轉(zhuǎn)轉(zhuǎn)指指令令DO-WHILE循環(huán)環(huán)體體修改改參參數(shù)數(shù)循環(huán)環(huán)控控制制73例4.7統(tǒng)統(tǒng)計(jì)計(jì)BX寄寄存存器器中中二二進(jìn)進(jìn)制制數(shù)數(shù)的的1的的個(gè)個(gè)數(shù)數(shù)兩兩個(gè)個(gè)RegCL:統(tǒng)統(tǒng)計(jì)計(jì)1的的個(gè)個(gè)數(shù)數(shù)BX:存存待待處處理理的的二二進(jìn)進(jìn)制制數(shù)數(shù)①XORcl,cl②lop1:andbx,bx③jzstopY④shlbx,1⑤jnclop1⑥incclN⑦jmplop1stop:movah,4ch注意意多多層層循循環(huán)環(huán)嵌嵌套套問問題題CL清清零零Bx的的值值取取標(biāo)標(biāo)志志Bx=0?Bx左左移移1位位Cf=1?Cl加加1結(jié)束束74例4.9排排序序:將將N個(gè)個(gè)數(shù)數(shù)從從小小到到大大排排序序(從從大大到到小小?)模模擬擬過過程程:80311229第一一輪輪:Flag=0內(nèi)循循環(huán)環(huán)①②②不不對對交交換換flag=1結(jié)結(jié)果果:31801229次數(shù)數(shù)②③③不不對對交交換換結(jié)結(jié)果果:31128029(n-1)③④④不不對對交交換換結(jié)結(jié)果果:31122980(找找出出最最大大值值)∵∵flag=1繼繼續(xù)續(xù)第二二輪輪:Flag=031122980(n-2)①②②不不對對flag=1,交交換換12312980②③③不不對對12293180③④④對對不不交交換換(找找到到次次大大值值)75第三三輪輪:flag=0(n-3)12293180①②對對 flag=0②③對對 flag=0③④對對 flag=0∵flag=0∴∴不用再再循環(huán)了次數(shù):內(nèi)循循環(huán),找到到本輪最大大值(執(zhí)行行n-1次次)外循環(huán),找找到n-1次最大值值(n-1次)76另一種情況況80312912第一輪結(jié)果果31291280flag=1,繼繼續(xù)第二二輪輪結(jié)結(jié)果果29123180flag=1,繼繼續(xù)續(xù)第三三輪輪結(jié)結(jié)果果29123180flag=1,繼繼續(xù)續(xù)?沒必必要要繼繼續(xù)續(xù),所所以以n-1即即可可*外外循循環(huán)環(huán)所所剩剩次次數(shù)數(shù)=內(nèi)內(nèi)循循環(huán)環(huán)所所剩剩次次數(shù)數(shù)77外循循環(huán)環(huán)NN數(shù)據(jù)據(jù)塊塊長長度度-1→→CXDX-CX標(biāo)志志BH=0起始始地地址址內(nèi)循循環(huán)環(huán)分分別別找找到到最大大值值、、次次大大值值BH=1?DX→→CXCX=0?結(jié)束束784.10向內(nèi)內(nèi)存存送送256個(gè)個(gè)數(shù)數(shù)據(jù)據(jù)找出出數(shù)數(shù)據(jù)據(jù)塊塊中中最最大大的的正正數(shù)數(shù)將正正數(shù)數(shù)的的高高位位移移至至低低4位位將正正數(shù)數(shù)的的低低4位位的的高高4位位變變成成ASCII碼碼顯顯示示4.11子子程程序序(略略)79求數(shù)數(shù)組組的的和和①求求第第一一組組的的和和參數(shù)數(shù):多多少少個(gè)個(gè)數(shù)數(shù),數(shù)數(shù)據(jù)據(jù)首首址址求和和:al=[si]+al(add)新元元素素原原和和ah=ah+0+cf修改改地地址址,到到下下一一個(gè)個(gè)地地址址和→[si](出出口口參參數(shù)數(shù)用用存存儲(chǔ)儲(chǔ)器器)804.12定定義義兩兩個(gè)個(gè)十十進(jìn)進(jìn)制制數(shù)數(shù)數(shù)數(shù)組組,編編程程實(shí)實(shí)現(xiàn)現(xiàn)數(shù)數(shù)組組求求和和.在在屏屏幕幕上上顯

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論