微机原理实验(三)
- 格式:doc
- 大小:341.50 KB
- 文档页数:7
微机原理硬件实验报告实验一 I/O 地址译码一、实验目的1、掌握 I/O 地址译码电路的工作原理。
二、实验内容及原理实验电路如图1-1所示,其中74LS74为D触发器,可直接使用实验台上数字电路实验区的D触发器,74LS138为地址译码器。
译码输出端Y0~Y7在实验台上“I/O地址“输出端引出,每个输出端包含8个地址,Y0:280H~287H,Y1:288H~28FH,…… 当CPU执行I/O指令且地址在280H~2BFH范围内,译码器选中,必有一根译码线输出负脉冲。
根据图1-1,我们可以确定A9~A3,AEN,IOW,IOR的值。
要使译码电路正常工作,必须使处于低电平有效。
因而可以确定A6=A8=0,A7=A9=1,AEN=0,IOW与IOR不可同时为1(即不能同时读写)。
当要从Y4输出低脉冲时,A5A4A3=100;从Y5输出时,A5A4A3=101。
综上所述,Y4输出时,应设置值2A0H(A9~A0=1010100000B);Y5输出时,应设置值2A8H(A9~A0=1010101000B)。
执行下面两条指令MOV DX,2A0HOUT DX,AL(或IN AL,DX)Y4输出一个负脉冲到D触发器的CLK上,因为D=1(接了高电平+5V),所以Q被赋值为1.延时一段时间(delay);执行下面两条指令;MOV DX,2A8HOUT DX,AL(或IN AL,DX)Y5输出一个负脉冲到CD,D触发器被复位,Q=0。
再延时一段时间,然后循环上述步骤。
利用这两个个负脉冲控制L7闪烁发光(亮、灭、亮、灭、……),时间间隔通过软件延时实现。
三、硬件接线图与软件流程图硬件接线:Y4/IO 地址接 CLK/D 触发器Y5/IO地址接 C/D触发器D/D触发器接 SD/D角发器接+5VQ/D触发器接 L7(LED灯)或逻辑笔软件流程图:四、源程序OUTPORT1 EQU 2A0H ;预置,方便修改OUTPORT2 EQU 2A8HCODE SEGMENTASSUME CS:CODESTART: MOV DX,OUTPORT1 ;根据原理图设定A9~A0 的值(Y4)OUT DX,AL ;让译码器Y4 口输出一个负脉冲CALL DELAY ;延时MOV DX,OUTPORT2 ;根据原理图设定A9~A0 的值(Y5)OUT DX,AL ;让译码器Y5 口输出一个负脉冲CALL DELAY ;延时MOV AH,1 ;调用1 号DOS 功能,等待键盘输入INT 16HJE START ;若有键盘输入则退出程序,否继续循环MOV AH,4CHINT 21HDELAY PROC NEAR ;延时子程序MOV BX,200 ;时延长度 (200)A: MOV CX,0B: LOOP BDEC BXJN E ARETDELAY ENDPCODE ENDSEND START五、实验结果LED 灯处于闪烁状态,键盘有输入后,成功退出。
实验三 TPC装置系统结构,I/O与存储器一.实验目的1、了解掌握TPC实验装置的基本原理和组成结构, 学会测试检查TPC-PCI总线转接卡地址;2、正确掌握I/O地址译码电路的工作原理,学会动态调试程序DEBUG/TD的直接I/O操作方法;3、学会利用I/O指令单步调试检查硬件接口功能,学会利用示波器检测I/O指令执行时总线情况;4、进一步熟悉8086/8088及PC机的分段存储特性, 了解存储器扩展原理,完成编程及测试。
二.实验环境1.硬件环境微型计算机(Intel x86系列CPU)一台,清华科教仪器厂TPC-2003A微机接口实验装置一台;数字记忆示波器一台.2.软件环境(1) Windows XP操作系统,编辑、汇编、链接和调试程序;(2) PC2003A集成开发环境软件一套及实验装置电子版资料三.基本实验1.基本实验内容和要求(1) 观察了解TPC实验装置的基本原理和组成结构;(2) 通过Win/XP控制台硬件信息或测试程序检查TPC-PCI总线转接卡地址,并记录;(3) 按图3.1的I/O地址译码测试参考电路连线, 分析电路原理,分别利用动态调试程序直接I/O操作功能和单步功能测试;(4) 编程利用片选负脉冲控制L7闪烁发光(亮、灭、亮、灭、……),时间间隔通过软件延时实现。
(5) 修改延时参数,使亮(约1秒)与灭的时间间隔分别为1秒、5秒和8秒), 记录延时程序对应参数BX,CX。
2.基本实验原理和步骤(1) 实验系统基本组成:TPC2003实验系统基于IBM-PC兼容主机, 装置硬件包括:PCI接口卡一块;实验台(箱)一个;50线扁平电缆一根;自锁紧导线50根;标准集成电路芯片(8251、74LS273、74LS244、6116)共4片,选配外扩键盘显示器电路一套。
该实验装置在PC系统中的位置如图3.1所示(虚线框内, 斜线标出):(1)TPC 扩展卡 I/O 和存储基地址TPC-2003A 将PCI 总线转换为伪ISA 总线信号(如图3.2),由于 PCI 总线结构支持即插即用(p&p )功能,每台微机分配给PCI 扩展板的资源是动态浮动的,不同于ISA 总线固定的外设地址,因此分配给设备的I /O 基地址、存储器基地址空间及INT 中断号会因不同的微机而有所变化(详细介绍请参看pci 总线规范文档或TPC 设备的教师实验指导书),所以实验前需要确定当前微机中PCI 卡的资源,并用其替换程序中的相应值,重新编译链接后才能实现实验效果。
《微机原理及应用技术》课程实验报告实验一片内输入、输出实验【预习内容】1.二进制、十进制及十六进制的表示方法及相互转换方法。
二进制XXXXB如1111B 十进制XX如15 十六进制0xXX如0x0f相互转换方法:十进制转二进制方法为:十进制数除2取余法,即十进制数除2,余数为权位上的数,得到的商值继续除2,依此步骤继续向下运算直到商为0为止。
二进制转十进制方法为:把二进制数按权展开、相加即得十进制数。
二进制转十六进制方法为:4位二进制数按权展开相加得到1位十六进制数。
(注意事项,4位二进制转成十六进制是从右到左开始转换,不足时补0)。
十六进制转二进制方法为:十六进制数通过除2取余法,得到二进制数,对每个十六进制为4个二进制,不足时在最左边补零。
十进制转十六进制有两种方法间接法把十进制转成二进制,然后再由二进制转成十六进制。
直接法把十进制转十六进制按照除16取余,直到商为0为止。
十六进制转成十进制方法为:把十六进制数按权展开、相加即得十进制数。
2.C语言基本数据类型、定义方式以及赋值范围。
(1)整数类型(2)浮点类型3.写出至少一种软件延时程序并说明原理。
基本原理:利用循环结构反复执行空语句占用指令周期,实现等待延时。
void Delay1ms() //@12.000MHz{unsigned char i, j;i = 2;j = 239;do{while (--j);} while (--i);}4.掌握for循环及while循环,掌握if语句及switch语句。
for语句for (/*初始化 int i=0*/; /*判断条件 i<count*/; /*执行语句 i++*/) {/* code */}while语句while (/* condition */){/* code */}do{/* code */} while (/* condition */);switch/case语句switch (/*表达式*/){case/*值1*/ : /* code */; break;case/*值2*/ : /* code */; break;...default : /* code */break;}If/if-else语句if (/* condition */){/* code */}else if (/* condition */){/* code */}else{/* code */}5.什么是单片机?什么是单片机最小系统?单片机最小系统三要素是什么?单片机(Microcontrollers,亦称MCU),即单芯片微型计算机,包括了CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能集成到一块硅片上构成的一个小而完善的微型计算机系统。
实验3. 循环程序设计一、实验目的⒈掌握移位指令的使用方法。
⒉学会循环结构程序的编程方法。
⒊利用DEBUG调试程序查看循环程序循环过程中CS和IP的变化情况。
二、实验要求⒈编写程序并上机调试,记录运行结果。
⒉用DEBUG调试程序调试所编程序,查看并记录每条指令内存单元地址及执行结果(包括F标志寄存各位值。
)⒊注意观察并记录每条指令执行后CS和IP寄存器值变化情况,以加深对循环程序的概念的理解。
三、实验内容⒉编写统计15个学生数学学习成绩程序。
要求:分别统计出低于60分,60-69分,70-79分,80-89分,90-100分的人数,并存放到S5,S6,S7,S8,S9,S10对应内存单元中。
源程序代码;DATA SEGMENTDATA1 DB 55,60,65,88,67,70,75,80,77,85,90,66,95,53,100DATA2 DB 5 DUP(?)DATA ENDS;CODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXMOV CX,15LEA SI,DATA1LEA DI,DATA2AGAIN:MOV AL,[SI]CMP AL,90JB NEXT1INC BYTE PTR[DI]JMP NEXT0NEXT1:CMP AL,80JB NEXT2INC BYTE PTR[DI+1]JMP NEXT0NEXT2:CMP AL,70JB NEXT3INC BYTE PTR[DI+2]JMP NEXT0NEXT3:CMP AL,60JB NEXT4INC BYTE PTR[DI+3]JMP NEXT0NEXT4:INC BYTE PTR[DI+4]NEXT0:INC SILOOP AGAINMOV AH,4CHINT 21HCODE ENDSEND START程序运行结果截图:四、实验总结本次实验掌握移位指令的使用方法。
微机原理与应用实验报告范文姓名:专业:学院:学号:指导老师:微机原理实验一一、实验目的1、熟悉汇编程序调试方法2、80某86指令运用及顺序结构程序设计二、实验设备80某86微型计算机三、实验内容1、编程并调试显示“HelloWord!”字符串的汇编程序STACKSSEGMENTSTACK;堆栈段DW128DUP()STACKSENDSDATASSEGMENT;数据段DATASENDSCODESSEGMENT;代码段ASSUMECS:CODES,DS:DATASSTART:MOVA某,DATAS;初始化MOVDS,A某OUTBUFDB'HelloWord!$'MOVD某,OFFSETOUTBUFMOVAH,9;显示在屏幕上INT21HMOVAH,4CH;退出程序INT21HCODESENDSENDSTART程序调试运行结果如下图:屏幕显示有“HelloWord!”字符串2、A、B、C、D、W是互不相等的在数据段中定义的16位有符号数,并假设加减运算不产生溢出。
编写一个完整段定义的汇编语言程序(包含必要的伪指令),计算W=(A+B)某(C—D)。
STACKSSEGMENTSTACK;堆栈段DW128DUP()STACKSENDSDATASSEGMENT;数据段ADW1HBDW2HCDW5HDDW6HWDW2DUP()DATASENDSCODESSEGMENT;代码段ASSUMECS:CODES,DS:DATASSTART:MOVA某,DATAS;初始化MOVDS,A某MOVA某,AADDA某,BMOVB某,CSUBB某,DIMULB某MOVW,A某MOVW+2,D某MOVAH,4CH;退出程序INT21HCODESENDSENDSTART调试验证结果:W=(A+B)某(C—D)=(1H+2H)某(5H-6H)=-3H,结果存于097E:0008开始的的4个单元里。
微机原理实验二一、实验目的1、熟悉80某86指令及汇编程序调试方法2、掌握分支和循环结构程序设计方法的运用二、实验设备80某86微型计算机三、实验内容3、设某、Y为在数据段中定义的有符号字变量。
实验一定时器/计数器实验一. 实验程序DATA SEGMENTDATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: PUSH DSMOV AX,0PUSH AX;返回DOSMOV AX,DATAMOV DS,AX;初始DSMOV DX, 22bH ;控制字端口地址MOV AL, 00110111B ;定时器0工作在方式3,16位初值,BCD计数OUT DX,ALMOV DX, 228H ;计数通道0端口地址MOV AL,00HOUT DX,ALmov al,96h;初值9600H=9600out dx,alMOV DX,22BHMOV AL, 01010100B;定时器1工作在方式2,8位初值,二进制计数OUT DX,ALMOV DX,229H;计数通道1端口地址MOV AL,10H;初值10H=16OUT DX,ALJMP $CODE ENDSEND START二.实验连线及结果GATE0、GATE1--+5V, CLK0--153.6KHZ,OUT0--CLK1,OUT1--L1,CS8253--228H。
=153.6KHZ/9600=16HZfout0=16HZ/16=1HZfout1运行后可观察到LED1在不停闪烁,间隔周期为1秒。
实验二双色灯实验一. 实验程序DATA SEGMENTPB DB ?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: POP DSMOV AX,OPUSH AX;返回DOAMOV DX,206H;控制字端口地址MOV AL,80H;A、B、C口全设置为方式0、输出 OUT DX,ALMOV DX,204H;C口端口地址MOV AL,0FFHOUT DX,AL ;全灭MOV DX,204H ;全红MOV AL,0FHOUT DX,ALMOV BX,7fH;延时参数CALL DLY;延时127tBG: MOV AL,5AH ;东西红,南北绿OUT DX,ALMOV BX,50HCALL DLY;延时50tMOV CX,03H;绿灯闪次数XH1: MOV AL,5FH ;东西红,南北灭OUT DX,ALMOV BX,10HCALL DLY;延时10tMOV AL,5AH ;东西红,南北绿OUT DX,ALMOV BX,10HCALL DLY;延时10tLOOP XH1;南北绿灯(灭→亮)重复CX次MOV AL,0AH ;东西红,南北黄OUT DX,ALMOV BX,20HCALL DLY;延时20tMOV AL,0A5H ; 东西绿,南北红OUT DX,ALMOV BX,50HCALL DLY;延时50tMOV CX,03;绿灯闪次数XH2: MOV AL,0AFH; 东西灭,南北红OUT DX,ALMOV BX,10HCALL DLY;延时10tMOV AL,0A5H; 东西绿,南北红OUT DX,ALMOV BX,10HCALL DLY;延时10tLOOP XH2;东西绿灯(灭→亮)重复CX次MOV AL,05H; 东西黄,南北红OUT DX,ALMOV BX,20HCALL DLY;延时20tJMP BGDLY PROC NEAR;延时子程序,延时t(假设BX=1) PUSH CXDDD: MOV CX,0FFFHCCC: LOOP CCCDEC BXCMP BX,0JNE DDDPOP CXRETDLY ENDPCODE ENDSEND START二.实验连线及结果将DG1~DG4,DR1~DR4连至8255的PC0~PC7,CS8255--200H。
微机原理实验报告实验⼀DEBUG 调试实验类型:实验课时:指导教师:时间:2013 年⽉⽇课次:第节教学周次:第周实验分室:实验台号:实验员:⼀、实验⽬的1.练习使⽤DEBUG,调试简单汇编程序。
⼆、实验要求1.掌握DEBUG的使⽤,调试程序。
2.读懂程序中各条指令,说明程序功能。
三、实验内容1.启动DEBUG,⽤A命令输⼊并汇编下列程序段。
100 MOV SI,200103 MOV CX,10106 MOV AL,0108 MOV [SI ],AL10A INC SI10B INC AL10D DEC CX10E JNZ 108110 INT 3四、实验结果及分析实验⼆简单汇编语⾔设计实验类型:实验课时:指导教师:时间: 2012 年⽉⽇课次:第节教学周次:第周实验分室:实验台号:实验员:⼀、实验⽬的1.巩固DEBUG及宏汇编的使⽤。
2.加深对指令的理解。
⼆、实验要求1.设堆栈指针SP=2000H,(AX)=3000H,(BX)=5000H。
请编⼀程序将AX的内容和BX的内容进⾏交换。
请⽤堆栈作为两寄存器交换内容的中间存储单元,⽤DEBUG调试程序进⾏汇编与调试。
2.设DS=当前段指地址,(BX)=0300H,(SI)=0002H,请⽤DEBUG的命令将存储器偏移地址300H~304H连续单元顺序装⼊0AH、0BH、0CH、0DH、0EH。
在DEBUG状态下送⼊下⾯程序,并⽤单步执⾏的⽅法,分析每条指令源地址的形成过程?当数据传送完毕时,AX中的内容是什么?程序清单如下:MOV AX,BXMOV AX,0304HMOV AX,[0304H]MOV AX,[BX]MOV AX,0001[BX]MOV AX,[BX][SI]MOV AX,0001[BX][SI]HLT3.设(AX)=0002H,编⼀个程序段将AX的内容乘10,要求⽤移位的⽅法完成。
三、思想描述实验内容1将两个寄存器的内容进⾏交换时,必须有⼀个中间寄存器才能进⾏内容的交换,如果⽤堆栈做为中间存储单元,必须遵循先进后出的原则。
同济大学电子与信息工程学院实验中心实验报告实验课程名称:微机原理与接口技术(双语)任课老师:张伟实验项目名称:并行总线实验姓名马绮铭学号1452343实验日期2016年10月25日实验地点电信楼348并行总线实验一、实验要求使用 4 块实验板完成多板间的并行总线实验,能够实现按键控制模块通过总线、cpu 模块来控制数码管显示模块的功能。
二、实验目的通过此实验加深对 Intel 微处理器的总线设计架构的理解,并尝试设计编写拓展模块。
掌握模块例化的方法,提高 Verilog 编程效率。
三、原理介绍在典型的 Intel 微处理器中,CPU 通过总线和其它设备连接,总线架构按功能分类,一般分为三类:数据总线(data bus)、地址总线(address bus)和控制总线(control bus)。
CPU、外设、总线的关系可以用下面这张图表示:典型的 Intel CPU 总线架构图Intel 微处理器最早使用并行总线架构,从最初的 16 位发展到 32 位、64 位,运行速度不断提高,在提高 CPU 的高速访问、扩大内存等性能上提供有力支持。
CPU 按照一定的时序逻辑,可以实现对总线和外设的数据进行高效、快速、准确的读、写操作。
8086 微处理器的总线时序:读操作中断功能:为了协调高速工作的 CPU 和低速运行的外设之间的矛盾,避免CPU 长时间处于无用的等待过程而浪费宝贵的 CPU 资源,Intel 微处理器还引入了中断的设计。
具体可以参照微机原理课程,这里不再展开。
四、实验环境硬件环境为 Xilinx 公司的 spartan3 开发板5块及其组件。
软件实验环境为Xilinx ISE 开发软件。
五、实验原理图六、模块说明此实验共需要五块开发板,分别充当CPU模块、总线模块、按键控制模块、数码管显示模块和UART串口模块。
1、 CPU 模块:使用 bank3作为总线端,连接到总线模块的bank 0,因端口数有限,设计包含4位地址线、8位数据线、3位控制线、4位中断信号线。
计算机科学与技术系实验报告专业名称计算机科学与技术课程名称微机原理与接口技术项目名称进制转换实验班级学号姓名同组人员无实验日期 2016/06/28一、实验目的与要求1、熟悉二进制、十进制、十六进制转换规则。
2、熟悉算术运算指令及移位指令的运用。
二、实验逻辑原理图与分析(汇编—流程图)2.1 画实验逻辑原理图三、程序分析1、十进制转二进制(此处时代码,但是由于上传问题,学生可以自己添加)将存放转换后的二进制数值,并通过移位的方式将寄存器中的每一位转换成对应的字符显示出来就成了对应的二进制。
2、二进制转十进制(此处也是代码,只要把代码复制进去就行。
也可以私聊我,我分享代码给你们。
)用系统功能调用将上面程序除出来的每一位转换成字符输出到显示器上来,从而完成2进制向10进制的转黄。
四、实验数据和结果分析4.1 实验结果数据二进制转十进制实验结果: 00001111B=15D;十进制转二进制实验结果:27D=00011011B;十六进制转十进制的实验结果:0011H=17D4.2 结果数据分析二进制转十进制结果分析:((0*2+1)*2+1)*2+1)*2+1=15;十进制转二进制结果分析:该数在计算机是以二进制形式存储的,即0,1,每次输出时,根据最高位判断一下是1还是0;十六进制转十进制结果分析:(0*16+1)*16+1=17五、实验问题分析、思考题与小结在实验过程中,我们发现对于16位的10转2中,其高位会出错通过检测盘查发现,错误出在对于寄存器的界限上以及高低位的使用上有问题。
本次实验过程中,我们进一步了解的系统功能调用,如从键盘上输入字符以及从显示器上显示对应的字符。
了解了在汇编语言中如何实现子函数调用,利用call 指令调用对应的函数,从而减少程序的重复性以及方便程序的可读性。
在整体实验中熟悉了移位指令,算术指令以及堆栈相关的指令,对于这些指令的用法进一步了解了。
并通过在编写程序中出现的错误加深了自身的编程习惯。
试验一存储器读写实验一、存储器读写实验目的1、熟悉静态RAM的使用方法,掌握8088微机系统扩展RAM的方法。
2、掌握静态RAM读写数据编程方法。
二、实验内容对指定地址区间的RAM(2000H~27FDH)先进行写数据55AAH,然后将其内容读出再写到3000H~33FEH中。
三、实验步骤(运行实验程序)1、运行实验程序;2、稍后按RESET键退出,用存贮器读方法检查2000H~27FDH中的内容和3000~33FF中的内容应都是55AA。
四、实验程序CODE SEGMENTASSUME CS:CODESTART: MOV AX,0HMOV DS,AXMOV BX,2000HMOV AX,55AAHMOV CX,03FFHRAMW1: MOV DS:[BX],AXADD BX,0002HLOOP RAMW1MOV AX,2000HMOV SI,AXMOV AX,3000HMOV DI,AXMOV CX,03FFHCLDREP MOVSBRAMW2: JMP RAMW2CODE ENDSEND START实验二继电器控制实验一、实验目的:掌握用继电器控制的基本方法和编程。
二、实验内容1、利用8255A PB0输出高低电平,控制继电器的开合,以实现对外部装置的控制。
2、硬件线路原理如图5-23所示3、实验预备知识:现代自动化控制设备中都存在一个电子与电气电路的互相联结问题,一方面要使电子电路的控制信号能够控制电气电路的执行元件(电动机、电磁铁、电灯等);一方面又要为电子电路的电气提供良好的电隔离,以保护电子电路和人身的安全,电子继电器便能完成这一桥梁作用。
三、连线方法1、8255A的PB0连JIN插孔。
2、将CS-8255连到Y6。
四、实验步骤1、按图连好实验线路图。
2、运行实验程序,继电器应循环吸合,L-13和L-14交替亮灭。
五、硬件线路接线图六、试验程序CODE SEGMENTASSUME CS:CODEIOCONPT EQU 0063HIOCPT EQU 0061HSTART: MOV AL,80HMOV DX,IOCONPTOUT DX,ALNOPNOPNOPIOLED1: MOV DX,IOCPTIODE2: MOV AL,01HOUT DX,ALCALL DELAYMOV AL,00HOUT DX,ALCALL DELAYJMP IODE2DELAY: MOV CX,0FFFFHDELY: LOOP DELYRETCODE ENDSEND START实验三小直流电机调速实验一、实验目的1、掌握直流电机的驱动原理。
实验三计算N!实验
一、实验目的
通过编制一个阶乘计算程序,了解高级语言中的数学函数是怎样在汇编语言一级上实现的。
二、实验内容
编制计算N!的程序,数值N由键盘输入,结果在屏幕上输出,N的范围是0到0xFF。
即刚好能够被一个16位寄存器容纳。
编制阶乘程序的难点在于随着N的增大,其结果远不是寄存器所能容纳的,这样就必须将结果放在一个内存缓冲区中,然而乘法运算只能限制两个字相乘,因此要确定好算法,依次从缓冲区中取数,进行两字相乘,并将DX中的高16位积作为产生的进位。
程序根据阶乘的定义:N!=N·(N-1)·(N-2)·……·2·1,从左往右依次计算,结果保存在缓冲区BUF中,缓冲区BUF按结果由低到高依次排列。
程序首先将BP初始化为存放N值,然后使BP为N-1,以后BP依次减1,直至变化为1,每次让BP与BUF中的字单元按由低到高的次序相乘,低位结果AX仍保存在相应的BUF字单元中,最高位结果DX则送到进位字单元CY中,以作为高字单元相乘时从低字来的进位,初始化CY为0,计算结果的长度随着乘积运算而不断增长,由字单元LEN指示,当最高字单元与BP 相乘时,若DX不为0,则结果长度要扩展。
三、程序流程图
四、实验程序
CRLF MACRO
MOV AH,02H
MOV DL,0DH
INT 21H
MOV AH,02H
MOV DL,0AH
INT 21H
ENDM
DATA SEGMENT
MESS1 DB 'INPUT THE NUMBER ACCORDING TO HEXNUM!',0DH.0AH,'$' MESS2 DB 'THE RESULT IS:$'
ERROR DB 'INPUT ERROR!',0DH,0AH,'$'
LEN DW 1
CY DW ?
BUF DW 256 DUP(0)
DATA ENDS
STACK SEGMENT
STA DW 32 DUP(?)
TOP DW ?
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK
START: MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV SP,TOP
MOV AH,09H
MOV DX,OFFSET MESS1
INT 21H
CALL GETNUM
MOV BP,DX
CMP BP,0
JZ EEE
CMP BP,1
JZ EEE
MOV SI,OFFSET BUF
MOV [SI],DX
XXX: DEC BP
CMP BP,0001H
JZ LLL
XOR BX,BX
MOV WORD PTR [CY],0
MOV CX,[LEN]
TTT: MOV AX,[SI+BX]
MUL BP
ADD AX,[CY]
JNC JJJ
INC DX
JJJ: MOV [SI+BX],AX
MOV [CY],DX
INC BX
INC BX
LOOP TTT
CMP DX,0000H
JZ BBB
INC WORD PTR [LEN] MOV [SI+BX],DX BBB: JMP XXX
EEE: MOV SI,OFFSET BUF MOV WORD PTR [SI],1 LLL: MOV AH,09H
MOV DX,OFFSET MESS2 INT 21H
MOV CX,[LEN]
MOV BX,CX
DEC BX
SHL BX,1
CCC: MOV AX,[SI+BX]
CALL DISP
DEC BX
DEC BX
LOOP CCC
MOV AX,4C00H
INT 21H
DISP1 PROC NEAR
MOV BL,AL
MOV DL,BL
MOV CL,04H
ROL DL,CL
AND DL,0FH
CALL DISPL
MOV DL,BL
AND DL,0FH
CALL DISPL
RET
DISP1 ENDP
DISPL PROC NEAR
ADD DL,30H CMP DL,3AH JB DDD
ADD DL,27H DDD: MOV AH,02H INT 21H
RET
DISPL ENDP
DISP PROC NEAR
PUSH BX
PUSH CX
PUSH DX
PUSH AX
MOV AL,AH CALL DISP1 POP AX
CALL DISP1 POP DX
POP CX
POP BX
RET
DISP ENDP
GETNUM PROC NEAR
PUSH CX
XOR DX,DX GGG: MOV AH,01H INT 21H
CMP AL,0DH JZ PPP
CMP AL,20H JZ PPP
SUB AL,30H JB KKK
CMP AL,0AH JB GETS
CMP AL,11H JB KKK
SUB AL,07H CMP AL,0FH JBE GETS
CMP AL,2AH JB KKK
CMP AL,2FH
JA KKK
SUB AL,20H
GETS: MOV CL,04H
SHL DX,CL
XOR AH,AH
ADD DX,AX
JMP GGG
KKK: MOV AH,09H
MOV DX,OFFSET ERROR
INT 21H
PPP: PUSH DX
CRLF
POP DX
POP CX
RET
GETNUM ENDP
CODE ENDS
END START
五、实验分析与结果预测
一、实验总体分析
对实验程序进行总体分析,发现该实验的总体思想和我们在数学中求一个数的阶乘的步骤完全一致。
在程序中先输入一个需要求阶乘的量,并将其保存,再将这个值与0和1进行比较,如果该值为零或者为1,则求阶乘的最终结果为1。
否则如果该值是大于一的整数(十六进制),则将该值与比它小1的数相乘并得到一个乘积,考虑到进位所以将乘积的高字部分保存,以便在下一次相乘后将进位的值加在乘积中,每乘完一次就将该值减1,将目前所存的乘积的结果与减1后的该值相乘并保存,知道该值减为1时停止,最终所得的结果就是这个数的阶乘。
二、实验过程详细分析与结果预测
第一步:本实验首先调用GETNUM子程序,调用的目的是为了得到求阶乘的N值,在该子程序中用到了1号中断功能MOV AH,01H;INT 21H,输入一个字符并回显,之后对这个数进行判断,判断它是否为1~9的数字,如果不是,则要重新进行输入,如果要求的阶乘的N大于9,则还要进还要进行输入,知道遇到空格即得到N值。
依照上述对输入N值的分析,我将N指定为12并输入,将N值存入BP中。
再用T命令进行跟踪的时候可以看到存入BP后的情况,如下所示
第二步:将BP中的值与0比较CMP BP,0;JZ EEE;由于12不等于0,所以不需要转移,直接执行后面的语句,再将BP与1进行比较CMP
BP,1;JZ EEE;同样12也不等于1,所以继续向下执行语句,将BP的值减1变为11,并将12的值送入能存和AX为相乘做准备,可以通过D命令在内存中观察12存入内存的情况如下
第三步:将12与11相乘,乘积的高字部分给DX,并将结果保存在内存中,可以预测第一次相乘后的结果为:01 00 00 00 32 01,通过D命令实际观察的结果如下
与预测相符,高字部分也相应存入的内存,以便下一次相乘是将进位与乘积相加。
第四步:BP的值再减1,变成10,并将第一次所得结果与10相乘,继续将乘积和高字部分保存,预测第二次相乘后的内存中的存放结果为:01 00 00 00 20 13
与预测结果一致(预测结果是通过计算器算得的)。
第五步:BP当前的值又减1,重复上述步骤,继续将乘积与新的BP的值相乘直到BP的值变为1时,结束循环。
可以预测BP的值为1是内存中的结果为:04 00 00 00 00 00 73 CA EC BE 16,实际结果如下所示
预测与实际一致,验证了猜想是正确的,实验完毕!。