《计算机硬件技术基础》实验程序.docx
《《计算机硬件技术基础》实验程序.docx》由会员分享,可在线阅读,更多相关《《计算机硬件技术基础》实验程序.docx(31页珍藏版)》请在冰豆网上搜索。
《计算机硬件技术基础》实验程序
实验一:
简单程序设计实验
(1)编写一个32位无符号数除法的程序,要求将存放在NUM1中的32位无符号数与存放在NUM2中的16位无符号数相除,结果存放在NUM3和NUM4中。
程序流程图略。
参考源程序:
DATASEGMENT
NUM1DD2A8B7654HNUM2DW5ABCHNUM3DW?
NUM4DW?
DATAENDS
CODESEGMENT
ASSUMEDS:
DATA,CS:
CODE
START:
MOVAX,DATA;数据段寄存器初始化
MOVDS,AX
MOVAX,WORDPTRNUM1
MOVDX,WORDPTRNUM1+2
DIVNUM2
MOVNUM3,AXMOVNUM4,DX
MOVAH,4CH;正常返回DOS系统
INT21HCODEENDS
ENDSTART
(2)编写一个拆字程序。
要求将存放在ARY单元的2位十六进制数X1X2拆为X1和X2两部分,并以0X1和0X2的形式分别存入ARY+1和ARY+2单元中。
程序流程图略。
参考源程序:
DATASEGMENTARYDB2AH,?
?
DATAENDS
CODESEGMENT
ASSUMEDS:
DATA,CS:
CODESTART:
MOVAX,DATA
MOVDS,AX
MOVSI,OFFSETARY;取ARY的偏移地址
MOVAL,[SI];取16进制数至AL
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,4CHINT21H
CODEENDS
ENDSTART
实验二:
分支程序设计实验
(1)编写一个字符比较程序,比较3个无符号字节数A,B,C的大小,并根据比较结果对变量K赋值:
如果3个数不相等,则K=0;
如果3个数中有两个相等,则K=1;如果3个数都相等,则K=2。
程序流程图略。
参考源程序:
DATASEGMENT;定义待比较数A、B、C,比较结果K
ADB20HBDB20HCDB20HKDB?
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATASTART:
MOVAX,DATA
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
CMPAL,C
JEK1;对A、C进行比较,相等则K=1
K0:
MOVK,0
JMPEXITK1:
MOVK,1
JMPEXITK2:
MOVK,2
EXIT:
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
(2)编写一个能实现下列表达式的程序:
⎧
N=⎨
A+B
A≤B
设A,B,C为小于128的正整数。
⎩A−B+C
程序流程图略。
参考源程序:
DATASEGMENT
A>B
ADB22H;定义A、B、C、NBDB10H
CDB01HNDB?
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATASTART:
MOVAX,DATA
MOVDS,AX
MOVAL,ACMPAL,B
JGCALCUL;A小于或等于B则N=A+B
ADDAL,BJMPEXIT
CALCUL:
SUBAL,BADCAL,C
EXIT:
MOVN,ALMOVAH,4CHINT21H
CODEENDS
ENDSTART
实验三循环程序设计实验
(1)将字符串STRN(以“$”结尾)中的每一个字符均加上偶校验位,并统计有多少个字符因含有奇数个“1”而加上了校验位。
统计结果存于N单元中。
程序流程图略。
参考源程序:
DATASEGMENT
STRNDB'What$';任意定义一个字串,以“$”结尾
COUNTEQU$-STRNNDB?
BUFDBCOUNTDUP(?
)DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATASTART:
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
INT21H
CODEENDS
ENDSTART
(2)在FIRST开始的一片连续的数据区中存放着100个数据,编写一个程序,统计第1
个数据‘0’之前的数据个数。
程序流程图略。
参考源程序:
DATASEGMENT
FIRSTDB10H,24H,34H,73H,20H,44H,03H,36H,41H;任取9个数做演示
COUNTEQU$-FIRSTNUMDB?
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATASTART:
MOVAX,DATA
MOVDS,AX
MOVDL,0;计数值初始为0
MOVCX,COUNT
MOVBX,OFFSETFIRST
LP1:
MOVAL,[BX];每次取一个数,与0比较
CMPAL,00HJNENEXT
JMPEXIT;找到0则退出
NEXT:
INCDL;没找到0则计数值加1
INCBXLOOPLP1
EXIT:
MOVNUM,DLMOVAH,4CHINT21H
CODEENDS
ENDSTART
实验四:
子程序设计实验
将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,DATAMOVDS,AX
MOVSI,OFFSETBUFMOVCX,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
INCSI
LOOPAGAIN
MOVAH,4CHINT21H
CODEENDS
CODEBSEGMENTASSUMECS:
CODEB
HEXASCPROCFAR
CMPAL,09H;判断是不是数字
JAHEXATOF;是字母则转到HEXATOF
ADDAL,30H;是数字则对应到数字的ASCII码
JMPENDHEX
HEXATOF:
ADDAL,37H;是字母则对应到字母的ASCII码
ENDHEX:
RETHEXASCENDPCODEBENDS
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,DATAMOVDS,AX
MOVSI,OFFSETBUFMOVCX,COUNT
AGAIN:
MOVAL,[SI];逐个取数
MOVBL,AL
SHRAL,4
ANDAL,0FH;先对高字节部分做转换
CALLHEXASC
MOVDL,AL;显示高字节部分对应的字符
MOVAH,02HINT21H
MOVAL,BL
ANDAL,0FH;再对低字节部分做转换
CALLHEXASC
MOVDL,AL;显示低字节部分对应的字符
MOVAH,02HINT21H
MOVDL,20H;显示空格
MOVAH,02HINT21H
INCSI;继续循环或退出
LOOPAGAIN
MOVAH,4CHINT21H
HEXASCPROCNEARCMPAL,09H
JAHEXATOFADDAL,30HJMPENDHEX
HEXATOF:
ADDAL,37HENDHEX:
RET
HEXASCENDP
CODEENDS
ENDSTART
实验五:
DOS中断调用实验
(1)如果从键盘上依次输入的是一个数字和一个字母,则输出“RIGHT”标记后结束程序,否则输出标记“ERROR”后转向原出错处重做。
试编程实现该功能。
程序流程图略。
参考源程序:
DATASEGMENT
MSGDB0AH,0DH,'RIGHT',0AH,0DH,'$'WRNDB0AH,0DH,'ERROR',0AH,0DH,'$'
DATA