IBMPC匯編語(yǔ)言程序設(shè)計(jì)課后習(xí)題答案第二版 沈美明_第1頁(yè)
IBMPC匯編語(yǔ)言程序設(shè)計(jì)課后習(xí)題答案第二版 沈美明_第2頁(yè)
IBMPC匯編語(yǔ)言程序設(shè)計(jì)課后習(xí)題答案第二版 沈美明_第3頁(yè)
IBMPC匯編語(yǔ)言程序設(shè)計(jì)課后習(xí)題答案第二版 沈美明_第4頁(yè)
IBMPC匯編語(yǔ)言程序設(shè)計(jì)課后習(xí)題答案第二版 沈美明_第5頁(yè)
已閱讀5頁(yè),還剩64頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第五章

5.1試編寫一個(gè)匯編語(yǔ)言程序,要求對(duì)鍵盤輸入的小寫字母用大寫字母顯

示出來(lái)。

答:程序段如下:

BEGIN:MOVAH,1;從鍵盤輸入一個(gè)字符的DOS調(diào)用

INT21H

CMPAL,'a';輸入字符<'a’嗎?

JBSTOP

CMPAL,<z,;輸入字符》”嗎?

JASTOP

SUBAL,20H;轉(zhuǎn)換為大寫字母,用ANDAL,11011111B也可

MOVDL,AL;顯示一個(gè)字符的DOS調(diào)用

MOVAH,2

INT21H

JMPBEGIN

STOP:RET

5.2編寫程序,從鍵盤接收一個(gè)小寫字母,然后找出它的前導(dǎo)字符和后續(xù)

字符,再按依次顯示這三個(gè)字符。

答:程序段如下:

BEGIN:MOVAH,1;從鍵盤輸入一個(gè)字符的DOS調(diào)用

INT21H

CMPAL,'a';輸入字符<'a’嗎?

JBSTOP

CMPAL,'z';輸入字符〉'z'嗎?

JASTOP

DECAL;得到前導(dǎo)字符

MOVDL,AL;準(zhǔn)備顯示三個(gè)字符

MOVCX,3

DISPLAY:MOVAH,2;顯示一個(gè)字符的DOS調(diào)用

INT21H

INCDL

LOOPDISPLAY

STOP:RET

5.3將AX寄存器中的16位數(shù)分成4組,每組4位,然后把這四組數(shù)分別

放在AL、BL、CL和DL中。

答:程序段如下:

DSEGSEGMENT

STOREDB4DUP(?)

DSEGENDS

I

I

I

BEGIN:MOVCL,4;右移四次

MOVCH,4;循環(huán)四次

LEABX,STORE

A10:MOVDX,AX

ANDDX,OFH;取AX的低四位

MOV[BX],DL;低四位存入STORE中

INCBX

SHRAX,CL;右移四次

DECcn

JNZA10;循環(huán)四次完了碼?

BIO:MOVDL,STORE;四組數(shù)分別放在AL、BL、CL和DL中

MOVCL,STORE+1

MOVBL,STORE+2

MOVAL,STORE+3

STOP:RET

5.4試編寫一程序,要求比較兩個(gè)字符串STRING1和STRING2所含字符是

否完全相同,若相同則顯示'MATCH',若不相同則顯示'NOMATCH'。

答:程序如下:

DSEGSEGMENT

STRING1DB(Iamastudent.J

STRING2DB'Iamastudent!'

YESDB'MATCH',ODH,OAH,'$'

NODB'NOMATCH',ODH,OAH,'$'

DSEGENDS

CSEGSEGMENT

MAINPROCFAR

ASSUMECS:CSEG,DS:DSEG,ES:DSEG

START:PUSHDS;設(shè)置返回DOS

SUBAX,AX

PUSHAX

MOVAX,DSEG

MOVDS,AX;給DS賦值

MOVES,AX;給ES賦值

BEGIN:LEASI,STRING1;設(shè)置串比較指令的初值

LEADI,STRING2

CLD

MOVCX,STRING2-STRING1

REPECMPSB;串比較

JNEDISPNO

LEADX,YES;顯示MATCH

JMPDISPLAY

DISPNO:LEADX,NO;顯示NOMATCH

DISPLAY:MOVAH,9;顯示一個(gè)字符串的DOS調(diào)用

INT21H

RET

MAINENDP

CSEGENDS;以上定義代碼段

ENDSTART

5.5試編寫一程序,要求能從鍵盤接收一個(gè)個(gè)位數(shù)N,然后響鈴N次(響鈴

的ASCH碼為07)。

答:程序段如下:

BEGIN:MOVAH,1;從鍵盤輸入一個(gè)字符的DOS調(diào)用

INT21H

SUBAL,'O'

JBSTOP;輸入字符<'O’嗎?

CMPAL,9;輸入字符》‘9'嗎?

JASTOP

CBW

MOVCX,AX;響鈴次數(shù)N

JCXZSTOP

BELL:MOVDL,07H;準(zhǔn)備響鈴

MOVAH,2;顯示一個(gè)字符的DOS調(diào)用,實(shí)際為響鈴

INT21H

CALLDELAY100ms;延時(shí)100ms

LOOPBELL

STOP:RET

5.6編寫程序,將一個(gè)包含有20個(gè)數(shù)據(jù)的數(shù)組M分成兩個(gè)數(shù)組:正數(shù)數(shù)

組P和負(fù)數(shù)數(shù)組N,并分別把這兩個(gè)數(shù)組中數(shù)據(jù)的個(gè)數(shù)顯示出來(lái)。

答:程序如下:

DSEGSEGMENT

COUNTEQU20

ARRAYDW20DUP(?);存放數(shù)組

COUNT1DB0;存放正數(shù)的個(gè)數(shù)

ARRAY1DW20DUP(?);存放正數(shù)

C0UNT2DB0;存放負(fù)數(shù)的個(gè)數(shù)

ARRAY2DW20DUP(?);存放負(fù)數(shù)

ZHENDB0D1I,OAH,'Thepositivenumberis:','$';正數(shù)的個(gè)

數(shù)是:

FUDBODU,OAH,'Thenegativenumberis:','$';負(fù)數(shù)的個(gè)數(shù)

是:

CRLFDBODH,OAH,'$'

DSEGENDS

CSEGSEGMENT

MAINPROCFAR

ASSUMECS:CSEG,DS:DSEG

START:PUSHDS;設(shè)置返回DOS

SUBAX,AX

PUSHAX

MOVAX,DSEG

MOVDS,AX;給DS賦值

BEGIN:MOVCX,COUNT

LEABX,ARRAY

LEASI,ARRAY1

LEADI,ARRAY2

BEGIN1:MOVAX,[BX]

CMPAX,0;是負(fù)數(shù)碼?

JSFUSHU

MOV[SI],AX;是正數(shù),存入正數(shù)數(shù)組

INCCOUNT1;正數(shù)個(gè)數(shù)+1

ADDSI,2

JMPSHORTNEXT

FUSHU:MOV[DI],AX;是負(fù)數(shù),存入負(fù)數(shù)數(shù)組

INCCOUNT2;負(fù)數(shù)個(gè)數(shù)+1

ADDDI,2

NEXT:ADDBX,2

LOOPBEGIN1

LEADX,ZHEN;顯示正數(shù)個(gè)數(shù)

MOVAL,COUNT1

CALLDISPLAY;調(diào)顯示子程序

LEADX,FU;顯示負(fù)數(shù)個(gè)數(shù)

MOVAL,COUNT2

CALLDISPLAY;調(diào)顯示子程序

RET

MAINENDP

DISPLAYPROCNEAR;顯示子程序

MOVAH,9;顯示一個(gè)字符串的DOS調(diào)用

INT21H

AAM;將(AL)中的二進(jìn)制數(shù)轉(zhuǎn)換為二個(gè)非壓縮BCD碼

ADDAH,'O';變?yōu)??9的ASCII碼

MOVDL,AH

MOVAH,2;顯示一個(gè)字符的DOS調(diào)用

INT21H

ADDAL,<0,;變?yōu)??9的ASCH碼

MOVDL,AL

MOVAH,2;顯示一個(gè)字符的DOS調(diào)用

INT21H

LEADX,CRLF;顯示回車換行

MOVAH,9;顯示一個(gè)字符串的DOS調(diào)用

INT21H

RET

DISPLAYENDP;顯示子程序結(jié)束

CSEGENDS;以上定義代碼段

ENDSTART

5.7試編寫一個(gè)匯編語(yǔ)言程序,求出首地址為DATA的100D字?jǐn)?shù)組中的最

小偶數(shù),并把它存放在AX中。

答:程序段如下:

BEGIN:MOVBX,0

MOVCX,100

COMPARE:MOVAX,DATA[BX];取數(shù)組的第一個(gè)偶數(shù)

ADDBX,2

TESTAX,01H;是偶數(shù)嗎?

LOOPNZCOMPARE;不是,比較下一個(gè)數(shù)

JNZSTOP;沒(méi)有偶數(shù),退出

JCXZSTOP;最終一個(gè)數(shù)是偶數(shù),即為最小偶數(shù),退出

COMPARE1:MOVDX,DATA[BX];取數(shù)組的下一個(gè)偶數(shù)

ADDBX,2

TESTDX,01H;是偶數(shù)嗎?

JNZNEXT;不是,比較下一個(gè)數(shù)

CMPAX,DX;(AX)<(DX)嗎?

JLENEXT

MOVAX,DX;(AX)<(DX),則置換(AX)為最小偶數(shù)

NEXT:LOOPCOMPARE1

STOP:RET

5.8把AX中存放的16位二進(jìn)制數(shù)K看作是8個(gè)二進(jìn)制的“四分之一字

節(jié)”。試編寫程序要求數(shù)一下值為3(即11B)的四分之一字節(jié)數(shù),并將該

數(shù)(即11B的個(gè)數(shù))在終端上顯示出來(lái)。

答:程序段如下:

BEGIN:MOVDL,0;計(jì)數(shù)初始值

MOVCX,8

COMPARE:TESTAX,03H;是數(shù)03嗎?

JNZNOEQUAL;不是,轉(zhuǎn)走

INCDL;是,計(jì)數(shù)

NOEQUAL:RORAX,1;準(zhǔn)備推斷下一個(gè)數(shù)

RORAX,1

LOOPCOMPARE

ADDDL,'O';將計(jì)數(shù)值轉(zhuǎn)換為ASCH碼

MOVAH,2;進(jìn)行顯示

INT21H

STOP:RET

5.9試編寫一個(gè)匯編語(yǔ)言程序,要求從鍵盤接收一個(gè)四位的16進(jìn)制數(shù),

并在終端上顯示與它等值的二進(jìn)制數(shù)。

答:程序段如下:

BEGIN:MOVBX,0;用于存放四位的16進(jìn)制數(shù)

MOVCH,4

MOVCL,4

INPUT:SHLBX,CL;將前面輸入的數(shù)左移4位

MOVAH,1;從鍵盤取數(shù)

INT21H

CMPAL,30H;<0嗎?

JBINPUT;不是‘0?F'的數(shù)重新輸入

CMPAL,39H;是'0?9'嗎?

JAAF;不是,轉(zhuǎn)'A?F'的處理

ANDAL,OFH;轉(zhuǎn)換為:OOOOB-1OO1B

JMPBINARY

AF:ANDAL,11011111B;轉(zhuǎn)換為大寫字母

CMPAL,41H;又〈A嗎?

JBINPUT;不是'A?F'的數(shù)重新輸入

CMPAL,46H;>F嗎?

JAINPUT;不是‘A?F'的數(shù)重新輸入

ANDAL,OFH;轉(zhuǎn)換為:1010B-1111B

ADDAL,9

BINARY:ORBL,AL;將鍵盤輸入的數(shù)進(jìn)行組合

DELCH

JNZINPUT

DISPN:MOVCX,16;將16位二進(jìn)制數(shù)一位位地轉(zhuǎn)換成ASCH碼顯示

DISP:MOVDL,0

ROLBX,1

RCLDL,1

ORDL,30H

MOVAH,2;進(jìn)行顯示

INT21H

LOOPDISP

STOP:RET

5.10設(shè)有一段英文,其字符變量名為ENG,并以$字符結(jié)束。試編寫一程

序,查對(duì)單詞SUN在該文中的出現(xiàn)次數(shù),并以格式“SUN:xxxx”顯示出

次數(shù)。

答:程序如下:

DSEGSEGMENT

ENGDB'Hereissun,sun「??,$'

DISPDB'SUN:'

DATDB'0000',ODH,OAH,'$'

KEYWORDDBsun

DSEGENDS

CSEGSEGMENT

MAINPROCFAR

ASSUMECS:CSEG,DS:DSEG,ES:DSEG

START:PUSHDS;設(shè)置返回DOS

SUBAX,AX

PUSHAX

MOVAX,DSEG

MOVDS,AX;給DS賦值

MOVES,AX;給ES賦值

BEGIN:MOVAX,0

MOVDX,DISP-ENG-2;計(jì)算ENG的長(zhǎng)度(每次比較sun,因此比較次數(shù)-2)

LEABX,ENG

COMP:MOVDI,BX

LEASI,KEYWORD

MOVCX,3

REPECMPSB;串比較

JNZNOMATC11

INCAX;是,SUN的個(gè)數(shù)加1

ADDBX,2

NOMATCH:INCBX;指向ENG的下一個(gè)字母

DECDX

JNZCOMP

DONE:MOVCH,4;將次數(shù)轉(zhuǎn)換為16進(jìn)制數(shù)的ASCH碼

MOVCL,4

LEABX,DAT;轉(zhuǎn)換結(jié)果存入DAT單元中

DONE1:ROLAX,CL

MOVDX,AX

ANDDL,OFH;取一位16進(jìn)制數(shù)

ADDDL,30H

CMPDL,39H

JLESTORE

ADDDL,07H;是“A?F”所以要加7

STORE:MOV[BX],DL;轉(zhuǎn)換結(jié)果存入DAT單元中

INCBX

DECCH

JNZDONE1

DISPLAY:LEADX,DISP;顯示字符串程序(將DISP和DAT一起顯示)

MOVAH,0911

INT21H

RET

MAINENDP

CSEGENDS;以上定義代碼段

ENDSTART

5.11從鍵盤輸入一系列以$為結(jié)束符的字符串,然后對(duì)其中的非數(shù)字字符

計(jì)數(shù),并顯示出計(jì)數(shù)結(jié)果。

答:程序段如下:

DSEGSEGMENT

BUFFDB50DUP('')

COUNTDW0

DSEGENDS

I

I

I

BEGIN:LEABX,BUFF

MOVCOUNT,0

INPUT:MOVAH,01;從鍵盤輸入一個(gè)字符的功能調(diào)用

INT21H

MOV[BX],AL

INCBX

CMPAL,'$';是$結(jié)束符嗎?

JNZINPUT;不是,接著輸入

LEABX,BUFF;對(duì)非數(shù)字字符進(jìn)行計(jì)數(shù)

NEXT:MOVCL,[BX]

INCBX

CMPCL,'$';是$結(jié)束符,則轉(zhuǎn)去顯示

JZDISP

CMPCL,30U;小于0是非數(shù)字字符

JBNEXT

CMPCL,39H;大于9是非數(shù)字字符

JANEXT

INCCOUNT;個(gè)數(shù)+1

JMPNEXT

DISP::;16進(jìn)制數(shù)顯示程序段(省略)

5.12有一個(gè)首地址為MEM的100D字?jǐn)?shù)組,試編制程序刪除數(shù)組中全部為

0的項(xiàng),并將后續(xù)項(xiàng)向前壓縮,最終將數(shù)組的剩余部分補(bǔ)上0。

答:程序如下:

DSEGSEGMENT

MEMDW100DUP(?)

DSEGENDS

CSEGSEGMENT

MAINPROCFAR

ASSUMECS:CSEG,DS:DSEG

START:PUSHDS;設(shè)置返回DOS

SUBAX,AX

PUSHAX

MOVAX,DSEG

MOVDS,AX;給DS賦值

BEGIN:MOVSI,(100-1)*2;(SI)指向MEM的末元素的首地址

MOVBX,-2;地址指針的初值

MOVCX,100

COMP:ADDBX,2

CMPMEM[BX],0

JZCONS

LOOPCOMP

JMPFINISH;比較完了,已無(wú)0則結(jié)束

CONS:MOVDI,BX

C0NS1:CMPDI,SI;到了最終單元碼?

JAENOMOV

MOVAX,MEM[DI+2];后面的元素向前移位

MOVMEM[DI],AX

ADDDI,2

JMPC0NS1

NOMOV:MOVWORDPTR[SI],0;最終單元補(bǔ)0

LOOPCOMP

FINISH:RET

MAINENDP

CSEGENDS;以上定義代碼段

ENDSTART

5.13在STRING到STRING+99單元中存放著一個(gè)字符串,試編制一個(gè)程序

測(cè)試該字符串中是否存在數(shù)字,如有則把CL的第5位置1,否則將該位置

Oo

答:程序如下:

DSEGSEGMENT

STRINGDB100DUP(?)

DSEGENDS

CSEGSEGMENT

MAINPROCFAR

ASSUMECS:CSEG,DS:DSEG

START:PUSHDS;設(shè)置返回DOS

SUBAX,AX

PUSHAX

MOVAX,DSEG

MOVDS,AX;給DS賦值

BEGIN:MOVSI,0;(SI)作為地址指針的變更值

MOVCX,100

REPEAT:MOVAL,STRING[SI]

CMPAL,30H

JBGO_ON

CMPAL,39H

JAGO_ON

ORCL,20H;存在數(shù)字把CL的第5位置1

JMPEXIT

GO_ON:INCSI

LOOPREPEAT

ANDCL,ODFH;不存在數(shù)字把CL的第5位置0

EXIT:RET

MAINENDP

CSEGENDS;以上定義代碼段

ENDSTART

5.14在首地址為TABLE的數(shù)組中按遞增次序存放著10011個(gè)16位補(bǔ)碼數(shù),

試編寫一個(gè)程序把出現(xiàn)次數(shù)最多的數(shù)與其出現(xiàn)次數(shù)分別存放于AX和CX

中。

答:程序如下:

DSEGSEGMENT

TABLEDW100HDUP(?);數(shù)組中的數(shù)據(jù)是按增序排列的

DATADW?

COUNTDW0

DSEGENDS

CSEGSEGMENT

MAINPROCFAR

ASSUMECS:CSEG,DS:DSEG

START:PUSHDS;設(shè)置返回DOS

SUBAX,AX

PUSHAX

MOVAX,DSEG

MOVDS,AX;給DS賦值

BEGIN:MOVCX,100H;循環(huán)計(jì)數(shù)器

MOVSI,0

NEXT:MOVDX,0

MOVAX,TABLE[SI]

COMP:CMPTABLE[SI],AX;計(jì)算一個(gè)數(shù)的出現(xiàn)次數(shù)

JNEADDR

INCDX

ADDSI,2

LOOPCOMP

ADDR:CMPDX,COUNT;此數(shù)出現(xiàn)的次數(shù)最多嗎?

JLEDONE

MOVCOUNT,DX;目前此數(shù)出現(xiàn)的次數(shù)最多,登記次數(shù)

MOVDATA,AX;登記此數(shù)

DONE:LOOPNEXT;準(zhǔn)備取下一個(gè)數(shù)

MOVCX,COUNT;出現(xiàn)最多的次數(shù)存入(CX)

MOVAX,DATA;出現(xiàn)最多的數(shù)存入(AX)

RET

MAINENDP

CSEGENDS;以上定義代碼段

ENDSTART

5.15數(shù)據(jù)段中已定義了一個(gè)有n個(gè)字?jǐn)?shù)據(jù)的數(shù)組M,試編寫一程序求出M

中確定值最大的數(shù),把它放在數(shù)據(jù)段的M+2n單元中,并將該數(shù)的偏移地

址存放在M+2(n+1)單元中。

答:程序如下:

DSEGSEGMENT

nEQU100H;假設(shè)n=100H

MDWnDUP(?)

DATADW?;M+2n單元

ADDRDW?;M+2(n+l)單元

DSEGENDS

CSEGSEGMENT

MAINPROCFAR

ASSUMECS:CSEG,DS:DSEG

START:PUSHDS;設(shè)置返回DOS

SUBAX,AX

PUSHAX

MOVAX,DSEG

MOVDS,AX;給DS賦值

BEGIN:MOVCX,n;循環(huán)計(jì)數(shù)器

LEADI,M

MOVAX,[DI];取第一個(gè)數(shù)

MOVADDR,DI;登記確定值最大的數(shù)的地址

CMPAX,0;此數(shù)是正數(shù)嗎?

JNSZHEN;是正數(shù),即為確定值,轉(zhuǎn)去推斷下一個(gè)數(shù)

NEGAX;不是正數(shù),變?yōu)槠浯_定值

ZHEN:MOVBX,[DI]

CMPBX,0;此數(shù)是正數(shù)嗎?

JNSCOMP;是正數(shù),即為確定值,轉(zhuǎn)去比較確定值大小

NEGBX;不是正數(shù),變?yōu)槠浯_定值

COMP:CMPAX,BX;推斷確定值大小

JAEADDRESS

MOVAX,BX;(AX)<(BX),使(AX)中為確定值最大的數(shù)

MOVADDR,DI;登記確定值最大的數(shù)的地址

ADDRESS:ADDDI,2

LOOPZHEN

MOVDATA,AX;登記此數(shù)

RET

MAINENDP

CSEGENDS;以上定義代碼段

ENDSTART

5.16在首地址為DATA的字?jǐn)?shù)組中存放著10011個(gè)16位補(bǔ)碼數(shù),試編寫一

個(gè)程序求出它們的平均值放在AX寄存器中;并求出數(shù)組中有多少個(gè)數(shù)小

于此平均值,將結(jié)果放在BX寄存器中。

答:程序如下:

DSEGSEGMENT

DATADW100UDUP(?)

DSEGENDS

CSEGSEGMENT

MAINPROCFAR

ASSUMECS:CSEG,DS:DSEG

START:PUSHDS;設(shè)置返回DOS

SUBAX,AX

PUSHAX

MOVAX,DSEG

MOVDS,AX;給DS賦值

BEGIN:MOVCX,100II;循環(huán)計(jì)數(shù)器

MOVSI,0

MOVBX,0;和((DI),(BX))的初始值

MOVDI,0

NEXT:MOVAX,DATA[SI]

CWD

ADDBX,AX;求和

ADCDI,DX;加上進(jìn)位位

ADDSI,2

LOOPNEXT

MOVDX,DI;將((DI),(BX))中的累加和放入((DX),(AX))中

MOVAX,BX

MOVCX,100H

IDIVCX;帶符號(hào)數(shù)求平均值,放入(AX)中

MOVBX,0

MOVSI,0

COMP:CMPAX,DATA[SI];找尋小于平均值的數(shù)

JLENO

INCBX;小于平均值數(shù)的個(gè)數(shù)+1

NO:ADDSI,2

LOOPCOMP

RET

MAINENDP

CSEGENDS;以上定義代碼段

ENDSTART

5.17試編制一個(gè)程序把AX中的16進(jìn)制數(shù)轉(zhuǎn)換為ASCII碼,并將對(duì)應(yīng)的

ASCH碼依次存放到MEM數(shù)組中的四個(gè)字節(jié)中。例如,當(dāng)(AX)=2A49H時(shí),

程序執(zhí)行完后,MEM中的4個(gè)字節(jié)內(nèi)容為39H,34H,41H,32H。

答:程序如下:

DSEGSEGMENT

MEMDB4DUP(?)

NDW2A49H

DSEGENDS

CSEGSEGMENT

MAINPROCFAR

ASSUMECS:CSEG,DS:DSEG

START:PUSHDS;設(shè)置返回DOS

SUBAX,AX

PUSHAX

MOVAX,DSEG

MOVDS,AX;給DS賦值

BEGIN:MOVCH,4;循環(huán)計(jì)數(shù)器

MOVCL,4

MOVAX,N

LEABX,MEM

ROTATE:MOVDL,AL;從最低四位起先轉(zhuǎn)換為ASCII碼

ANDDL,OFH

ADDDL,30H

CMPDL,3AH;是0~9嗎?

JLNEXT

ADDDL,07H;是A~F

NEXT:MOV[BX],DL;轉(zhuǎn)換的ASCH碼送入MEM中

INCBX

RORAX,CL;準(zhǔn)備轉(zhuǎn)換下一位

DECCH

JNZROTATE

RET

MAINENDP

CSEGENDS;以上定義代碼段

ENDSTART

5.18把O^IOOD之間的30個(gè)數(shù)存入以GRADE為首地址的30字?jǐn)?shù)組中,

GRADE+i表示學(xué)號(hào)為i+1的學(xué)生的成果。另一個(gè)數(shù)組RANK為30個(gè)學(xué)生的

名次表,其中RANK+i的內(nèi)容是學(xué)號(hào)為i+1的學(xué)生的名次。編寫一程序,

依據(jù)GRADE中的學(xué)生成果,將學(xué)生名次填入RANK數(shù)組中。(提示:一個(gè)學(xué)

生的名次等于成果高于這個(gè)學(xué)生的人數(shù)加1。)

答:程序如下:

DSEGSEGMENT

GRADEDW30DUP(?);假設(shè)已預(yù)先存好30名學(xué)生的成果

RANKDW30DUP(?)

DSEGENDS

CSEGSEGMENT

MAINPROCFAR

ASSUMECS:CSEG,DS:DSEG

START:PUSHDS;設(shè)置返回DOS

SUBAX,AX

PUSHAX

MOVAX,DSEG

MOVDS,AX;給DS賦值

BEGIN:MOVDI,0

MOVCX,30;外循環(huán)計(jì)數(shù)器

L00P1:PUSHCX

MOVCX,30;內(nèi)循環(huán)計(jì)數(shù)器

MOVSI,0

MOVAX,GRADE[DI]

MOVDX,1;起始名次為第1名

L00P2:CMPGRADE[SI],AX;成果比較

JBEGO_ON

INCDX;名次+1

GO_ON:ADDSI,2

LOOPL00P2

POPCX

MOVRNAK[DI],DX;名次存入RANK數(shù)組

ADDDI,2

LOOPLOOP1

RET

MAINENDP

CSEGENDS;以上定義代碼段

ENDSTART

5.19已知數(shù)組A包含15個(gè)互不相等的整數(shù),數(shù)組B包含20個(gè)互不相等

的整數(shù)。試編制一程序把既在A中又在B中出現(xiàn)的整數(shù)存放于數(shù)組C中。

答:程序如下:

DSEGSEGMENT

ADW15DUP(?)

BDW20DUP(?)

CDW15DUP('')

DSEGENDS

CSEGSEGMENT

MAINPROCFAR

ASSUMECS:CSEG,DS:DSEG

START:PUSHDS;設(shè)置返回DOS

SUBAX,AX

PUSHAX

MOVAX,DSEG

MOVDS,AX;給DS賦值

BEGIN:MOVSI,0

MOVBX,0

MOVCX,15;外循環(huán)計(jì)數(shù)器

LOOP1:PUSHCX

MOVCX,20;內(nèi)循環(huán)計(jì)數(shù)器

MOVDI,0

MOVAX,A[SI];取A數(shù)組中的一個(gè)數(shù)

L00P2:CMPB[DI],AX;和B數(shù)組中的數(shù)相等嗎?

JNENO

MOVC[BX],AX;相等存入C數(shù)組中

ADDBX,2

NO:ADDDI,2

LOOPL00P2

ADDSI,2

POPCX

LOOPLOOP1

RET

MAINENDP

CSEGENDS;以上定義代碼段

ENDSTART

5.20設(shè)在A、B和C單元中分別存放著三個(gè)數(shù)。若三個(gè)數(shù)都不是0,則求

出三數(shù)之和存放在D單元中;若其中有一個(gè)數(shù)為0,則把其它兩單元也清

0。請(qǐng)編寫此程序。

答:程序如下:

DSEGSEGMENT

ADW?

BDW?

CDW?

DDW0

DSEGENDS

CSEGSEGMENT

MAINPROCFAR

ASSUMECS:CSEG,DS:DSEG

START:PUSHDS;設(shè)置返回DOS

SUBAX,AX

PUSHAX

MOVAX,DSEG

MOVDS,AX;給DS賦值

BEGIN:CMPA,0

JENEXT

CMPB,0

JENEXT

CMPC,0

JENEXT

MOVAX,A

ADDAX,B

ADDAX,C

MOVD,AX

JMPSHORTEXIT

NEXT:MOVA,0

MOVB,0

MOVC,0

EXIT:RET

MAINENDP

CSEGENDS;以上定義代碼段

ENDSTART

5.21試編寫一程序,要求比較數(shù)組ARRAY中的三個(gè)16位補(bǔ)碼數(shù),并依據(jù)

比較結(jié)果在終端上顯示如下信息:

(1)假如三個(gè)數(shù)都不相等則顯示0;

(2)假如三個(gè)數(shù)有二個(gè)數(shù)相等則顯示1;

(3)假如三個(gè)數(shù)都相等則顯示2。

答:程序如下:

DSEGSEGMENT

ARRAYDW3DUP(?)

DSEGENDS

CSEGSEGMENT

MAINPROCFAR

ASSUMECS:CSEG,DS:DSEG

START:PUSHDS;設(shè)置返回DOS

SUBAX,AX

PUSHAX

MOVAX,DSEG

MOVDS,AX;給DS賦值

BEGIN:LEASI,ARRAY

MOVDX,0;(DX)用于存放所求的結(jié)果

MOVAX,[SI]

MOVBX,[SI+2]

CMPAX,BX;比較第一和其次兩個(gè)數(shù)是否相等

JNENEXT1

INCDX

NEXT1:CMP[SI+4],AX;比較第一和第三兩個(gè)數(shù)是否相等

JNENEXT2

INCDX

NEXT2:CMP[SI+4],BX;比較其次和第三兩個(gè)數(shù)是否相等

JNENUM

INCDX

NUM:CMPDX,3

JLDISP

DECDX

DISP:ADDDL,30H;轉(zhuǎn)換為ASCH碼

MOVAH,2;顯示一個(gè)字符

INT21H

RET

MAINENDP

CSEGENDS;以上定義代碼段

ENDSTART

5.22從鍵盤輸入一系列字符(以回車符結(jié)束),并按字母、數(shù)字、與其它

字符分類計(jì)數(shù),最終顯示出這三類的計(jì)數(shù)結(jié)果。

答:程序如下:

DSEGSEGMENT

ALPHABETDB'輸入的字母字符個(gè)數(shù)為:‘,'$'

NUMBERDB'輸入的數(shù)字字符個(gè)數(shù)為:‘,'$'

OTHERDB'輸入的其它字符個(gè)數(shù)為:','$'

CRLFDBODII,0AH,'$'

DSEGENDS

CSEGSEGMENT

MAINPROCFAR

ASSUMECS:CSEG,DS:DSEG

START:PUSHDS;設(shè)置返回DOS

SUBAX,AX

PUSHAX

MOVAX,DSEG

MOVDS,AX;給DS賦值

BEGIN:MOVBX,0;字母字符計(jì)數(shù)器

MOVSI,0;數(shù)字字符計(jì)數(shù)器

MOVDI,0;其它字符計(jì)數(shù)器

INPUT:MOVAH,1;輸入一個(gè)字符

INT21H

CMPAL,ODU;是回車符嗎?

JEDISP

CMPAL,30H;〈數(shù)字0嗎?

JAENEXT1

OTHER:INCDI;是其它字符

JMPSHORTINPUT

NEXT1:CMPAL,39H;>數(shù)字9嗎?

JANEXT2

INCSI;是數(shù)字字符

JMPSHORTINPUT

NEXT2:CMPAL,41H;〈字母A嗎?

JAENEXT3

JMPSHORTOTHER;是其它字符

NEXT3:CMPAL,5AH;>字母Z嗎?

JANEXT4

INCBX;是字母字符A~Z

JMPSHORTINPUT

NEXT4:CMPAL,61H;〈字母a嗎?

JAENEXT5

JMPSHORTOTHER;是其它字符

NEXT5:CMPAL,7AH;>字母z嗎?

JASHORTOTHER;是其它字符

INCBX;是字母字符a~z

JMPSHORTINPUT

DISP:LEADX,ALPHABET

CALLDISPLAY

LEADX,NUMBER

MOVBX,SI

CALLDISPLAY

LEADX,OTHER

MOVBX,DI

CALLDISPLAY

RET

MAINENDP

DISPLAYPROCNEAR

MOVAH,09H;顯示字符串功能調(diào)用

INT21H

CALLBINIHEX;調(diào)把BX中二進(jìn)制數(shù)轉(zhuǎn)換為16進(jìn)制顯示子程序

LEADX,CRLF

MOVAH,0911;顯示回車換行

INT21H

RET

DISPLAYENDP

BINIHEXPROCNEAR;將BX中二進(jìn)制數(shù)轉(zhuǎn)換為16進(jìn)制數(shù)顯示子程序

MOVCH,4

ROTATE:MOVCL,4

ROLBX,CL

MOVDL,BL

ANDDL,OFH

ADDDL,30H

CMPDL,3AH;是A~F嗎?

JLPRINT_IT

ADDDL,07H

PRINT_IT:MOVAH,02H;顯示一個(gè)字符

INT21H

DECCH

JNZROTATE

RET

BINIUEXENDP

CSEGENDS;以上定義代碼段

ENDSTART

5.23已定義了兩個(gè)整數(shù)變量A和B,試編寫程序完成下列功能:

(1)若兩個(gè)數(shù)中有一個(gè)是奇數(shù),則將奇數(shù)存入A中,偶數(shù)存入B中;

(2)若兩個(gè)數(shù)中均為奇數(shù),則將兩數(shù)加1后存回原變量;

(3)若兩個(gè)數(shù)中均為偶數(shù),則兩個(gè)變量均不變更。

答:程序如下:

DSEGSEGMENT

ADW?

BDW?

DSEGENDS

CSEGSEGMENT

MAINPROCFAR

ASSUMECS:CSEG,DS:DSEG

START:PUSHDS;設(shè)置返回DOS

SUBAX,AX

PUSHAX

MOVAX,DSEG

MOVDS,AX;給DS賦值

BEGIN:MOVAX,A

MOVBX,B

XORAX,BX

TESTAX,OOO1H;A和B同為奇數(shù)或偶數(shù)嗎?

JZCLASS;A和B都為奇數(shù)或偶數(shù),轉(zhuǎn)走

TESTBX,0001H

JZEXIT;B為偶數(shù),轉(zhuǎn)走

XCHGBX,A;A為偶數(shù),將奇數(shù)存入A中

MOVB,BX;將偶數(shù)存入B中

JMPEXIT

CLASS:TESTBX,0001H;A和B都為奇數(shù)嗎?

JZEXIT;A和B同為偶數(shù),轉(zhuǎn)走

INCB

INCA

EXIT:RET

MAINENDP

CSEGENDS;以上定義代碼段

ENDSTART

5.24假設(shè)已編制好5個(gè)歌曲程序,它們的段地址和偏移地址存放在數(shù)據(jù)

段的跳動(dòng)表SINGLIST中。試編制一程序,依據(jù)從鍵盤輸入的歌曲編號(hào)C5,

轉(zhuǎn)去執(zhí)行五個(gè)歌曲程序中的某一個(gè)。

答:程序如下:

DSEGSEGMENT

SINGLISTDDSING1

DDSING2

DDSING3

DDSING4

DDSING5

ERRMSGDB'Error!Invalidparameter!J,ODII,OAH,'$

DSEGENDS

CSEGSEGMENT

MAINPROCFAR

ASSUMECS:CSEG,DS:DSEG

START:PUSHDS;設(shè)置返回DOS

SUBAX,AX

PUSHAX

MOVAX,DSEG

MOVDS,AX;給DS賦值

BEGIN:MOVAH,1;從鍵盤輸入的歌曲編號(hào)1~5

INT21H

CMPAL,ODH

JZEXIT;是回車符,則結(jié)束

SUBAL,T;是「5嗎?

JBERROR;小于1,錯(cuò)誤

CMPAL,4

JAERROR;大于5,錯(cuò)誤

MOVBX,OFFSETSINGLIST

MULAX,4;(AX)=(AL)*4,每個(gè)歌曲程序的首地址占4個(gè)字節(jié)

ADDBX,AX

JMPDWORDPTR[BX];轉(zhuǎn)去執(zhí)行歌曲程序

ERROR:MOVDX,OFFSETERRMSG

MOVAH,09H

INT21H;顯示錯(cuò)誤信息

JMPBEGIN

SING1:■

JMPBEGIN

SING2:;

JMPBEGIN

SING3:I

JMPBEGIN

SING4:■

JMPBEGIN

SING5:!

JMPBEGIN

EXIT:RET

MAINENDP

CSEGENDS;以上定義代碼段

ENDSTART

5.25試用8086的乘法指令編制一個(gè)32位數(shù)和16位數(shù)相乘的程序;再用

80386的乘法指令編制一個(gè)32位數(shù)和16位數(shù)相乘的程序,并定性比較兩

個(gè)程序的效率。

答:8086的程序如下(假設(shè)為無(wú)符號(hào)數(shù)):

DSEGSEGMENT

MUL1DD?;

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論