《计算机硬件技术基础》实验答案程序.docx
《《计算机硬件技术基础》实验答案程序.docx》由会员分享,可在线阅读,更多相关《《计算机硬件技术基础》实验答案程序.docx(51页珍藏版)》请在冰豆网上搜索。
《计算机硬件技术基础》实验答案程序
实验一:
简单程序设计实验
(1)编写一个32位无符号数除法的程序,要求将存放在NUM1中的32位无符号数与存放
在NUM2中的16位无符号数相除,结果存放在NUM3和NUM4中。
程序流程图略。
参考源程序:
DATASEGMENT
NUM1DD2A8B7654H
NUM2DW5ABCH
NUM3DW?
NUM4DW?
DATAENDS
CODESEGMENT
ASSUMEDS:
DATA,CS:
CODE
START:
MOVAX,DATA;数据段寄存器初始化
MOVDS,AX
MOVAX,WORDPTRNUM1
MOVDX,WORDPTRNUM1+2
DIVNUM2
MOVNUM3,AX
MOVNUM4,DX
MOVAH,4CH;正常返回DOS系统
INT21H
CODEENDS
ENDSTART
(2)编写一个拆字程序。
要求将存放在ARY单元的2位十六进制数X1X2拆为X1和X2两
部分,并以0X1和0X2的形式分别存入ARY+1和ARY+2单元中。
程序流程图略。
参考源程序:
DATASEGMENT
ARYDB2AH,?
?
DATAENDS
CODESEGMENT
ASSUMEDS:
DATA,CS:
CODE
START:
MOVAX,DATA
MOVDS,AX
MOVSI,OFFSETARY;取ARY的偏移地址
MOVAL,[SI];取16进制数至AL
第1页共31页
MOVBL,AL
ANDAL,0F0H
;取16进制数的高四位,即
X1
SHRAL,4
MOV[SI+1],AL
;存0X1
MOVAL,BL
ANDAL,0FH
;取16进制数的低四位,即
X2
MOV[SI+2],AL
;存0X2
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
第2页共31页
实验二:
分支程序设计实验
(1)编写一个字符比较程序,比较
3个无符号字节数A,B,C的大小,并根据比较结果
对变量K赋值:
如果3个数不相等,则
K=0;
如果3个数中有两个相等,则
K=1;
如果3个数都相等,则
K=2。
程序流程图略。
参考源程序:
DATA
SEGMENT
;定义待比较数A、B、C,比较结果K
ADB20H
BDB20H
CDB20H
KDB?
DATA
ENDS
CODE
SEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVAL,A
CMPAL,B
;对A、B进行比较,不相等则转到COMP2
JNECOMP2
;相等则比较A、C
CMPAL,C
JNEK1
;A、C不相等则K=1
JMPK2
;A、C相等则K=2
COMP2:
MOVBL,B
CMPBL,C
JEK1
;对B、C进行比较,相等则
K=1
CMPAL,C
JEK1
;对A、C进行比较,相等则
K=1
K0:
MOVK,0
JMPEXIT
K1:
MOVK,1
JMPEXIT
K2:
MOVK,2
EXIT:
MOVAH,4CH
第3页共31页
INT21H
CODEENDS
ENDSTART
(2)编写一个能实现下列表达式的程序:
?
A+BA≤B
N=?
设A,B,C为小于128的正整数。
?
A-B+CA>B
程序流程图略。
参考源程序:
DATASEGMENT
ADB22H;定义A、B、C、N
BDB10H
CDB01H
NDB?
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVAL,A
CMPAL,B
JGCALCUL;A小于或等于B则N=A+B
ADDAL,B
JMPEXIT
CALCUL:
SUBAL,B
ADCAL,C
EXIT:
MOVN,AL
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
第4页共31页
实验三循环程序设计实验
(1)将字符串STRN(以“$”结尾)中的每一个字符均加上偶校验位,并统计有多少个字符因含有奇数个“1而”加上了校验位。
统计结果存于N单元中。
程序流程图略。
参考源程序:
DATASEGMENT
STRNDB'What$';任意定义一个字串,以“$”结尾
COUNTEQU$-STRN
NDB?
BUFDBCOUNTDUP(?
)
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVAX,DATA
MOVES,AX
LEASI,STRN
LEADI,BUF
MOVCX,COUNT
MOVAL,0
LP1:
MOVBL,[SI];逐个取字符进行判断
ANDBL,BL;自己和自己做与运算
JPNEXT
;根据PF标志位的变化进行跳转
INCAL
ORBL,80H
NEXT:
MOV[DI],BL
INCSI
INCDI
LOOPLP1
MOVN,AL
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
(2)在FIRST开始的一片连续的数据区中存放着100个数据,编写一个程序,统计第1
第5页共31页
个数据,0?
之前的数据个数。
程序流程图略。
参考源程
序:
DATASEGMENT
FIRSTDB10H,24H,34H,73H,20H,44H,03H,36H,41H;任取9个数做演示
COUNTEQU$-FIRST
NUMDB?
DATAENDS
CODE
SEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVDL,0
;计数值初始为0
MOVCX,COUNT
MOVBX,OFFSETFIRST
LP1:
MOVAL,[BX]
;每次取一个数,与
0比较
CMPAL,00H
JNENEXT
JMPEXIT
;找到0则退出
NEXT:
INCDL
;没找到0则计数值加1
INCBX
LOOPLP1
EXIT:
MOVNUM,DL
MOVAH,4CH
INT21H
CODE
ENDS
ENDSTART
第6页共31页
实验四:
子程序设计实验
将BUF开始的10个单元中两位十六进制数转换成ASCII码,并在屏幕上显示出来。
要求码型
转换通过子程序HEXASC实现,参数传送采用寄存器传送方式。
程序流程图略。
参考源程序:
(1)实现方法一:
远过程调用
DATASEGMENT
BUFDB10H,2FH,0D0H,0FEH,33H,0F0H,20H,10H,3DH,0A2H
COUNTEQU$-BUF;定义任意长度的一段BUFDATAENDS
STACK1SEGMENTSTACK
DB100DUP(?
);设置足够深度的栈区
STACK1ENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK1
START:
MOVAX,DATA
MOVDS,AX
MOVSI,OFFSETBUF
MOVCX,COUNT
AGAIN:
MOVAL,[SI]
;逐个取数
MOVBL,AL
SHRAL,4
ANDAL,0FH
;先对高字节部分转换(寄存器
AL传参)
CALLFARPTRHEXASC
;调用子程序
MOVDL,AL
MOVAH,02H
;显示高字节部分对应的字符
INT21H
MOVAL,BL
ANDAL,0FH
;再对低字节部分转换(寄存器
AL传参)
CALLFARPTRHEXASC
;调用子程序
MOVDL,AL
MOVAH,02H
;显示低字节部分对应的字符
INT21H
MOVDL,20H
MOVAH,02H
;显示空格
INT21H
第7页共31页
INCSI
LOOPAGAIN
MOVAH,4CH
INT21H
CODEENDS
CODEBSEGMENT
ASSUMECS:
CODEB
HEXASCPROCFAR
CMPAL,09H;判断是不是数字
JAHEXATOF;是字母则转到HEXATOF
ADDAL,30H;是数字则对应到数字的ASCII码
JMPENDHEX
HEXATOF:
ADDAL,37H;是字母则对应到字母的ASCII码
ENDHEX:
RET
HEXASCENDP
CODEBENDS
ENDSTART
(2)实现方法二:
近过程调用
DATASEGMENT
BUFDB10H,2FH,0D0H,0FEH,33H,0F0H,20H,10H,3DH,0A2H
COUNTEQU$-BUF;定义任意长度的一段BUFDATAENDS
STACK1SEGMENTSTACK
DB100DUP(?
);设置足够深度的栈区
STACK1ENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK1
START:
MOVAX,DATA
MOVDS,AX
MOVSI,OFFSETBUF
MOVCX,COUNT
AGAIN:
MOVAL,[SI];逐个取数
MOVBL,AL
SHRAL,4
ANDAL,0FH;先对高字节部分做转换
CALLHEXASC
第8页共31页
MOVDL,AL;显示高字节部分对应的字符
MOVAH,02H
INT21H
MOVAL,BL
ANDAL,0FH;再对低字节部分做转换
CALLHEXASC
MOVDL,AL;显示低字节部分对应的字符
MOVAH,02H
INT21H
MOVDL,20H;显示空格
MOVAH,02H
INT21H
INCSI;继续循环或退出
LOOPAGAIN
MOVAH,4CH
INT21H
HEXASCPROCNEAR
CMPAL,09H
JAHEXATOF
ADDAL,30H
JMPENDHEX
HEXATOF:
ADDAL,37H
ENDHEX:
RET
HEXASCENDP
CODEENDS
ENDSTART
第9页共31页
实验五:
DOS中断调用实验
(1)如果从键盘上依次输入的是一个数字和一个字母,则输出
“RIGHT”标记后结束程序,
否则输出标记“ERROR”后转向原出错处重做。
试编程实现该功能。
程序流程图略。
参考源程序:
DATA
SEGMENT
MSGDB0AH,0DH,'RIGHT',0AH,0DH,'$'
WRNDB0AH,0DH,'ERROR',0AH,0DH,'$'
DATA
ENDS
CODE
SEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
AGAIN:
MOVAH,01H
;等待用户输入1个字符并显示
INT21H
CMPAL,39H
JAEMSG
CMPAL,30H
JBEMSG
;判断输入是否是数字,不是则报错
MOVAH,01H
;等待用户输入1个字符并显示
INT21H
CMPAL,'A'
JBEMSG
CMPAL,'Z'
;判断输入是否是大写字母,不是则继续
JBEXIT
;判断是不是小写字母
CMPAL,'a'
JBEMSG
CMPAL,'z'
JBEXIT
;不是字母则报错,是字母则转到EXIT
EMSG:
LEADX,WRN
MOVAH,09H
INT21H
JMPAGAIN
EXIT:
MOVDX,OFFSETMSG
MOVAH,09H
;显示“RIGHT”并退出
INT21H
MOVAH,4CH
第10页共31页
INT21H
CODE
ENDS
ENDSTART
(2)编写一程序分类统计字符个数:
即接收键入的一串字符(字符个数不超过
50个,该字
符串用回车作为结束),并按数字、字母和其它字符分类计数,然后将结果存入
digit、letter
和other3个存储单元中,并显示结果。
程序流程图略。
参考源程序:
DATA
SEGMENT
MSG1DB0AH,0DH,'Numberofdigit:
',20H,'$'
MSG2DB0AH,0DH,'Numberofletters:
',20H,'$'
MSG3DB0AH,0DH,'Numberofothercharacters:
',20H,'$'
BUFDB50
DB0
DB50DUP(?
)
;设置足够深的栈区
DIGITDB?
LETTERDB?
OTHERDB?
DATA
ENDS
STACK1
SEGMENTSTACK
DB100DUP(?
)
STACK1
ENDS
CODE
SEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK1
START:
MOVAX,DATA
MOVDS,AX
MOVAH,0AH
;等待用户输入字符串并显示
MOVDX,OFFSETBUF
INT21H
MOVSI,OFFSETBUF
MOVCL,[SI+1]
MOV
CH,00H
MOV
AL,00H
MOV
AH,00H
MOVBH,00H
AGAIN:
MOVBL,[SI+2]
CMPBL,30H
JBOTH
;ASCII码小于30H则归类为“其它”
CMPBL,3AH
第11页共31页
JBDIG
;ASCII码大于等于
30H小于3AH则归类为“数字”
CMPBL,41H
JBOTH
;ASCII码大于等于
3AH小于41H则归类为“其它”
CMPBL,5BH
JBLET
;ASCII码大于等于
41H小于5BH则归类为“字母”
CMPBL,61H
JBOTH
;ASCII码大于等于
5BH小于61H则归类为“其它”
CMPBL,7BH
JBLET
;ASCII码大于等于61H小于7BH则归类为“字母”
OTH:
INCAL
;“其它”计数器加1
JMPENDLP
DIG:
INCAH
;“数字”计数器加1
JMPENDLP
LET:
INCBH
;“字母”计数器加1
ENDLP:
INCSI
LOOPAGAIN
;继续循环
MOVDIGIT,AH
;统计各类个数
MOVLETTER,BH
MOVOTHER,AL
MOVDX,OFFSETMSG1
;显示“数字”有多少个
MOVAH,09H
INT21H
MOVAL,DIGIT
CALLDISP
MOVDX,OFFSETMSG2
;显示“字母”有多少个
MOVAH,09H
INT21H
MOVAL,LETTER
CALLDISP
MOVDX,OFFSETMSG3
;显示“其它”有多少个
MOVAH,09H
INT21H
MOVAL,OTHER
CALLDISP
MOVAH,4CH
INT21H
DISP
PROCNEAR
;显示子程序
第12页共31页
MOVAH,00H
MOVDH,0AH
DIVDH
MOVCH,AH
ADDAL,30H
MOVDL,AL
MOVAH,02H
INT21H
ADDCH,30H
MOVDL,CH
MOVAH,02H
INT21H
RET
DISPENDP
CODEENDS
ENDSTART
第13页共31页
实验六:
扩展定时器/计数器接口实验
(1)计数器0工作于方式3,编写初始化程序,观察其输出OUT0信号的波形。
修改计数初
值,观察OUT0信号的变化情况。
硬件连接方法:
8254计数器0的CLK0端接规则的脉冲输
入(频率自选),OUT0接示波器的正极;示波器负极接地。
程序流程图略。
参考源程序:
DATASEGMENT
DB100DUP(?
)
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVDX,20FH;写入计数器0的控制字
MOVAL,00010110B
OUTDX,AL
MOVDX,20CH;写入计数器0的计数初值
MOVAL,05H
OUTDX,AL
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
(2)将计数器1和计数器0级联起来,二者均工作于方式3,编写初始化程序,观察OUT1
和OUT0信号的波形,说明二者的关系。
修改计数初值,观察OUT0和OUT1输出波形的变
化情况。
硬件连接方法:
8254计数器1的CLK1端接规则的脉冲输入(频率自选),OUT1接
8254计数器0的CLK0,计数器0的输出OUT0接示波器正极;示波器负极接地。
程序流程图略。
参考源程序:
DATASEGMENT
DB100DUP(?
)
DATAENDS
CODESEGMENT
第14页共31页
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVDX,20FH
MOVAL,00010110B
;写入计数器0
的控制字
OUTDX,AL
MOVDX,20CH
;写入计数器0
的计数初值
MOVAL,05H
OUTDX,AL
MOVDX,20FH
MOVAL,01010110B
;写入计数器1
的控制字
OUTDX,AL
MOVDX,20DH
;写入计数器1
的计数初值
MOVAL,02H
OUTDX,AL
MOVAH,4CH
INT21H
CODE
ENDS
ENDSTART
第15页共31页
实验七:
并行输入/输出接口8255A简单编程实验
(1)利用8255A的B口输出控制两组发光二级管
L1,L3,L5,L7和L2,L4,L6,L8
亮灭交替变
化。
分析:
按照题目要求,当
8255A
的B口输出为01010101B(55H)时,发光二极管
L1,L3,L5,L7
会被点亮,当8255A的B口输出为10101010B(0AAH)时,发光