微机原理习 题 3.docx
- 文档编号:25854376
- 上传时间:2023-06-16
- 格式:DOCX
- 页数:29
- 大小:22.46KB
微机原理习 题 3.docx
《微机原理习 题 3.docx》由会员分享,可在线阅读,更多相关《微机原理习 题 3.docx(29页珍藏版)》请在冰豆网上搜索。
微机原理习题3
习题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,2
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微机原理习 微机 原理