汇编大题.docx

上传人:b****6 文档编号:8919647 上传时间:2023-02-02 格式:DOCX 页数:18 大小:19.81KB
下载 相关 举报
汇编大题.docx_第1页
第1页 / 共18页
汇编大题.docx_第2页
第2页 / 共18页
汇编大题.docx_第3页
第3页 / 共18页
汇编大题.docx_第4页
第4页 / 共18页
汇编大题.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

汇编大题.docx

《汇编大题.docx》由会员分享,可在线阅读,更多相关《汇编大题.docx(18页珍藏版)》请在冰豆网上搜索。

汇编大题.docx

汇编大题

5.1试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来。

答:

程序段如下:

BEGIN:

MOVAH,1;从键盘输入一个字符的DOS调用

INT21H

CMPAL,‘a’;输入字符<‘a’吗?

JBSTOP

CMPAL,‘z’;输入字符>‘z’吗?

JASTOP

SUBAL,20H;转换为大写字母,用ANDAL,11011111B也可

MOVDL,AL;显示一个字符的DOS调用

MOVAH,2

INT21H

JMPBEGIN

STOP:

RET

5.2编写程序,从键盘接收一个小写字母,然后找出它的前导字符和后续字符,再按顺序显

示这三个字符。

答:

程序段如下:

BEGIN:

MOVAH,1;从键盘输入一个字符的DOS调用

INT21H

CMPAL,‘a’;输入字符<‘a’吗?

JBSTOP

CMPAL,‘z’;输入字符>‘z’吗?

JASTOP

DECAL;得到前导字符

MOVDL,AL;准备显示三个字符

MOVCX,3

DISPLAY:

MOVAH,2;显示一个字符的DOS调用

INT21H

INCDL

LOOPDISPLAY

STOP:

RET

5.3将AX寄存器中的16位数分成4组,每组4位,然后把这四组数分别放在AL、BL、CL和DL中。

答:

程序段如下:

DSEGSEGMENT

STOREDB4DUP(?

DSEGENDS

BEGIN:

MOVCL,4;右移四次

MOVCH,4;循环四次

LEABX,STORE

A10:

MOVDX,AX

ANDDX,0FH;取AX的低四位

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

INCBX

SHRAX,CL;右移四次

DECCH

JNZA10;循环四次完了码?

B10:

MOVDL,STORE;四组数分别放在AL、BL、CL和DL中

MOVCL,STORE+1

MOVBL,STORE+2

MOVAL,STORE+3

STOP:

RET

5.4试编写一程序,要求比较两个字符串STRING1和STRING2所含字符是否完全相同,若相同则显示‘MATCH’,若不相同则显示‘NOMATCH’。

答:

程序如下:

DSEGSEGMENT

STRING1DB‘Iamastudent.’

STRING2DB‘Iamastudent!

YESDB‘MATCH’,0DH,0AH,‘$’

NODB‘NOMATCH’,0DH,0AH,‘$’

DSEGENDS

CSEGSEGMENT

MAINPROCFAR

ASSUMECS:

CSEG,DS:

DSEG,ES:

DSEG

START:

PUSHDS;设置返回DOS

SUBAX,AX

PUSHAX

MOVAX,DSEG

MOVDS,AX;给DS赋值

MOVES,AX;给ES赋值

BEGIN:

LEASI,STRING1;设置串比较指令的初值

LEADI,STRING2

CLD

MOVCX,STRING2-STRING1

REPECMPSB;串比较

JNEDISPNO

LEADX,YES;显示MATCH

JMPDISPLAY

DISPNO:

LEADX,NO;显示NOMATCH

DISPLAY:

MOVAH,9;显示一个字符串的DOS调用

INT21H

RET

MAINENDP

CSEGENDS;以上定义代码段

ENDSTART

5.5试编写一程序,要求能从键盘接收一个个位数N,然后响铃N次(响铃的ASCII码为07)。

答:

程序段如下:

BEGIN:

MOVAH,1;从键盘输入一个字符的DOS调用

INT21H

SUBAL,‘0’

JBSTOP;输入字符<‘0’吗?

CMPAL,9;输入字符>‘9’吗?

JASTOP

CBW

MOVCX,AX;响铃次数N

JCXZSTOP

BELL:

MOVDL,07H;准备响铃

MOVAH,2;显示一个字符的DOS调用,实际为响铃

INT21H

CALLDELAY100ms;延时100ms

LOOPBELL

STOP:

RET

5.6编写程序,将一个包含有20个数据的数组M分成两个数组:

正数数组P和负数数组N,

并分别把这两个数组中数据的个数显示出来。

答:

程序如下:

DSEGSEGMENT

COUNTEQU20

ARRAYDW20DUP(?

);存放数组

COUNT1DB0;存放正数的个数

ARRAY1DW20DUP(?

);存放正数

COUNT2DB0;存放负数的个数

ARRAY2DW20DUP(?

);存放负数

ZHENDB0DH,0AH,‘Thepositivenumberis:

’,‘$’;正数的个数是:

FUDB0DH,0AH,‘Thenegativenumberis:

’,‘$’;负数的个数是:

CRLFDB0DH,0AH,‘$’

DSEGENDS

CSEGSEGMENT

MAINPROCFAR

ASSUMECS:

CSEG,DS:

DSEG

START:

PUSHDS;设置返回DOS

SUBAX,AX

PUSHAX

MOVAX,DSEG

MOVDS,AX;给DS赋值

BEGIN:

MOVCX,COUNT

LEABX,ARRAY

LEASI,ARRAY1

LEADI,ARRAY2

BEGIN1:

MOVAX,[BX]

CMPAX,0;是负数码?

JSFUSHU

MOV[SI],AX;是正数,存入正数数组

INCCOUNT1;正数个数+1

ADDSI,2

JMPSHORTNEXT

FUSHU:

MOV[DI],AX;是负数,存入负数数组

INCCOUNT2;负数个数+1

ADDDI,2

NEXT:

ADDBX,2

LOOPBEGIN1

LEADX,ZHEN;显示正数个数

MOVAL,COUNT1

CALLDISPLAY;调显示子程序

LEADX,FU;显示负数个数

MOVAL,COUNT2

CALLDISPLAY;调显示子程序

RET

MAINENDP

DISPLAYPROCNEAR;显示子程序

MOVAH,9;显示一个字符串的DOS调用

INT21H

AAM;将(AL)中的二进制数转换为二个非压缩BCD码

ADDAH,‘0’;变为0~9的ASCII码

MOVDL,AH

MOVAH,2;显示一个字符的DOS调用

INT21H

ADDAL,‘0’;变为0~9的ASCII码

MOVDL,AL

MOVAH,2;显示一个字符的DOS调用

INT21H

LEADX,CRLF;显示回车换行

MOVAH,9;显示一个字符串的DOS调用

INT21H

RET

DISPLAYENDP;显示子程序结束

CSEGENDS;以上定义代码段

ENDSTART

5.7试编写一个汇编语言程序,求出首地址为DATA的100D字数组中的最小偶数,并把它存放在AX中。

答:

程序段如下:

BEGIN:

MOVBX,0

MOVCX,100

COMPARE:

MOVAX,DATA[BX];取数组的第一个偶数

ADDBX,2

TESTAX,01H;是偶数吗?

LOOPNZCOMPARE;不是,比较下一个数

JNZSTOP;没有偶数,退出

JCXZSTOP;最后一个数是偶数,即为最小偶数,退出

COMPARE1:

MOVDX,DATA[BX];取数组的下一个偶数

ADDBX,2

TESTDX,01H;是偶数吗?

JNZNEXT;不是,比较下一个数

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

JLENEXT

MOVAX,DX;(AX)<(DX),则置换(AX)为最小偶数

NEXT:

LOOPCOMPARE1

STOP:

RET

5.8把AX中存放的16位二进制数K看作是8个二进制的“四分之一字节”。

试编写程序要

求数一下值为3(即11B)的四分之一字节数,并将该数(即11B的个数)在终端上显示出来。

答:

程序段如下:

BEGIN:

MOVDL,0;计数初始值

MOVCX,8

COMPARE:

TESTAX,03H;是数03吗?

JNZNOEQUAL;不是,转走

INCDL;是,计数

NOEQUAL:

RORAX,1;准备判断下一个数

RORAX,1

LOOPCOMPARE

ADDDL,‘0’;将计数值转换为ASCII码

MOVAH,2;进行显示

INT21H

STOP:

RET

5.16在首地址为DATA的字数组中存放着100H个16位补码数,试编写一个程序求出它们的平均值放在AX寄存器中;并求出数组中有多少个数

小于此平均值,将结果放在BX寄存器中。

答:

程序如下:

DSEGSEGMENT

DATADW100HDUP(?

DSEGENDS

;--------------------------------------------------------------------------

CSEGSEGMENT

MAINPROCFAR

ASSUMECS:

CSEG,DS:

DSEG

START:

PUSHDS;设置返回DOS

SUBAX,AX

PUSHAX

MOVAX,DSEG

MOVDS,AX;给DS赋值

MOVCX,100H;循环计数器;

MOVSI,0;

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

MOVDI,0;

NEXT:

MOVAX,DATA[SI];

CWD;

ADDBX,AX;求和;

ADCDI,DX;加上进位位;ADDSI,2;LOOPNEXT;MOVDX,DI;将((DI),(BX))中的累;MOVAX,BX;MOVCX,100H;IDIVCX;带符

MOVCX,100H;循环计数器

MOVSI,0

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

MOVDI,0

NEXT:

MOVAX,DATA[SI]

CWD

ADDBX,AX;求和

ADCDI,DX;加上进位位

ADDSI,2

LOOPNEXT

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

MOVAX,BX

MOVCX,100H

IDIVCX;带符号数求平均值,放入(AX)中

MOVBX,0

MOVSI,0

COMP:

CMPAX,DATA[SI];寻找小于平均值的数

JLENO

INCBX;小于平均值数的个数+1

NO:

ADDSI,2

LOOPCOMP

RET

MAINENDP

CSEGENDS;以上定义代码段

;--------------------------------------------------------------------------

ENDSTART

5.17试编制一个程序把AX中的16进制数转换为ASCII码,并将对应的ASCII码依次存放到MEM数组中的四个字节中。

例如,当(AX)=2A49H

时,程序执行完后,MEM中的4个字节内容为39H,34H,41H,32H。

答:

程序如下:

DSEGSEGMENT

MEMDB4DUP(?

NDW2A49H

DSEGENDS

;--------------------------------------------------------------------------

CSEGSEGMENT

MAINPROCFAR

ASSUMECS:

CSEG,DS:

DSEG

START:

PUSHDS;设置返回DOS

SUBAX,AX

PUSHAX

MOVAX,DSEG

MOVDS,AX;给DS赋值

BEGIN:

MOVCH,4;循环计数器

MOVCL,4

MOVAX,N

LEABX,MEM

ROTATE:

MOVDL,AL;从最低四位开始转换为ASCII码

ANDDL,0FH

ADDDL,30H

CMPDL,3AH;是0~9吗?

JLNEXT

ADDDL,07H;是A~F

NEXT:

MOV[BX],DL;转换的ASCII码送入MEM中

INCBX

RORAX,CL;准备转换下一位

DECCH

JNZROTATE

RET

MAINENDP

CSEGENDS;以上定义代码段

;--------------------------------------------------------------------------

ENDSTART

5.18把0~100D之间的30个数存入以GRADE为首地址的30字数组中,GRADE+i表示学号为i+1的学生的成绩。

另一个数组RANK为30个学

生的名次表,其中RANK+i的内容是学号为i+1的学生的名次。

编写一程序,根据GRADE中的学生成绩,将学生名次填入RANK数组中。

(提示:

一个学生的名次等于成绩高于这个学生的人数加1。

答:

程序如下:

DSEGSEGMENT

GRADEDW30DUP(?

);假设已预先存好30名学生的成绩

RANKDW30DUP(?

DSEGENDS

;--------------------------------------------------------------------------

CSEGSEGMENT

MAINPROCFAR

ASSUMECS:

CSEG,DS:

DSEG

START:

PUSHDS;设置返回DOS

SUBAX,AX

PUSHAX

MOVAX,DSEG

MOVDS,AX;给DS赋值BEGIN:

MOVDI,0

MOVCX,30;外循环计数器

LOOP1:

PUSHCX

MOVCX,30;内循环计数器

MOVSI,0

MOVAX,GRADE[DI]

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

LOOP2:

CMPGRADE[SI],AX;成绩比较

JBEGO_ON

INCDX;名次+1

GO_ON:

ADDSI,2

LOOPLOOP2

POPCX

MOVRNAK[DI],DX;名次存入RANK数组

ADDDI,2

LOOPLOOP1

RET

MAINENDP

CSEGENDS;以上定义代码段

;--------------------------------------------------------------------------

ENDSTART

5.19已知数组A包含15个互不相等的整数,数组B包含20个互不相等的整数。

试编制一程序把既在A中又在B中出现的整数存放于数组C中。

答:

程序如下:

DSEGSEGMENT

ADW15DUP(?

BDW20DUP(?

CDW15DUP(?

‘)

DSEGENDS

;--------------------------------------------------------------------------

CSEGSEGMENT

MAINPROCFAR

ASSUMECS:

CSEG,DS:

DSEG

START:

PUSHDS;设置返回DOS

SUBAX,AX

PUSHAX

MOVAX,DSEG

MOVDS,AX;给DS赋值

BEGIN:

MOVSI,0

MOVBX,0

MOVCX,15;外循环计数器

LOOP1:

PUSHCX

MOVCX,20;内循环计数器

MOVDI,0

MOVAX,A[SI];取A数组中的一个数

LOOP2:

CMPB[DI],AX;和B数组中的数相等吗?

JNENO

MOVC[BX],AX;相等存入C数组中

ADDBX,2

NO:

ADDDI,2

LOOPLOOP2

ADDSI,2

POPCX

LOOPLOOP1

RET

MAINENDP

CSEGENDS;以上定义代码段

;--------------------------------------------------------------------------

ENDSTART

5.20设在A、B和C单元中分别存放着三个数。

若三个数都不是0,则求出三数之和存放在D单元中;若其中有一个数为0,则把其它两单元也

清0。

请编写此程序。

答:

程序如下:

DSEGSEGMENT

ADW?

BDW?

CDW?

DDW0

DSEGENDS

;--------------------------------------------------------------------------

CSEGSEGMENT

MAINPROCFAR

ASSUMECS:

CSEG,DS:

DSEG

START:

PUSHDS;设置返回DOS

SUBAX,AX

PUSHAX

MOVAX,DSEG

MOVDS,AX;给DS赋值

BEGIN:

CMPA,0

JENEXT

CMPB,0BEGIN:

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试编写一程序,要求比较数组ARRAY中的三个16位补码数,并根据比较结果在终端上显示如下信息:

(1)如果三个数都不相等则显示0;

(2)如果三个数有二个数相等则显示1;

(3)如果三个数都相等则显示2。

答:

程序如下:

DSEGSEGMENT

ARRAYDW3DUP(?

DSEGENDS

;--------------------------------------------------------------------------

CSEGSEGMENT

MAINPROCFAR

ASSUMECS:

CSEG,DS:

DSEG

START:

PUSHDS;设置返回DOS

SUBAX,AX

PUSHAX

MOVAX,DSEG

MOVDS,AX;给DS赋值

BEGIN:

LEASI,ARRAY

MOVDX,0;(DX)用于存放所求的结果

MOVAX,[SI]

MOVBX,[SI+2]

CMPAX,BX;比较第一和第二两个数是否相等

JNENEXT1

INCDX

NEXT1:

CMP[SI+4],AX;比较第一和第三两个数是否相等

JNENEXT2

INCDX

NEXT2:

CMP[SI+4],BX;比较第二和第三两个数是否相等

JNENUM

INCDX

NUM:

CMPDX,3

JLDISP

DECDX

DISP:

ADDDL,30H;转换为ASCII码

MOVAH,2;显示一个字符

INT21H

RET

MAINENDP

CSEGENDS;以上定义代码段

;--------------------------------------------------------------------------

ENDSTART

5.22从键盘输入一系列字符(以回车符结束),并按字母、数字、及其它字符分类计数,最后显示出这三类的计数结果。

答:

程序如下:

DSEGSEGMENT

ALPHABETDB?

输入的字母字符个数为:

‘,?

$‘

NUMBERDB?

输入的数字字符个数为:

‘,?

$‘

OTHERDB?

输入的其它字符个数为:

‘,?

$‘

CRLFDB0DH,0AH,?

$‘

DSEGENDS

;--------------------------------------------------------------------------

CSEGSEGMENT

MAINPROCFAR

ASSUMECS:

CSEG,DS:

DSEG

START:

PUSHDS;设置返回DOS

SUBAX,AX

PUSHAX

MOVAX,DSEG

MOVDS,AX;给DS赋值

BEGIN:

MOVBX,0;字母字符计数器

MOVSI,0;数字字符计数器

MOVDI,0;其它字符计数器

INPUT:

MOVAH,1;输入一个字符

INT21H

OTHER:

NEXT1:

NEXT2:

NEXT3:

NEXT4:

NEXT5:

CMPAL,0DHJEDISPCMPAL,30HJAENEXT1INCDIJMPSHORTINPUTCMPAL,39HJANEXT2INCSIJMPSHORTINPUTCMPAL,41HJAENEXT3JMPSHORTOTHERCMPAL,5AHJANEXT4INBXJMPSHORTINPUTCMPAL,61HJAENEXT5JMPSHORTOTHERCMPAL,7AH

JASHORTOTHER

INCBX

JMPSHORTINPUT;是回车符吗?

;<数字0吗?

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1