汇编大题.docx
《汇编大题.docx》由会员分享,可在线阅读,更多相关《汇编大题.docx(18页珍藏版)》请在冰豆网上搜索。
汇编大题
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吗?