匯編語言程序設(shè)計46~68節(jié)_第1頁
匯編語言程序設(shè)計46~68節(jié)_第2頁
匯編語言程序設(shè)計46~68節(jié)_第3頁
匯編語言程序設(shè)計46~68節(jié)_第4頁
匯編語言程序設(shè)計46~68節(jié)_第5頁
已閱讀5頁,還剩69頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

4.6.1順序結(jié)構(gòu)程序設(shè)計順序結(jié)構(gòu)程序也稱為簡單程序,這種結(jié)構(gòu)的程序是按順序執(zhí)行下來的,程序本身的邏輯很簡單,只要能正確安排有關(guān)語句的順序,即可解決問題。4.6匯編語言程序設(shè)計在匯編語言程序中,主要有四種結(jié)構(gòu):順序程序、分支程序、循環(huán)程序、子程序。順序程序分支程序循環(huán)程序子程序圖4-3四種基本程序結(jié)構(gòu)的示意圖例4-10編程實現(xiàn)123*456→M MDD? MOVAX,123 MOVBX,456 MULBX MOVM,AX MOVM+2,DX4.6.1順序結(jié)構(gòu)程序設(shè)計例4-11從鍵盤上鍵入0至9中任一個自然數(shù),求其立方值。數(shù)據(jù)段定義如下:DATASEGMENTINPUTDB‘PLEASEINPUTX(0~9):$’TABDW0,1,8,27,64,125,216,343,512,729XDB?XXXDW?DATAENDS4.6.1順序結(jié)構(gòu)程序設(shè)計程序段如下:

INT 21H;用9號功能顯示字符串MOV AH,1INT 21H;從鍵盤輸入一個字符ALAND AL,0FHMOV X,AL;將ASCII碼轉(zhuǎn)換成真值

ADD AL,ALMOV BL,ALMOV BH,0;計算在表中的偏移量送BXMOV AX,TAB[BX];查表獲得立方值

MOV XXX,AX;將立方值保存在XXX單元

4.6.1順序結(jié)構(gòu)程序設(shè)計4.6.2分支結(jié)構(gòu)程序設(shè)計N分支1YNY分支2條件

1.利用比較與條件轉(zhuǎn)移實現(xiàn)分支

例4-13求兩個無符號數(shù)差的絕對值,結(jié)果存放在D1單元中。DATASEGMENT

D1 DB?

D2 DB0F5H,68HDATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXLEA BX,D2MOV AL,[BX];取第1個數(shù)

INC BX4.6.2分支結(jié)構(gòu)程序設(shè)計MOV CL,[BX];取第2個數(shù)CMP AL,CL;兩個數(shù)比較JAE BIGR;大于等于,則轉(zhuǎn)BIGRSUB CL,AL;否則,第2個數(shù)減第1個數(shù)MOV D1,CL;兩數(shù)差的絕對值存D1單元JMP RSTBIGR:SUB AL,CL;第1個數(shù)減去第2個數(shù)MOV D1,ALRST:MOV AH,4CHINT 21HCODEENDSEND START4.6.2分支結(jié)構(gòu)程序設(shè)計例4-14設(shè)在A、B、C字型變量中存放著3個數(shù),若3個數(shù)均不為0,則求出它們的和(不考慮溢出)存入D單元。DATASEGMENTA DW108B DW0C DW45D DW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AX4.6.2分支結(jié)構(gòu)程序設(shè)計MOV BH,0;BH淸0MOV D,0;變量D淸0CMP A,0;判斷變量A是否為0JNE NT1;A非0則轉(zhuǎn)去判斷變量BINC BH;A為0則BH加1NT1:CMPB,0 ;判斷變量B是否為0JNE NT2;B非0則轉(zhuǎn)去判斷變量CINC BH;B為0則BH加1NT2:CMPC,0;判斷變量C是否為0JNE NT3;C非0則轉(zhuǎn)去判斷寄存器

INCBH4.6.2分支結(jié)構(gòu)程序設(shè)計NT3:CMPBH,0;判斷寄存器BH是否為0JNE EXIT;BH非0則程序結(jié)束

MOV AX,A;BH為0則求和并存入D單元

ADD AX,BADD AX,CMOV D,AXEXIT:MOVAH,4CHINT 21HCODEENDSENDSTART4.6.2分支結(jié)構(gòu)程序設(shè)計2利用跳轉(zhuǎn)表實現(xiàn)分支

條件分支1分支2分支n……例4-15某工廠有n+1種產(chǎn)品R0、R1、R2、...、Rn的加工程序,分別存放在PR0、PR1、PR2、...PRn為首地址的內(nèi)存區(qū)域中。而這n+1個首地址的偏移量連續(xù)存放在以BASE為基地址的跳轉(zhuǎn)表中。已知產(chǎn)品編號存放在NUM單元中,要求編寫程序,能夠根據(jù)產(chǎn)品編號轉(zhuǎn)至相應(yīng)的處理程序。DATASEGMENTBASEDWPR0,PR1,PR2,...,PRn

;定義跳轉(zhuǎn)表NUM DB4DATAENDS4.6.2分支結(jié)構(gòu)程序設(shè)計CODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXXORAX,AX;清AXMOVAL,NUM;取加工的產(chǎn)品編號iADDAX,AX;2*i,獲得偏移量

MOVBX,OFFSETBASE;獲得跳轉(zhuǎn)表首地址

ADDBX,AX;獲得對應(yīng)的單元地址

JMPBX;轉(zhuǎn)入相應(yīng)的加工子程序

MOVAH,4CH;程序結(jié)束

INT21H4.6.2分支結(jié)構(gòu)程序設(shè)計PROPROC NEAR;加工子程序

...PR0ENDP

;PR1PROC NEAR...PR1ENDP

;

...PRnPROC NEAR...PRnENDPCODEENDSEND START4.6.2分支結(jié)構(gòu)程序設(shè)計PR0BASEPR0PRnPR1PR2PRn….…4.6.2分支結(jié)構(gòu)程序設(shè)計

圖4-5例4-15的跳轉(zhuǎn)表

4.6.3循環(huán)結(jié)構(gòu)程序設(shè)計1.循環(huán)程序結(jié)構(gòu)可分為五個部分。(1)初始化部分設(shè)置循環(huán)的初始值,是循環(huán)的準(zhǔn)備部分。(2)循環(huán)體部分這是循環(huán)程序的主體,用來完成主要的計算任務(wù)和操作。(3)循環(huán)修改部分修改循環(huán)工作部分的變量地址等,為下一次循環(huán)作準(zhǔn)備。(4)循環(huán)控制部分修改循環(huán)次數(shù)計數(shù)器并判斷結(jié)束條件。(5)結(jié)束部分循環(huán)結(jié)束后,用于分析和存放結(jié)果。4.6.3循環(huán)結(jié)構(gòu)程序設(shè)計2循環(huán)的控制方法

(1)計數(shù)控制用于循環(huán)次數(shù)已知的情況。通常采用CX寄存器為循環(huán)計數(shù)器。循環(huán)計數(shù)控制一般用LOOP指令實現(xiàn)。(2)條件控制用于循環(huán)次數(shù)未知,但卻已知一些循環(huán)或不循環(huán)的條件。(3)邏輯尺控制這是匯編語言循環(huán)程序設(shè)計獨有的方式。所謂邏輯尺,是指具有一定長度的一串二進制數(shù)。該方式按照邏輯尺的指示,決定對循環(huán)體中某一部分的執(zhí)行或不執(zhí)行。

4.6.3循環(huán)結(jié)構(gòu)程序設(shè)計3.循環(huán)程序設(shè)計舉例

例4-16編程計算Y=a1+a2+…+a100。(其中ai為16位二進制整數(shù),設(shè)和值不大于16位二進制整數(shù)表數(shù)范圍)

DATASEGMENTTAB DWa1,a2,...,a100Y DW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AX

4.6.3循環(huán)結(jié)構(gòu)程序設(shè)計XOR AX,AX;初始化部分,累加和清0LEA BX,TAB ;BX指向加數(shù)首地址

MOV CX,100 ;設(shè)置減計數(shù)初值LP:ADD AX,[BX];循環(huán)體開始,累加

INC BX;修改部分,修改BX

INC BXLOOP LP;控制部分,CX減計數(shù)

MOV Y,AX;結(jié)束部分,存放結(jié)果

MOV AH,4CHINT 21HCODEENDSEND START4.6.3循環(huán)結(jié)構(gòu)程序設(shè)計例4-17寫一個把字符串中的所有大寫字母改寫為小寫字母的程序。設(shè)字符串以‘$’結(jié)尾。DATASEGMENTSTRINGDB‘IamAStudent!’,’$’DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXMOV SI,OFFSETSTRING;取串首地址AGAIN:MOV AL,[SI];取一字符

CMP AL,‘$’;是否到字符串尾4.6.3循環(huán)結(jié)構(gòu)程序設(shè)計JEOK;到字符串尾,跳出循環(huán)

CMPAL,‘A’;否則,判斷是否為大寫字母

JB NEXT;否,轉(zhuǎn)繼續(xù)

CMPAL,‘Z’JA NEXT;否,轉(zhuǎn)繼續(xù)

ORAL,20H;是大寫字母,改為小寫字母NEXT:INCSI;調(diào)整指針

JMPAGAIN;繼續(xù)循環(huán)OK:MOVAH,4CH;結(jié)束

INT21HCODEENDSENDSTART4.6.3循環(huán)結(jié)構(gòu)程序設(shè)計例4-18設(shè)計一個程序判斷無符號字型數(shù)組BUFFER的若干個元素中是否含有數(shù)字0,如有則把第一個0元素所在存儲單元的偏移地址送字型變量ADDR,如沒有則將該變量的值置為0FFFFH。數(shù)據(jù)段定義如下:DATASEGMENTBUFFERDW23,65,89,……COUNTEQU$-BUFFER;元素個數(shù)

ADDDRDW?DATAENDS4.6.3循環(huán)結(jié)構(gòu)程序設(shè)計程序段如下:

MOVBX,OFFSETBUFFER;數(shù)組地址到BXMOVCX,COUNT;置循環(huán)最大次數(shù)AGAIN:MOVAX,[BX];取一元素

CMPAX,0;與0比較

JZYES;相等則跳出循環(huán)

ADDBX,2;修改地址指針

LOOPAGAIN;循環(huán)控制

MOVADDR,0FFFFH;沒找到

JMPEXITYES:MOV ADDR,BX;找到EXIT:......;結(jié)束4.6.3循環(huán)結(jié)構(gòu)程序設(shè)計例4-19設(shè)字型數(shù)組X、Y分別有12個元素,試形成一個Z數(shù)組,使該數(shù)組的各元素滿足以下關(guān)系:Z0=X0+Y0Z1=X1+Y1Z2=X2-Y2Z3=X3+Y3Z4=X4+Y4Z5=X5+Y5Z6=X6+Y6Z7=X7-Y7Z8=X8-Y8Z9=X9+Y9Z10=X10+Y10Z11=X11-Y11邏輯尺的定義:用0表示加運算,用1表示減運算,則12個式子的運算操作按Z11,Z10,Z9,…,Z0的順序可表示為二進制數(shù)100110000100。為存放這個二進制數(shù),可在內(nèi)存中定義一個字變量,將二進制數(shù)作為該變量的低12位,變量的高4位無意義。

4.6.3循環(huán)結(jié)構(gòu)程序設(shè)計數(shù)據(jù)段定義如下:DATASEGMENTXDW3,65,96,45,86,8,50,7,76,45,75,5YDW9,45,23,6,74,8,21,45,12,4,64,87ZDW12DUP(?)RULERDW0000100110000100BDATAENDS主要程序段如下:……

MOV BX,0;置地址指針

MOV CX,12;置循環(huán)次數(shù)

MOVDX,RULER4.6.3循環(huán)結(jié)構(gòu)程序設(shè)計AGAIN:MOVAX,X[BX];取數(shù)組X一元素

SHRDX,1;邏輯尺右移一位

JCSUBS;移出位為1則相減

ADDAX,Y[BX];否則相加

JMPNEXTSUBS:SUBAX,Y[BX]NEXT:MOVZ[BX],AX;將結(jié)果存入Z數(shù)組

ADDBX,2;修改地址指針

LOOPAGAIN;循環(huán)控制EXIT:MOV ......;結(jié)束4.6.3循環(huán)結(jié)構(gòu)程序設(shè)計例4-20用冒泡排序法對有符號字型數(shù)組ARY按升序排列。下面是對有7個元素的無序表進行冒泡排序:表的初始狀態(tài):[36486698751328]第一遍比較之后:[364866751328]98第二遍比較之后:[3648661328]7598第三遍比較之后:[36481328]667598第四遍比較之后:[361328]48667598第五遍比較之后:[1328]3648667598第六遍比較之后:132836486675984.6.3循環(huán)結(jié)構(gòu)程序設(shè)計數(shù)據(jù)段定義如下:DATASEGMENTARY DW n1,n2,n3,……N EQU ($-ARY)/2;數(shù)組元素個數(shù)DATAENDS主要程序段定義如下:……MOVCX,N-1;置外循環(huán)次數(shù)LOOP1:PUSHCX;保存外循環(huán)計數(shù)器的值MOVBX,0;置地址指針4.6.3循環(huán)結(jié)構(gòu)程序設(shè)計LOOP2:MOVAX,ARY[BX];取前面元素到AXCMPAX,ARY[BX+2];與后面元素比較

JLEOK;次序正確則轉(zhuǎn)到下一步

XCHGAX,ARY[BX+2];否則,交換位置

MOVARY[BX],AXOK:ADD BX,2;修改地址指針

LOOPLOOP2;內(nèi)循環(huán)控制

POPCX;將CX恢復(fù)為外循環(huán)計數(shù)器值

LOOPLOOP1;外循環(huán)控制……4.6.3循環(huán)結(jié)構(gòu)程序設(shè)計

4.6.4子程序設(shè)計

1.子程序的調(diào)用和返回

SP返回地址偏移CSIP返回地址偏移IPCSSP返回地址段值返回地址段值CALL指令執(zhí)行后RET指令執(zhí)行后要實現(xiàn)子程序的正確調(diào)用返回,必須注意:(1)正確定義子程序的類型。(2)CALL和RET指令必須成對出現(xiàn)。(3)正確使用堆棧。

4.6.4子程序設(shè)計

2.保存和恢復(fù)寄存器

典型的保護和恢復(fù)寄存器編程舉例如下:子程序名PROCNEAR(或FAR)PUSHAX;保護現(xiàn)場PUSHBXPUSHCXPUSHDXPUSHF...

4.6.4子程序設(shè)計

...POPF;恢復(fù)現(xiàn)場POPDXPOPCXPOPBXPOPAXRET子程序名ENDP

4.6.4子程序設(shè)計

3.主程序和子程序之間的參數(shù)傳送方法

參數(shù)傳送的主要方法有以下幾種:(1)通用寄存器傳送參數(shù)。主程序調(diào)用子程序時,將要傳送的參數(shù)裝入某些指定寄存器;子程序返回時也將結(jié)果裝入指定的寄存器。(2)存儲單元傳送參數(shù)。指定某些存儲單元存放主程序與子程序之間要傳遞的參數(shù)。(3)堆棧傳送參數(shù)。主程序把參數(shù)或參數(shù)地址壓入堆棧,子程序通過訪問堆棧取得參數(shù)。

4.6.4子程序設(shè)計

4.子程序說明信息

子程序的說明信息至少應(yīng)該包含下面幾個部分:;子程序名:‥‥‥‥‥‥;功能:‥‥‥‥‥‥;入口參數(shù):‥‥‥‥‥‥;出口參數(shù):‥‥‥‥‥‥;其它說明:‥‥‥‥‥‥

4.6.4子程序設(shè)計

例4-21編寫一個對字型數(shù)組各元素求和的子程序(不考慮進位),并在主程序中調(diào)用該子程序分別求字型數(shù)組A1和A2的各元素之和。(1)使用通用寄存器傳遞參數(shù)DATASEGMENTA1DW30H,20H,10,30H,6BHN1EQU($-A1)/2;獲得A1元素的個數(shù)

SUM1DW?;存放數(shù)組A1的和

A2DW45,12,-4,89,6CH,0DH,35N2EQU($-A2)/2;獲得A2元素的個數(shù)

SUM2DW?;存放數(shù)組A2的和DATAENDS

4.6.4子程序設(shè)計

主要程序如下:......LEABX,A1;傳送數(shù)組A1的地址到BXMOVCX,N1;傳送A1的元素個數(shù)到CXLEASI,SUM1;傳送SUM1的地址到SICALLARY_SUM;調(diào)用子程序?qū)?shù)組A1求和LEABX,A2;傳送數(shù)組A2的地址到BXMOVCX,N2;傳送A2的元素個數(shù)到CXLEASI,SUM2;傳送SUM2的地址到SICALLARY_SUM;調(diào)用子程序?qū)?shù)組A2求和MOVAH,4CHINT21H

4.6.4子程序設(shè)計

;子程序名:ARY_SUM;功能:求字型數(shù)組各元素之和。

;入口參數(shù):BX=數(shù)組地址;CX=數(shù)組元素個數(shù);SI=存和地址

;出口參數(shù):無ARY_SUMPROCNEARPUSHAXXORAX,AX;AX清零

4.6.4子程序設(shè)計

AGAIN:ADDAX,[BX];對數(shù)組求和

ADDBX,2LOOPAGAINMOV[SI],AX;存和

POPAXRETARY_SUMENDPCODEENDSENDSTART

4.6.4子程序設(shè)計

(2)使用存儲單元傳遞參數(shù)數(shù)據(jù)段定義如下:DATASEGMENTA1DW30H,20H,10,30H,6BHN1EQU($-A1)/2;獲得A1數(shù)組元素的個數(shù)

SUM1DW?A2DW45,12,-4,89,6CH,0DH,35N2EQU($-A2)/2;獲得A2數(shù)組元素的個數(shù)

SUM2DW?TABLEDW3DUP(?);定義參數(shù)表DATAENDS

4.6.4子程序設(shè)計

調(diào)用子程序?qū)?shù)組A1求和:LEABX,TABLE;將參數(shù)表地址傳送BXLEA AX,A1;將數(shù)組A1參數(shù)填入?yún)?shù)表

MOV [BX],AXMOV AX,N1MOV [BX+2],AXLEA AX,SUM1MOV [BX+4],AXCALLARY_SUM;調(diào)用子程序?qū)?shù)組A1求和

4.6.4子程序設(shè)計

;子程序名:ARY_SUM;功能:求字型數(shù)組各元素之和。

;入口參數(shù):BX=參數(shù)表地址;;參數(shù)1=數(shù)組地址;參數(shù)2=元素個數(shù);參數(shù)3=存和地址

;出口參數(shù):無ARY_SUMPROCNEARPUSHAXPUSHCXPUSHSIMOVSI,[BX];取參數(shù)1到SIMOVCX,[BX+2];取參數(shù)2到CXXORAX,AX

4.6.4子程序設(shè)計

AGAIN:ADDAX,[SI];對數(shù)組求和

ADDSI,2LOOPAGAINMOVSI,[BX+4];取參數(shù)3到SIMOV[SI],AX;存和

POPSIPOPCXPOPAXRETARY_SUMENDPCODEENDSENDSTART

4.6.4子程序設(shè)計

(3)使用堆棧傳遞參數(shù)調(diào)用子程序?qū)?shù)組A1求和:LEAAX,A1;數(shù)組A1的相關(guān)參數(shù)入棧

PUSHAXMOVAX,N1PUSHAXLEAAX,SUM1PUSHAXCALLARY_SUM

4.6.4子程序設(shè)計

;子程序名:ARY_SUM;功能:求字型數(shù)組各元素之和。

;入口參數(shù):使用堆棧傳遞參數(shù)。;參數(shù)入棧順序:1.數(shù)組地址;2.數(shù)組元素個數(shù);3.存和地址

;出口參數(shù):無ARY_SUMPROCNEARPUSHAXPUSHCXPUSHSIPUSHBPMOVBP,SPMOVSI,[BP+10];取數(shù)組地址到SIMOVCX,[BP+12];取元素個數(shù)到CX

XORAX,AXAGAIN:ADDAX,[SI];用循環(huán)語句對數(shù)組求和

ADDSI,2LOOPAGAINMOVSI,[BP+14];取存和地址到SIMOV[SI],AX;將數(shù)組和存入指定地址

POPBPPOPSIPOPCXPOPAXRET6

4.6.4子程序設(shè)計

數(shù)組地址數(shù)組元素個數(shù)存和地址IPAXCXSIBP……SPBPBP+10BP+12BP+14圖4-8取得入口參數(shù)時堆棧的情形例4-22

基數(shù)轉(zhuǎn)換子程序。將寄存器AX中的16位無符號二進制數(shù)轉(zhuǎn)換為P進制數(shù),并將P進制數(shù)轉(zhuǎn)換成ASCII碼存放。;子程序名:RADIX;功能:將寄存器AX中的16位無符號二進制數(shù)轉(zhuǎn)換為P進制數(shù);入口參數(shù):AX=待轉(zhuǎn)換的數(shù),BX=數(shù)制基P,;SI=存放ASCII碼的字節(jié)數(shù)組地址;出口參數(shù):無4.7

實用程序設(shè)計舉例RADIXPROCFARPUSHCXPUSHDXMOVCX,0LOP1:MOVDX,0DIVBX;待轉(zhuǎn)換的數(shù)存放在AX,BX存放要轉(zhuǎn)換

PUSHDX;的數(shù)制基數(shù)P,(AX)除以P,余數(shù)入棧

INCCX;記錄余數(shù)個數(shù)

ORAX,AXJNELOP1;(AX)不等于0,轉(zhuǎn)LOP1LOP2:POPAX;從堆棧中彈出一位P進制數(shù)字

CMPAL,104.7

實用程序設(shè)計舉例JBL1ADDAL,7L1:ADDAL,30H;轉(zhuǎn)換成ASCII碼

MOV[SI],AL;保存

INCSIDECCXJNELOP2POPDXPOPCXRETRADIXENDP4.7

實用程序設(shè)計舉例例4-23有一個100個字節(jié)的數(shù)據(jù)表(有符號數(shù)),存放在數(shù)據(jù)段中,表內(nèi)各數(shù)已按升序排列好,現(xiàn)給定一元素,試編寫程序從表內(nèi)查找給定元素,若有則結(jié)束,否則將該元素順序插入表中,并修改表長。DATASEGMENTLTHDB100;表長

TABDB02H,12H,14H,...;100個字節(jié)的升序表

TEMDBX;給定元素DATAENDS4.7

實用程序設(shè)計舉例CODESEGMENTASSUMECS:CODE,DS:DATASATRT:MOVAX,DATAMOVDS,AXLEABX,TABMOVAL,TEMMOVCX,LTHLOP:CMPAL,[BX];在表中查找

JESOP;找到則結(jié)束

JLINST;若給定元素小于表內(nèi)元素,轉(zhuǎn)INSTINCBX;大于則取下一個元素進行比較

LOOPLOPMOV[BX],AL;給定元素一直大于表內(nèi)元素

JMPJUST;插入表末INST:MOVAH,[BX];暫存表中元素暫存入AHMOV[BX],AL;表中插入給定元素

MOVAL,AHINCBXLOPI:MOVAH,[BX];暫存表中下一個元素

MOV[BX],AL;將前一個暫存的元素存入表中

MOVAL,AHINCBXDECCXJNZLOPIJUST:INCLTH;修改表長SOP:MOVAH,4CHINT21HCODEENDSENDSTART例4-24編程實現(xiàn):先接受一個字符串,然后分別統(tǒng)計其中數(shù)字字符和英文字符的個數(shù),最后用十進制數(shù)的形式顯示它們。

DATASEGMENTBUFFDB255;緩沖區(qū)長度

DB?;鍵入字符實際長度

DB255DUP(0)MESS0DB0DH,0AH,‘PLEASEINPUT:$’MESS1DB0DH,0AH,‘LENGTH=$’MESS2DB0DH,0AH,‘DIGITAL=$’MESS3DB0DH,0AH,‘CHARACT=$’DATAENDS4.7

實用程序設(shè)計舉例CODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVDX,OFFSETMESS0;顯示提示信息0CALLDISPMESSMOVDX,OFFSETBUFF;接收一個字符串

MOVAH,10INT21HMOVBH,0;清數(shù)字計數(shù)器

MOVBL,0;清字符計數(shù)器

MOVCL,BUFF+1;取字符串長度4.7

實用程序設(shè)計舉例MOVCH,0JCXZCOK;若長度為0,不統(tǒng)計

MOVSI,OFFSETBUFF+2;指向字符串首址

AGAIN:MOVAL,[SI]INCSICMPAL,‘0’;判斷是否數(shù)字字符

JBNEXTCMPAL,‘9’JANODECINCBH;字符計數(shù)器加1JMPSHORTNEXT;提前結(jié)束本次循環(huán)4.7

實用程序設(shè)計舉例

NODEC:ORAL,20H;轉(zhuǎn)換為小寫

CMPAL,‘a(chǎn)’;判斷是否英文字母

JBNEXTCMPAL,‘z’JANEXTINCBL;字母計數(shù)器加1NEXT:LOOPAGAIN

COK:MOVDX,OFFSETMESS1;顯示字符串長度

CALLDISPMESSMOVAL,BUFF+1XORAH,AHCALLDISPL4.7

實用程序設(shè)計舉例MOVDX,OFFSETMESS2;顯示數(shù)字字符個數(shù)

CALLDISPMESSMOVAL,BHXORAH,AHCALLDISPLMOVDX,OFFSETMESS3;顯示字母個數(shù)

CALLDISPMESSMOVAL,BLXORAH,AHCALLDISPLMOVAH,4CH

INT21H4.7

實用程序設(shè)計舉例;子程序名:DISPL;功能:8位無符號二進制數(shù)轉(zhuǎn)換為十進制數(shù)并顯示;入口參數(shù):AL=待轉(zhuǎn)換的8位數(shù);出口參數(shù):無DISPLPROCPUSHDXPUSHCXMOVDL,10;置除數(shù)

MOVCX,0DISP1:XORAH,AHDIVDLPUSHAX;保存商和余數(shù)

INCCX;統(tǒng)計除10的次數(shù)4.7

實用程序設(shè)計舉例CMPAL,0JNZDISP1DISP2:POPAX;取商和余數(shù)到AXADDAH,30H;將余數(shù)轉(zhuǎn)換成字符并顯示

MOVDL,AHMOVAH,2INT21HLOOPDISP2POPCXPOPDXRETDISPLENDP4.7

實用程序設(shè)計舉例;子程序名:DISPMESS;功能:顯示提示信息;入口參數(shù):DX=提示信息地址;出口參數(shù):無

DISPMESSPROCPUSHAXMOVAH,9INT21HPOPAXRETCODEENDSENDSTART4.7

實用程序設(shè)計舉例4.8.1上機開發(fā)過程(1)建立匯編源程序文件(.ASM)用編輯程序,例如

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論