微机软件实验习题与答案完整版.docx
- 文档编号:29834307
- 上传时间:2023-07-27
- 格式:DOCX
- 页数:45
- 大小:345.55KB
微机软件实验习题与答案完整版.docx
《微机软件实验习题与答案完整版.docx》由会员分享,可在线阅读,更多相关《微机软件实验习题与答案完整版.docx(45页珍藏版)》请在冰豆网上搜索。
微机软件实验习题与答案完整版
微机原理软件实验
实验1两个多位十进制数相加的实验
实验内容:
将两个多位十进制数相加,要求加数和被加数均以ASCII码形式各自顺序存放以DATA1和DATA2为首的5个内存单元中(低位在前),结果送回DATA1处。
完整代码如下:
DATASSEGMENT
;此处输入数据段代码
STRING1DB'inputthefirstnumber:
','$'
STRING2DB13,10,'inputthesecondnumber:
','$'
STRING3DB13,10,'theoutputis:
','$'
DATA1DB6DUP(00H),'$'
DATA2DB6DUP(00H),'$'
DATASENDS
STACKSSEGMENT
;此处输入堆栈段代码
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
;此处输入代码段代码
LEASI,DATA1
LEADI,DATA2
L0:
LEADX,STRING1;打印字符串STRING1
MOVAH,09
INT21H
INPUT1:
;输入第一个数
MOVAH,01;输入字符至AL中
INT21H
CMPAL,'/'
JEL1
MOV[SI],AL
INCSI
JMPINPUT1
L1:
LEADX,STRING2;打印字符串STRING2
MOVAH,09
INT21H
INPUT2:
;输入第二个数
MOVAH,01;输入字符至AL
INT21H
CMPAL,'/'
JEL2
MOV[DI],AL
INCDI
JMPINPUT2
L2:
MOVSI,0
CLC;清空进位标志位CF
MOVCX,6
PLUSE:
;相加
;SUBDATA1[SI],30H
;SUBDATA2[SI],30H
;这里不能使用这两条指令,因为如果DATA1[5]=00H,00H-30H需要借位相减,使CF=1
MOVAL,DATA1[SI]
ADCAL,DATA2[SI]
AAA;加法调整指令,可使两个ASCII数直接相加
MOVDATA1[SI],AL;和赋给DATA1[SI]
INCSI
LOOPPLUSE
L3:
LEADX,STRING3;打印字符串STRING3
MOVAH,09
INT21H
MOVCX,6
MOVSI,6
SHOW:
DECSI
CMPDATA1[SI],00H
JESHOW
SHOW2:
MOVDL,DATA1[SI]
ADDDL,30H
MOVAH,02
INT21H
CMPSI,0
JEL4
DECSI
JMPSHOW2
L4:
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
运行结果如下:
输入为低位在前,即输入1234和99999相加实际上是4321和99999相加(即:
4321+99999=104320)
实验2两个数相乘的实验(无符号数相乘)
实验内容:
实现十进制数的乘法。
要求被乘数和乘数均以ASCII码形式各自顺序存放在内存中,乘积在屏幕上显示出来。
完整代码如下:
DATASSEGMENT
;此处输入数据段代码
STRING1DB'theoutputis:
','$'
DATA1DB31H,32H,33H
DATA2DB35H,36H
DATASENDS
STACKSSEGMENT
;此处输入堆栈段代码
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
;此处输入代码段代码
MOVDL,10
MOVAL,DATA1[0];AL=31H
SUBAL,30H;AL=01H
MULDL;乘10;AL=10
ADDAL,DATA1[1];AL=10+32H
SUBAL,30H;AL=10+32H-30H=12
MULDL;AL=120
ADDAL,DATA1[2];AL=120+33H
SUBAL,30H;AL=120+33H-30H=123
MOVBL,AL;BL=AL
;
MOVAL,DATA2[0];AL=35H
SUBAL,30H;AL=5
MULDL;乘10;AL=50
ADDAL,DATA2[1];AL=50+36H
SUBAL,30H;AL=50+36H-30H=56
MULBL;AX=123x56=6888
SUBDX,DX;DX清零
MOVBX,1000
DIVBX;(DX,AX)/1000,商6在AX中,余数888在DX中
PUSHDX
MOVDL,AL
ADDDL,30H
MOVAH,02;打印最高位6
INT21H
POPDX
MOVBL,100
MOVAX,DX;888赋给AX
DIVBL;AX/100,商放在AL中,余数88放在AH中
MOVDL,AL
MOVCL,AH;!
!
!
这里千万不能把AH直接赋给AL,因为经过INT21H指令后AL,AH会改变
ADDDL,30H
MOVAH,02;打印第二位
INT21H
MOVBL,10
MOVAL,CL
SUBAH,AH;清空AH
DIVBL;AX/10,商放在AL中,余数8放在AH中
MOVDL,AL
MOVCL,AH
ADDDL,30H
MOVAH,02;打印第三位
INT21H
MOVDL,CL
ADDDL,30H
MOVAH,02;打印第四位
INT21H
CODESENDS
ENDSTART
运行结果为:
实验3字符串匹配实验
实验内容:
编写程序实现两个字符串比较。
如果相同,则屏幕显示“match”,否则屏幕显示”nomatch”,完整代码如下:
DATASSEGMENT
;此处输入数据段代码
PRINT1DB'inputthefirststring:
','$'
PRINT2DB13,10,'inputthesecondstring:
','$'
PRINT3DB'match','$'
PRINT4DB'nomatch','$'
PRINT5DB13,10,'output:
','$'
STRING1DB30DUP(00H),13,10,'$'
STRING2DB30DUP(00H),13,10,'$'
DATASENDS
STACKSSEGMENT
;此处输入堆栈段代码
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS,ES:
DATAS
START:
MOVAX,DATAS
MOVDS,AX
;此处输入代码段代码
LEADX,PRINT1;打印字符串PRINT1
MOVAH,09
INT21H
LEASI,STRING1;STRING1地址赋给SI
LEADI,STRING2;STRING2地址赋给DI
INPUT1:
MOVAH,01;输入字符至AL
INT21H
CMPAL,'/';输入字符串以‘/’结束,转L0
JEL0
MOV[SI],AL
INCSI
JMPINPUT1
L0:
LEADX,PRINT2;打印字符串PRINT2
MOVAH,09
INT21H
INPUT2:
MOVAH,01;输入字符至AL
INT21H
CMPAL,'/'
JEL1
MOV[DI],AL
INCDI
JMPINPUT2
L1:
MOVCX,30;CX=30代表比较30次
MOVSI,00H
COMPARE:
;字符串一个一个比较
MOVAL,STRING1[SI];取STRING1存储单位中的第SI个字符赋给AL
CMPAL,STRING2[SI];AL与STRING2存储单位中的第SI个字符比较
JNENOMATCH
INCSI
LOOPCOMPARE
JMPMATCH
NOMATCH:
;打印output:
nomatch
LEADX,PRINT5
MOVAH,09
INT21H
LEADX,PRINT4
MOVAH,09
INT21H
JMPL2
MATCH:
;打印output:
match
LEADX,PRINT5
MOVAH,09
INT21H
LEADX,PRINT3
MOVAH,09
INT21H
L2:
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
运行结果:
实验4从键盘输入数据并显示的实验
实验内容:
将键盘输入的2位十六进制数转换为等值的二进制数,并在屏幕上显示。
列如:
键入f2,则显示11110010.完整代码如下:
DATASSEGMENT
;此处输入数据段代码
STRING1DB'pleaseinputastring:
','$'
STRING2DB13,10,'theoutputis:
','$'
STRING3DB13,10,'inputerror',13,10,'$'
DATASENDS
STACKSSEGMENT
;此处输入堆栈段代码
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
;此处输入代码段代码
L0:
LEADX,STRING1;打印字符串STRING1
MOVAH,09
INT21H
MOVAH,01;输入第一个字符至AL中
INT21H
CMPAL,'0'
JBERROR1
CMPAL,'9'
JBEENTER1
CMPAL,'A'
JBERROR1
CMPAL,'F'
JBEENTER1
CMPAL,'a'
JBERROR1
CMPAL,'f'
JBEENTER1
ERROR1:
LEADX,STRING3;打印字符串STRING3
MOVAH,09
INT21H
JMPL0
ENTER1:
CALLASC2BCD;把ASCII码转化成十进制数BCD码
MOVCL,4
ROLAL,CL
MOVBL,AL;把高四位放到BL寄存器中
;输入第二个字符
MOVAH,01;输入第二个字符至AL中
INT21H
CMPAL,'0'
JBERROR1
CMPAL,'9'
JBEENTER2
CMPAL,'A'
JBERROR1
CMPAL,'F'
JBEENTER2
CMPAL,'a'
JBERROR1
CMPAL,'f'
JBEENTER2
ENTER2:
CALLASC2BCD;把ASCII码转化成十进制数BCD码
ADDBL,AL
LEADX,STRING2;打印字符串STRING2
MOVAH,09
INT21H
MOVCX,9
CLC;清空标志位
SHOW:
;显示BL中的二进制数
DECCX
CMPCX,0
JENEXT;输出完八位之后返回DOS
ROLBL,1;循环左移一位,若溢出为1,则CF=1
JCM1
JMPM2
M1:
MOVDL,'1';若CF=1,转至M1打印‘1’
MOVAH,02
INT21H
JMPSHOW
M2:
MOVDL,'0';若CF=0,转至M1打印‘0’
MOVAH,02
INT21H
JMPSHOW
NEXT:
MOVAH,4CH
INT21H
ASC2BCDPROC
CMPAL,'9'
JBEL1;若AL≤9,转L1
SUBAL,07H;若输入的数为A~F,或者a~f,则减7,A接在39H后面,A~F=3AH~3FH,a~f=5AH~5FH
L1:
SUBAL,30H;减30H
ANDAL,0FH;滤除高位,保留低位,因为a~f恰好比A~F大20H,这样a~f就和A~F的数值一样了
RET
ASC2BCDENDP
CODESENDS
ENDSTART
输出结果为:
(若输出不在0~9,A~F,a~f内,则重新输入)
实验5字符和数据计算的实验
实验内容:
先在屏幕上显示“inputstring,”,输入字符串;再显示“result=”。
如为0~9的数字,则计数器加1,如为非数字,则直接显示,但不计数。
完整代码如下:
DATASSEGMENT
;此处输入数据段代码
STRING1DB'inputstring:
','$'
STRING2DB13,10,'result=','$'
STRING3DB13,10,'zifu:
','$'
DATASENDS
STACKSSEGMENT
;此处输入堆栈段代码
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
;此处输入代码段代码
LEADX,STRING1;打印字符串1
MOVAH,09
INT21H
MOVCX,0
MOVBX,0
INPUT:
MOVAH,01;输入字符至AL
INT21H
CMPAL,'/';输入/后转L0
JEL0
CMPAL,'0';下溢出转RUZHAN
JBRUZHAN
CMPAL,'9';上溢出转RUZHAN
JARUZHAN
INCCL;若为数字则计数器+1
JMPINPUT
RUZHAN:
;非数字字符入栈
PUSHAX
ADDBL,1;BL代表入栈的字符个数,方便待会输出
JMPINPUT
L0:
LEADX,STRING3;打印字符串3
MOVAH,09
INT21H
CHUZHAN:
POPAX
MOVDX,AX
MOVAH,02
INT21H
SUBBL,1
CMPBL,0;入了多少个栈,出多少栈
JNECHUZHAN
OUTPUT:
;输出数字的个数
LEADX,STRING2;打印字符串2
MOVAH,09
INT21H
MOVDL,CL
ADDDL,30H
MOVAH,02
INT21H
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
输出结果为:
(这里非数字字符输出顺序与输入顺序相反)
实验6改变年月日的实验
实验内容:
先在屏幕上显示“whatisthedate(mm/dd/yy)?
“从键盘输入的月日年能把计算机的系统日期改为你键入的值。
完整代码如下:
DATASSEGMENT
S1DB0AH,0DH,"whatisthedate(mm/dd/yy)?
:
",'$'
DATASENDS
STACKSSEGMENT
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
MOVDX,OFFSETS1
MOVAH,09H;打印字符串"whatisthedate(mm/dd/yy)?
:
"
INT21H
MOVDX,0H;DX=CH=0
MOVCH,0
;MOVSI,0AH
KAISHI:
MOVCL,0;用来压缩移位
SHURU:
MOVAH,01H;输入字符存入AL中
INT21H
MOVAH,0AH;10赋给AH
CMPAL,0DH;AL=13则结束,设置日期
JEGENGGAI
CMPAL,'/';计算来判断是年,月,日
JEZIZENG
ANDAL,0FH
CMPCH,0;等于0则转月
JEYUE
CMPCH,1;等于1则转日
JERI
CMPCH,2;等于2则转年
JENIAN
ZIZENG:
INCCH
JMPSHURU;无条件转移至SHURU
YUE:
ADDDH,AL
CMPCL,0
JNZKAISHI
INCCL
MOVAL,DH
MULAH
MOVDH,AL
JMPSHURU;无条件转移至SHURU
RI:
ADDDL,AL
CMPCL,0
JNZKAISHI
INCCL
MOVAL,DL
MULAH
MOVDL,AL
JMPSHURU;无条件转移至SHURU
NIAN:
CMPCL,0
JNZXIABU
ADDBL,AL
MOVCL,03H;3赋给CL
JMPSHURU;无条件转移至SHURU
XIABU:
MOVAH,0;清空AH
MOVSI,BX;SI=BX
SHLBX,CL;BX左移三位,乘以8
SHLSI,1;SI左移一位,乘以2
ADDBX,SI;两个相加,即乘以10
ADDBX,AX;BX加上新输入的数字
JMPSHURU
GENGGAI:
MOVCX,BX
MOVAH,2BH;设置日期
INT21H
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
输出结果为:
(设置2008年12月3日,注意如果要设置好系统,否则可能计算机的日期改变不了)
实验7将小写字母转换为大写字母的实验
实验内容:
接收键入字符(以Ctrl-c为结束),将小写字母变为大写字母,并在屏幕上显示。
完整代码如下:
DATASSEGMENT
;此处输入数据段代码
STRING1DB13,10,'pleaseinputastring:
','$'
STRING2DB13,10,'theoutputstringis:
','$'
DATADB100DUP(00H),'$'
DATASENDS
STACKSSEGMENT
;此处输入堆栈段代码
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
;此处输入代码段代码
M:
LEASI,DATA
LEADX,STRING1;打印字符串1
MOVAH,09
INT21H
INPUT:
MOVAH,01;输入字符C
INT21H
CMPAL,03H
JEOUTPUT
CMPAL,'a'
JBM
CMPAL,'z'
JAM
SUBAL,20H;减20H变小写
MOV[SI],AL
INCSI
JMPINPUT
OUTPUT:
LEADX,STRING2;打印字符串2
MOVAH,09
INT21H
LEASI,DATA
L1:
MOVDL,[SI]
CMPDL,00H
JEENDING
MOVAH,02
INT21H
INCSI
JMPL1
ENDING:
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
运行结果为:
(如果输入的不在a~f中,则重新输入)
实验8排序实验(0~9)
实验内容:
从首地址为1000H开始存放10个数,将这些数按降序排列.
完整代码如下:
DATASSEGMENT
;此处输入数据段代码
STRING1DB'pleaseinput10numbers:
','$'
STRING2DB13,10,'thesortednumbersare:
','$'
ORG1000H
DATADB10DUP(00H),'$'
DATASENDS
STACKSSEGMENT
;此处输入堆栈段代码
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
;此处输入代码段代码
LEADX,STRING1;输入提示语'pleseinput10numbers:
'
MOVAH,09
INT21H
MOVCX,10
LEASI,DATA
INPUT:
MOVAH,01;输入字符至AL
INT21H
MOV[SI],AL;把AL赋给偏移地址为SI指向的单元
INCSI
LOOPINPUT
MOVBL,0
L0:
MOVCX,9
LEASI,DATA
L1:
;比较第SI个数和第SI+1个数的大小
MOVAL,[SI]
INCSI
CMPAL,[SI]
JBCHANGE;若小于则转CHANGE
L2:
LOOPL1;小循环(CX自动减1),若CX=0则结束
L3:
INCBL
CMPBL,10
JBL0;若大循环有10次了,则转OUTPUT
JMPOUTPUT
CHANGE:
;交换两个数
XCHGAL,[SI];交换,
MOV[SI-1],AL;赋给SI-1
JMPL2
OUTPUT:
LE
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微机 软件 实验 习题 答案 完整版