微机软件实验习题与答案完整版.docx
《微机软件实验习题与答案完整版.docx》由会员分享,可在线阅读,更多相关《微机软件实验习题与答案完整版.docx(34页珍藏版)》请在冰豆网上搜索。
![微机软件实验习题与答案完整版.docx](https://file1.bdocx.com/fileroot1/2023-1/5/21e3c501-3e99-4ff7-9daf-8b550f451c38/21e3c501-3e99-4ff7-9daf-8b550f451c381.gif)
微机软件实验习题与答案完整版
微机原理软件实验
实验1两个多位十进制数相加的实验
实验内容:
将两个多位十进制数相加,要求加数和被加数均以ASCII码形式各自顺序存放以DATA1和DATA必首的5个内存单元中(低位在前),结果送回DATA攸t。
完整代码如下:
DATASSEGMENT
;此处输入数据段代码
STRING1DB'inputthefirstnumber:
','$'
STRING2DB13,10,nputthesecondnumber:
','$'
STRING3DB13,10theoutputis:
','$'
DATA1DB6DUP(00H),'$'
DATA2DB6DUP(00H)'$'
DATASENDS
STACKSSEGMENT
;此处输入堆栈段代码
STACKSENDS
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
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
PLUSE:
;相加;SUBDATA1[SI],30H
;SUBDATA2[SI],30H
;这里不能使用这两条指令,因为如果DATA1[5]=00H,00H-30H需要借位相减,使
CF=1
MOVAL,DATA1[SI]
ADCAL,DATA2[SI]
AAA;加法调整指令,可使两个ASCIB直接相加
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
0.
gDCsOasr*『4Zpuipe^A.WDUWkFfsk*
InpittSefirstiiiiiih^r:
lZ34/inputLht?
少忒烦idimmberthf?
nutputis'IWIKA
ririsss"的^cytocontinue
实验2两个数相乘的实验(无符号数相乘)
实验内容:
实现十进制数的乘法。
要求被乘数和乘数均以ASCII码形式各自顺
序存放在内存中,乘积在屏幕上显示出来。
完整代码如下:
DATASSEGMENT
;此处输入数据段代码
STRING1DB'theoutputis:
','$'
DATA1DB31H,32H,33H
DATA2DB35H,36H
DATASENDS
;此处输入堆栈段代码
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
J
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
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,10inputthesecondstring:
','$
PRINT3DB'match','$'
PRINT4DB'nomatch','$'
PRINT5DB13,10output:
','$'
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
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
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
运行结果:
UQS-^dx0.J4,,Cpj4peedeye岫;"r^ureekipCJrPregifJmEWTLM^
inputtlicFirststring"asdf/inputthesecondstring:
asdfzoutput:
FKltch
Prt欢diiykfcfytu
圈UOiBoK0./4Cpu部wdt3000cyclesFram^skp0,PragrauncDWltMP
inputthefipststririg^asdf/
input七hesecondstrin(|f:
asdfaz
output;iMiftMtch
Pres4iarykeytouonliitie
实验4从键盘输入数据并显示的实验
实验内容:
将键盘输入的2位十六进制数转换为等值的二进制数,并在屏幕上
显示。
歹0如:
键入f2,则显示11110010.完整代码如下:
DATASSEGMENT
;此处输入数据段代码
STRING1DB'pleaseinputastring:
','$'
STRING2DB13,10theoutputis:
','$'
STRING3DB13,10,nputerror',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;把ASCI码转化成十进制数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;把ASCI码转化成十进制数BCD码
ADDBL,AL
LEADX,STRING2;打印字符申STRING2
MOVAH,09
INT21H
MOVCX,9
CLC滞空标志位
SHOW:
;显示BL中的二进制数
DECCX
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
JBEL1;若AL每,转L1
SUBAL,07H;若输入的数为A~F,或者a~f,则减乙A接在39H后面,
A~F=3AH~3FH,a~仁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内,则重新输入)
DOJjuokCpuspeed300CcyH”frameskipDrProgram;DWTLMfl
jjiik[JLi1血strdiig;至lii|juterrur
pleaseInputastrlnq:
ds
inputerror
pleaseinputastrinqi3p
inputerror
pleaseinputostring;INtheoutputJR:
Il11«rtf)
Pi'emranykeytucuntiume
实验内容:
先在屏幕上显示“inputstring,”,输入字符申;再显示“result='
如为0~9的数字,则计数器加1,如为非数字,则直接显示,但不计数。
完整
代码如下:
DATASSEGMENT
;此处输入数据段代码
STRING1DB'inputstring:
','$'
STRING2DB13,10result=','$'
STRING3DB13,10zifu:
','$'
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
INT21H
MOVDL,CL
ADDDL,30H
MOVAH,02
INT21H
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
输出结果为:
(这里非数字字符输出顺序与输入顺序相反)
DO&Bn0.74rQ]u3000Frametbp0rProgramsDW1K1'1
inpitstrimg:
asdlnZ3k4j^lz
HituLijklidxfl
jrmi11-5
dniykrijtoconihmer
实验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
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,1SI左移一位,乘以2
ADDBX,SI;两个相加,即乘以10
ADDBX,AX;BX加上新输入的数字
JMPSHURU
GENGGAI:
MOVAH,2BH;设置日期
INT21H
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
否则可能计算
输出结果为:
(设置2008年12月3日,注意如果要设置好系统,机的日期改变不了)
圈DDSBox3.74,Cpu申5000Firdrrf£扫0.PrL^gramcDWTFMP
ih^tisthedaiteCim/dirt^yyB?
:
lZ/GB/i9(J0H
Press两叫keytocantinue^
实验7将小写字母转换为大写字母的实验
实验内容:
接收键入字符(以Ctrl-c为结束),将小写字母变为大写字母,并
在屏幕上显示。
完整代码如下:
DATASSEGMENT
;此处输入数据段代码
STRING1DB13,10pleaseinputastring:
','$'
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
LEASI,DATA
L1:
MOVDL,[SI]
CMPDL,00H
JEENDING
MOVAH,02
INT21H
INCSI
JMPL1
ENDING:
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
运行结果为:
(如果输入的不在a~f中,则重新输入)
DOSBcx0-^4,Cpusprees:
100GuyHf.Fraincskip0,Progr占E:
DV/ltMP
uLeaseinputastring^
J|LtiixeiripitflKir0mg:
Fpledx已inputa零trMiqxdf切pleaseinputastrhig:
Isbgls^dfsaisq*theoirtputstrin(fis'LSHSLSJ3DF5ASG
PressanykeytoccmtLnue_
实验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