微机原理习题.docx
- 文档编号:11929619
- 上传时间:2023-04-16
- 格式:DOCX
- 页数:26
- 大小:22.13KB
微机原理习题.docx
《微机原理习题.docx》由会员分享,可在线阅读,更多相关《微机原理习题.docx(26页珍藏版)》请在冰豆网上搜索。
微机原理习题
习题3
3.1在以Block为首地址的字节单元中,存放了一个班级的学生考试成绩。
试编写一程序,利用学生的序号来查表得到该学生的成绩,设学生的序号在NUMBER单元,查表结果存入RESULT单元。
解:
DSEGSEGMENT
BLOCKDB67,78,86,57,88,75,78,96,77,88,87,95,67,86,83,55
NUMBERDB9;要显示的16进制数字
RESULTDB?
;存放要显示数字对应的七段码
DSEGENDS
CSEGSEGMENT
ASSUMECS:
CSEG,DS:
DSEG
START:
MOVAX,DSEG
MOVDS,AX
MOVBX,OFFSETBLOCK
MOVAL,NUMBER;取16进制数字
ANDAL,0FH
XLAT;查表取得对应的七段码
MOVRESULT,AL;保存
MOVAX,4C00H
INT21H
CSEGENDS
ENDSTART
3.2试编程序,统计由52600H开始的100个单元中所存放的字符“A“的个数,并将结果存放在DX中。
解:
CSEGSEGMENT
ASSUMECS:
CSEG
START:
MOVAX,5260H
MOVDS,AX
MOVBX,0
MOVAL,'A'
MOVCX,100
MOVDX,0
AGA:
CMPAL,[BX]
JNZLP
INCDX
LP:
INCBX
LOOPAGA
MOVAX,4C00H
INT21H
CSEGENDS
ENDSTART
3.3在当前数据段(DS),偏移地址为GRADE开始的连续80个单元中,存放着某班80个同学某门考试成绩。
按要求编写程序:
①试编写程序统计≥90分;80分~89分;70分~79分;60分~69分,<60分的人数各为多少,并将结果放在同一数据段、偏移地址为LEVEL开始的连续单元中。
②试编写程序,求该班这门课的平均成绩为多少,并放在该数据段的AVER单元中。
解:
DATASEGMENT
GRADEDB80DUP(?
);运行前置入具体数据
LEVELDB0;大于90
LEVEL1DB0;80分~89分
LEVEL2DB0;70分~79分
LEVEL3DB0;60分~69分
LEVEL4DB0;<60分
AVERDB?
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
LEASI,GRADE
MOVDX,0
MOVCX,80
AGAIN:
MOVAL,[SI]
CMPAL,59;分段测试
JAL1
L0:
INCLEVEL4
JMPNEXT
L1:
CMPAL,69
JAL2
INCLEVEL3
JMPNEXT
L2:
CMPAL,79
JAL3
INCLEVEL2
JMPNEXT
L3:
CMPAL,89
JAL4
INCLEVEL1
JMPNEXT
L4:
INCLEVEL
NEXT:
ADDSI,1
ADDDL,AL;求累加和
ADCDH,0
LOOPAGAIN
MOVAX,DX
MOVBL,80
DIVBL
MOVAVER,AL
EXIT:
MOVAX,4C00H
INT21H
CODEENDS
ENDSTART
3.4在以字节变量ARRAY为首地址的内存区域存储了一组带符号的数据,试编写程序将数据组的所有正数相加,并将和送入SUM字单元。
解:
DATASEGMENT
ARRAYDB12,-67,44,67,-35,66,55,-98,87,-87,33,83
COUNTEQU$-ARRAY
SUMDW?
;SUM存放累加和
DATAENDS
CODESEGMENT
ASSUMEDS:
DATA,CS:
CODE
START:
MOVAX,DATA
MOVDS,AX
MOVBX,0;BX是数组元素在数组内的位移,初值0
MOVCX,COUNT;装载循环计数器的初始值
MOVDX,0;累加器AX清零
ONE:
MOVAL,ARRAY[BX]
CMPAL,0
JLENEXT
CBW
ADDDX,AX;
NEXT:
INCBX;修改BX的值,为下一次操作做准备
LOOPONE;计数循环
MOVSUM,DX;保存结果(累加和)
MOVAX,4C00H
INT21H
CODEENDS
ENDSTART
3.5若某班有50名学生,考汇编语言课程,且所有考生的成绩都已存放自XX单元开始的内存区中,试编写一程序找出最高分和最低分。
解:
DATASEGMENT
XXDB50DUP(?
);运行前置入具体数据
COUNTEQU$-XX
MINDB?
MAXDB?
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVMIN,100;假设最小的数
MOVMAX,0;假设最大的数
LEASI,XX
MOVCX,COUNT
AGAIN:
MOVAL,[SI]
CMPAL,MIN
JAESKIP1
MOVMIN,AL;比预设最小值还小,保留
SKIP1:
CMPAL,MAX
JBESKIP2
MOVMAX,AL;比预设最大值还大,保留
SKIP2:
INCSI
LOOPAGAIN
EXIT:
MOVAX,4C00H
INT21H
CODEENDS
ENDSTART
3.6在首地址为ARRAY为首地址的内存区域里,存放了一组带符号的数据,试编写程序分别统计零、正数和负数的个数,统计结果分别存放在ZZ、XX、YY中。
解:
DATASEGMENT
ARRAYDB56,-42,66,87,0,88,-88,68,0,-67,58,97,-66,86,77
;运行前置入具体数据
COUNTEQU$-ARRAY
XXDB0;正数的个数
YYDB0;0的个数
ZZDB0;负数的个数
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
LEASI,ARRAY
MOVCX,COUNT
AGAIN:
MOVAL,[SI]
CMPAL,0;分段测试
JGEL1
L0:
INCZZ
JMPNEXT
L1:
JGL2
INCYY
JMPNEXT
L2:
INCXX
NEXT:
ADDSI,1
LOOPAGAIN
EXIT:
MOVAX,4C00H
INT21H
CODEENDS
ENDSTART
3.7设有一个管理软件可接受十个键盘命令(分别是A、B、C,...,J),执行这十个命令的程序入口地址分别是PROCA、PROCB、PROCC,...,PROCJ。
编写一程序从键盘上接收命令,并转去执行相应的程序。
要求分别用以下两种方式来实现:
(1)用比较转移指令
(2)用地址表法
解:
(1)
DATASEGMENT
PROMPTDB0DH,0AH,"INPUTACHAR('A'~'J'):
$"
MSGADB0DH,0AH,"FUNCTIONAEXECUTED.$"
MSGBDB0DH,0AH,"FUNCTIONBEXECUTED.$"
MSGCDB0DH,0AH,"FUNCTIONCEXECUTED.$"
MSGDDB0DH,0AH,"FUNCTIONDEXECUTED.$"
MSGEDB0DH,0AH,"FUNCTIONEEXECUTED.$"
MSGFDB0DH,0AH,"FUNCTIONFEXECUTED.$"
MSGGDB0DH,0AH,"FUNCTIONGEXECUTED.$"
MSGHDB0DH,0AH,"FUNCTIONHEXECUTED.$"
MSGIDB0DH,0AH,"FUNCTIONIEXECUTED.$"
MSGJDB0DH,0AH,"FUNCTIONJEXECUTED.$"
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
INPUT:
LEADX,PROMPT
MOVAH,9
INT21H;输出提示信息
MOVAH,1
INT21H;输入一个数字
;*****************①开始测试条件*******************
CMPAL,'A'
JBINPUT;不在"A~J"内,重新输入
JEFA;字符"A",转FA
CMPAL,'B'
JEFB;字符"B",转FB
CMPAL,'C'
JEFC;字符"C",转FC
CMPAL,'D'
JEFD;字符"D",转FD
CMPAL,'E'
JEFE;字符"E",转FE
CMPAL,'F'
JEFF;字符"F",转FF
CMPAL,'G'
JEFG;字符"G",转FG
CMPAL,'H'
JEFH;字符"H",转FH
CMPAL,'I'
JEFI;字符"I",转FI
CMPAL,'J'
JEFJ;字符"J",转FJ
JMPINPUT;大于"J",重新输入
;*****************②各分支语句序列******************
FA:
CALLPROCA;调用PROCA程序块
JMPEXIT;每个分支结束,都要用JMP指令跳转到所有分支结束的地方
FB:
CALLPROCB;调用PROCB程序块
JMPEXIT
FC:
CALLPROCC;调用PROCC程序块
JMPEXIT
FD:
CALLPROCD;调用PROCD程序块
JMPEXIT
FE:
CALLPROCE;调用PROCE程序块
JMPEXIT
FF:
CALLPROCF;调用PROCF程序块
JMPEXIT
FG:
CALLPROCG;调用PROCG程序块
JMPEXIT
FH:
CALLPROCH;调用PROCH程序块
JMPEXIT
FI:
CALLPROCI;调用PROCI程序块
JMPEXIT
FJ:
CALLPROCJ;调用PROCJ程序块
JMPEXIT;最后一个分支结束,JMP可以省略
EXIT:
MOVAX,4C00H
INT21H
PROCAPROC
LEADX,MSGA
MOVAH,9
INT21H
RET
PROCAENDP
PROCBPROC
LEADX,MSGB
MOVAH,9
INT21H
RET
PROCBENDP
PROCCPROC
LEADX,MSGC
MOVAH,9
INT21H
RET
PROCCENDP
PROCDPROC
LEADX,MSGD
MOVAH,9
INT21H
RET
PROCDENDP
PROCEPROC
LEADX,MSGE
MOVAH,9
INT21H
RET
PROCEENDP
PROCFPROC
LEADX,MSGF
MOVAH,9
INT21H
RET
PROCFENDP
PROCGPROC
LEADX,MSGG
MOVAH,9
INT21H
RET
PROCGENDP
PROCHPROC
LEADX,MSGH
MOVAH,9
INT21H
RET
PROCHENDP
PROCIPROC
LEADX,MSGI
MOVAH,9
INT21H
RET
PROCIENDP
PROCJPROC
LEADX,MSGJ
MOVAH,9
INT21H
RET
PROCJENDP
CODEENDS
ENDSTART
(2)
DATASEGMENT
PROMPTDB0DH,0AH,"INPUTACHAR('A'~'J'):
$"
MSGADB0DH,0AH,"FUNCTIONAEXECUTED.$"
MSGBDB0DH,0AH,"FUNCTIONBEXECUTED.$"
MSGCDB0DH,0AH,"FUNCTIONCEXECUTED.$"
MSGDDB0DH,0AH,"FUNCTIONDEXECUTED.$"
MSGEDB0DH,0AH,"FUNCTIONEEXECUTED.$"
MSGFDB0DH,0AH,"FUNCTIONFEXECUTED.$"
MSGGDB0DH,0AH,"FUNCTIONGEXECUTED.$"
MSGHDB0DH,0AH,"FUNCTIONHEXECUTED.$"
MSGIDB0DH,0AH,"FUNCTIONIEXECUTED.$"
MSGJDB0DH,0AH,"FUNCTIONJEXECUTED.$"
ADDTBLDWFA,FB,FC,FD,FE,FF,FG,FH,FI,FJ;
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
INPUT:
LEADX,PROMPT
MOVAH,9
INT21H;输出提示信息
MOVAH,1
INT21H;输入一个数字
CMPAL,'A'
JBINPUT;不在"A~J"内,重新输入
CMPAL,'J'
JAINPUT;不在"A~J"内,重新输入
SUBAL,'A';将数字字符“1”到“3”转换为0,1,2
SHLAL,1;转换为0,2,4
MOVBL,AL
MOVBH,0;转入BX
JMPADDTBL[BX];间接寻址,转移到对应程序块
;*****************②各分支语句序列******************
FA:
LEADX,MSGA;FA程序块
JMPOUTPUT;每个分支结束,都要用JMP指令跳转到所有分支结束的地方
FB:
LEADX,MSGB;FB程序块
JMPOUTPUT
FC:
LEADX,MSGC;FC程序块
JMPOUTPUT
FD:
LEADX,MSGD;FD程序块
JMPOUTPUT
FE:
LEADX,MSGE;FE程序块
JMPOUTPUT
FF:
LEADX,MSGF;FF程序块
JMPOUTPUT
FG:
LEADX,MSGG;FG程序块
JMPOUTPUT
FH:
LEADX,MSGH;FH程序块
JMPOUTPUT
FI:
LEADX,MSGI;FI程序块
JMPOUTPUT
FJ:
LEADX,MSGJ;FJ程序块
JMPOUTPUT;最后一个分支结束,JMP可以省略
OUTPUT:
MOVAH,9
INT21H
MOVAX,4C00H
INT21H
CODEENDS
ENDSTART
3.8设在寄存器AX,BX,CX中存放的是16位无符号数,试编写程序段,找出三个数值居中的一个,并将其存入BUFF字单元中。
解:
DATASEGMENT
BUFFDW0
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVAX,5
MOVBX,3
MOVCX,6
CMPAX,BX
JAL1
JZL2
L0:
CMPAX,CX;AX JAEL4;AX L2: CMPBX,CX JBEL5 JMPL6 L1: CMPBX,CX JAEL5;BX CMPAX,CX JAL6 L4: MOVBUFF,AX JMPDONE L5: MOVBUFF,BX JMPDONE L6: MOVBUFF,CX DONE: MOVAX,4C00H INT21H CODEENDS ENDSTART 3.9编写确定一个十进制数x(2≤x≤200)是否是素数(质数)的程序。 解: DATASEGMENT xDB12;x(2≤x≤200) FLAGDB0;X是素数,FLAG=1,否则FLAG=0 DATAENDS CODESEGMENT ASSUMEDS: DATA,CS: CODE START: MOVAX,DATA MOVDS,AX MOVBL,2 MOVBH,X SHRBH,1;计算测试范围 MOVFLAG,1;先假设x为素数 NEXT: MOVAL,X MOVAH,0 DIVBL CMPAH,0;余数为0,说明不是素数,退出 JZNO INCBL CMPBL,BH JZEXIT;到测试边界,退出 JMPNEXT NO: MOVFLAG,0 EXIT: MOVAX,4C00H INT21H CODEENDS ENDSTART 3.10在以BLOCK为首地址的数据区域按着从小到大的顺序存放了一个年级(180人)学生的汇编语言成绩表。 试编写程序将分数82插入到该数组合适的位置。 解: DATASEGMENT BLOCKDB1,3,5,7,9,12,15,25,35,36,37,40,42,46,57;学生的成绩表,可根据实际填写 STDB39;另外一个学生的成绩 DATAENDS CODESEGMENT ASSUMECS: CODE,DS: DATA START: MOVAX,DATA MOVDS,AX LEASI,BLOCK+14;取成绩表中最后一个学生成绩的偏移地址给SI MOVCX,15 MOVAL,ST CMPBLK: CMPAL,[SI];要插入的学生成绩比成绩表中的成绩小,则转CHANGE JBCHANGE MOV[SI+1],AL;插入该学生成绩 JMPDONE CHANGE: MOVBL,[SI];把表中成绩后移 MOV[SI+1],BL DECSI LOOPCMPBLK DONE: MOVAX,4C00H INT21H CODEENDS ENDSTART 3.11已知数组A中包含15个互不相等的整数,数据B中包含20个互不相等的整数,试编写一程序,将即在A数组中出现又在B数组中出现的整数存放于数组C中。 解: DATASEGMENT ADB1,3,5,7,9,12,15,25,35,36,37,40,42,46,57 BDB3,5,9,12,25,36,37,42,57,58,60,4,8,11,17,29,33,44,55,66 CDB20DUP(0) DATAENDS CODESEGMENT ASSUMECS: CODE,DS: DATA START: MOVAX,DATA MOVDS,AX MOVES,AX LEASI,A LEABX,C MOVCX,15 CLD CMPAB: LODSB;从数组A中取出一个数 LEADI,B PUSHCX MOVCX,20 REPNZSCASB;与数组B中的元素比较 JNZLOP;数据不同,比较下一个数 MOV[BX],AL;数据相同,则保存在数组C中 INCBX LOP: POPCX LOOPCMPAB EXIT: MOVAX,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微机 原理 习题