《计算机硬件技术基础》实验答案程序文档格式.docx
- 文档编号:18105355
- 上传时间:2022-12-13
- 格式:DOCX
- 页数:31
- 大小:37.37KB
《计算机硬件技术基础》实验答案程序文档格式.docx
《《计算机硬件技术基础》实验答案程序文档格式.docx》由会员分享,可在线阅读,更多相关《《计算机硬件技术基础》实验答案程序文档格式.docx(31页珍藏版)》请在冰豆网上搜索。
取16进制数的高四位,即X1
SHRAL,4
MOV[SI+1],AL;
存0X1
MOVAL,BL
ANDAL,0FH;
取16进制数的低四位,即X2
MOV[SI+2],AL;
存0X2
MOVAH,4CHINT21H
CODEENDS
实验二:
分支程序设计实验
(1)编写一个字符比较程序,比较3个无符号字节数A,B,C的大小,并根据比较结果对变量K赋值:
如果3个数不相等,则K=0;
如果3个数中有两个相等,则K=1;
如果3个数都相等,则K=2。
DATASEGMENT;
定义待比较数A、B、C,比较结果K
ADB20HBDB20HCDB20HKDB?
ASSUMECS:
CODE,DS:
DATASTART:
MOVDS,AXMOVAL,A
CMPAL,B;
对A、B进行比较,不相等则转到COMP2
JNECOMP2;
相等则比较A、C
CMPAL,C
JNEK1;
A、C不相等则K=1
JMPK2;
A、C相等则K=2
COMP2:
MOVBL,BCMPBL,C
JEK1;
对B、C进行比较,相等则K=1
对A、C进行比较,相等则K=1
K0:
MOVK,0
JMPEXITK1:
MOVK,1
JMPEXITK2:
MOVK,2
EXIT:
MOVAH,4CH
INT21H
(2)编写一个能实现下列表达式的程序:
⎧
N=⎨
A+B
A≤B
设A,B,C为小于128的正整数。
⎩A−B+C
A>
B
ADB22H;
定义A、B、C、NBDB10H
CDB01HNDB?
CODE,DS:
MOVAL,ACMPAL,B
JGCALCUL;
A小于或等于B则N=A+B
ADDAL,BJMPEXIT
CALCUL:
SUBAL,BADCAL,C
MOVN,ALMOVAH,4CHINT21H
实验三循环程序设计实验
(1)将字符串STRN(以“$”结尾)中的每一个字符均加上偶校验位,并统计有多少个字符因含有奇数个“1”而加上了校验位。
统计结果存于N单元中。
STRNDB'
What$'
;
任意定义一个字串,以“$”结尾
COUNTEQU$-STRNNDB?
BUFDBCOUNTDUP(?
)DATAENDS
MOVAX,DATA
MOVDS,AXMOVAX,DATAMOVES,AX
LEASI,STRNLEADI,BUF
MOVCX,COUNTMOVAL,0
LP1:
MOVBL,[SI];
逐个取字符进行判断
ANDBL,BL;
自己和自己做与运算
JPNEXT
根据PF标志位的变化进行跳转
INCAL
ORBL,80HNEXT:
MOV[DI],BL
INCSIINCDILOOPLP1
MOVN,ALMOVAH,4CH
(2)在FIRST开始的一片连续的数据区中存放着100个数据,编写一个程序,统计第1
个数据‘0’之前的数据个数。
程序流程图略。
FIRSTDB10H,24H,34H,73H,20H,44H,03H,36H,41H;
任取9个数做演示
COUNTEQU$-FIRSTNUMDB?
MOVDL,0;
计数值初始为0
MOVCX,COUNT
MOVBX,OFFSETFIRST
MOVAL,[BX];
每次取一个数,与0比较
CMPAL,00HJNENEXT
JMPEXIT;
找到0则退出
NEXT:
INCDL;
没找到0则计数值加1
INCBXLOOPLP1
MOVNUM,DLMOVAH,4CHINT21H
实验四:
子程序设计实验
将BUF开始的10个单元中两位十六进制数转换成ASCII码,并在屏幕上显示出来。
要求码型转换通过子程序HEXASC实现,参数传送采用寄存器传送方式。
参考源程序:
(1)实现方法一:
远过程调用DATASEGMENT
BUFDB10H,2FH,0D0H,0FEH,33H,0F0H,20H,10H,3DH,0A2H
COUNTEQU$-BUF;
定义任意长度的一段BUFDATAENDS
STACK1SEGMENTSTACK
DB100DUP(?
);
设置足够深度的栈区
STACK1ENDS
DATA,SS:
STACK1
MOVAX,DATAMOVDS,AX
MOVSI,OFFSETBUFMOVCX,COUNT
AGAIN:
MOVAL,[SI];
逐个取数
ANDAL,0FH;
先对高字节部分转换(寄存器AL传参)
CALLFARPTRHEXASC;
调用子程序
MOVDL,AL
MOVAH,02H;
显示高字节部分对应的字符
再对低字节部分转换(寄存器AL传参)
显示低字节部分对应的字符
MOVDL,20H
显示空格
INCSI
LOOPAGAIN
CODEBSEGMENTASSUMECS:
CODEB
HEXASCPROCFAR
CMPAL,09H;
判断是不是数字
JAHEXATOF;
是字母则转到HEXATOF
ADDAL,30H;
是数字则对应到数字的ASCII码
JMPENDHEX
HEXATOF:
ADDAL,37H;
是字母则对应到字母的ASCII码
ENDHEX:
RETHEXASCENDPCODEBENDS
(2)实现方法二:
近过程调用
先对高字节部分做转换
CALLHEXASC
MOVDL,AL;
MOVAH,02HINT21H
再对低字节部分做转换
MOVDL,20H;
INCSI;
继续循环或退出
HEXASCPROCNEARCMPAL,09H
JAHEXATOFADDAL,30HJMPENDHEX
ADDAL,37HENDHEX:
RET
HEXASCENDP
实验五:
DOS中断调用实验
(1)如果从键盘上依次输入的是一个数字和一个字母,则输出“RIGHT”标记后结束程序,否则输出标记“ERROR”后转向原出错处重做。
试编程实现该功能。
MSGDB0AH,0DH,'
RIGHT'
0AH,0DH,'
$'
WRNDB0AH,0DH,'
ERROR'
MOVAH,01H;
等待用户输入1个字符并显示
CMPAL,39HJAEMSGCMPAL,30H
JBEMSG;
判断输入是否是数字,不是则报错
MOVAH,01H;
INT21HCMPAL,'
A'
JBEMSG
CMPAL,'
Z'
判断输入是否是大写字母,不是则继续
JBEXIT;
判断是不是小写字母
a'
JBEMSGCMPAL,'
z'
不是字母则报错,是字母则转到EXIT
EMSG:
LEADX,WRNMOVAH,09HINT21H
JMPAGAIN
MOVDX,OFFSETMSG
MOVAH,09H;
显示“RIGHT”并退出
MOVAH,4CH
(2)编写一程序分类统计字符个数:
即接收键入的一串字符(字符个数不超过50个,该字符串用回车作为结束),并按数字、字母和其它字符分类计数,然后将结果存入digit、letter和other3个存储单元中,并显示结果。
MSG1DB0AH,0DH,'
Numberofdigit:
'
20H,'
MSG2DB0AH,0DH,'
Numberofletters:
20H,'
MSG3DB0AH,0DH,'
Numberofothercharacters:
20H,'
BUFDB50
DB0
DB50DUP(?
设置足够深的栈区
DIGITDB?
LETTERDB?
OTHERDB?
STACK1SEGMENTSTACKDB100DUP(?
)
MOVAH,0AH;
等待用户输入字符串并显示
MOVDX,OFFSETBUFINT21H
MOVSI,OFFSETBUFMOVCL,[SI+1]
MOVCH,00HMOVAL,00HMOVAH,00HMOVBH,00H
MOVBL,[SI+2]CMPBL,30H
JBOTH;
ASCII码小于30H则归类为“其它”
CMPBL,3AH
JBDIG;
ASCII码大于等于30H小于3AH则归类为“数字”CMPBL,41H
ASCII码大于等于3AH小于41H则归类为“其它”CMPBL,5BH
JBLET;
ASCII码大于等于41H小于5BH则归类为“字母”CMPBL,61H
ASCII码大于等于5BH小于61H则归类为“其它”CMPBL,7BH
ASCII码大于等于61H小于7BH则归类为“字母”
OTH:
;
“其它”计数器加1
DIG:
JMPENDLPINCAH
“数字”计数器加1
LET:
JMPENDLPINCBH
“字母”计数器加1
ENDLP:
INCSI
LOOPAGAIN;
继续循环
MOVLETTER,BHMOVOTHER,AL
MOVDX,OFFSETMSG1
MOVAH,09HINT21H
MOVAL,DIGITCALLDISP
显示“数字”有多少个
MOVDX,OFFSETMSG2
MOVAL,LETTERCALLDISP
显示“字母”有多少个
MOVDX,OFFSETMSG3
MOVAL,OTHERCALLDISP
显示“其它”有多少个
DISP
PROCNEAR
显示子程序
MOVDIGIT,AH;
统计各类个数
MOVAH,00HMOVDH,0AHDIVDH
MOVCH,AHADDAL,30HMOVDL,ALMOVAH,02HINT21H
ADDCH,30HMOVDL,CHMOVAH,02HINT21H
RETDISPENDP
实验六:
扩展定时器/计数器接口实验
(1)计数器0工作于方式3,编写初始化程序,观察其输出OUT0信号的波形。
修改计数初值,观察OUT0信号的变化情况。
硬件连接方法:
8254计数器0的CLK0端接规则的脉冲输入(频率自选),OUT0接示波器的正极;
示波器负极接地。
MOVDX,20FH;
写入计数器0的控制字
MOVAL,00010110BOUTDX,AL
MOVDX,20CH;
写入计数器0的计数初值
MOVAL,05HOUTDX,AL
(2)将计数器1和计数器0级联起来,二者均工作于方式3,编写初始化程序,观察OUT1和OUT0信号的波形,说明二者的关系。
修改计数初值,观察OUT0和OUT1输出波形的变化情况。
8254计数器1的CLK1端接规则的脉冲输入(频率自选),OUT1接8254计数器0的CLK0,计数器0的输出OUT0接示波器正极;
DATASEGMENTDB100DUP(?
DATAENDSCODESEGMENT
MOVDX,20FH
MOVAL,00010110B;
OUTDX,AL
MOVAL,01010110B;
写入计数器1的控制字
MOVDX,20DH;
写入计数器1的计数初值
MOVAL,02HOUTDX,AL
实验七:
并行输入/输出接口8255A简单编程实验
(1)利用8255A的B口输出控制两组发光二级管L1,L3,L5,L7和L2,L4,L6,L8亮灭交替变化。
分析:
按照题目要求,当8255A的B口输出为01010101B(55H)时,发光二极管L1,L3,L5,L7会被点亮,当8255A的B口输出为10101010B(0AAH)时,发光二极管L2,L4,L6,L8会被点亮。
因此,通过延时改变8255A的B口输出,即可实现两组发光二极管的亮灭交替变化。
由于LED随时出于准备好的状态,因此8255A的B口可工作于方式0输出,其它端口未使用,无需考虑。
因此,8255A的方式控制字为:
10000000B(80H)。
硬件连接方法:
8255A的B口PB0~PB7分别连接L1~L8。
参考源程序:
.486
PORTADW208H;
8255A端口A地址PORTBDW209H;
8255A端口B地址PORTCDW20AH;
8255A端口C地址PORT_CTRDW20BH;
8255A控制端口地址
STACK1SEGMENTSTACKDB100DUP(?
DATA,SS:
MOVAX,DATAMOVDS,AX
MOVDX,PORT_CTRMOVAL,10000000B
;
8255A初始化
控制字
OUTDX,AL
MOVDX,PORTBMOVAL,00HOUTDX,AL
8255A端口B清零,LED初始化(全灭)
LP0:
MOVBL,01010101BMOVAL,BL
OUTDX,ALCALLDELAY
NOTAL
MOVBL,AL
MOVAH,01H;
调用BIOS的16H功能判断键盘是否有输入
INT16HJNZEXITJMPLP0
MOVAH,4CHINT21H
DELAYPROCNEAR;
延时子程序(可通过修改NOP指令数量改变延时时间)MOVECX,0FFFFFFFH
LP2:
NOP
LOOPDLP2
RETDELAYENDP
(2)利用8255A的A口读入8个开关K1~K8的状态,当只有K1合上时,L1~L8显示
00000001B;
当只有K1和K2合上时,L1~L8显示00000010B;
当只有K1,K2和K3合上时,L1~L8显示00000011B;
当只有K1,K2,K3和K4合上时,L1~L8显示00000100B;
…直到所有开关合上时,L1~L8显示00001000B,并结束程序的运行。
发光二极管的状态通过8255A的B口进行控制。
按照题目要求,可以通过查询的方式读取8255A的B口状态,并根据查询的结果给A口送出相应数据,A口工作在方式0的输入状态,B口工作在方式0输出状态,C口不需要考虑,所以8255A的方式控制字为:
10010000B)
(1)8255A的A口PA0~PA7对应连接K1~K8;
(2)8255A的B口PB0~PB7对应连接L1~L8;
源代码:
LISTDB01H,03H,07H,0FH,1FH,3FH,7FH,0FFHDATAENDS
MOVDS,AX
MOVDX,20BH;
MOVAL,10010000BOUTDX,AL
MOVDX,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机硬件技术基础 计算机硬件 技术 基础 实验 答案 程序