北京邮电大学 微机原理软件实验3
- 格式:docx
- 大小:1.18 MB
- 文档页数:10
北京邮电大学微机原理软件实验报告信息与通信工程学院微机原理软件实验报告班级:姓名:学号:班内序号:时间:微机原理软件实验·报告实验一DEBUG 的使用一、实验目的1.掌握汇编程序的编辑,编译,连接和执行的全过程;2.学习和掌握用DEBUG 调试程序的方法。
二、实验内容1. 用编辑软件,输入以下汇编语言源程序:DAT SEGMENTA DB 20 ;(自定)B DB 15 ;(自定)Y DB 3 DUP (0)Z DB 0, 0DAT ENDSSTA SEGMENT STACKDW 50 DUP (?)STA ENDSCOD SEGMENTASSUME CS: COD, DS: DATSTAR PROC FARPUSH DSXOR AX, AXPUSH AXMOV AX, DATMOV DS, AXMOV AX, STAMOV SS, AXMOV AL, AMOV Z, ALMOV Z+1, ALCALL SUB1MOV AL,B微机原理软件实验·报告MOV Z,ALMOV Z+1,ALCALL SUB1MOV AL,AMOV Z,ALMOV AL,BMOV Z+1,ALCALL SUB1ADD WORD PTR Y,AXADC BYTE PTR[Y+2],0RETSTAR ENDPSUB1 PROCMOV AL, ZMOV AH, Z+1MUL AHADD WORD PTR Y, AXADC BYTE PTR[Y+2], 0RETSUB1 ENDPCOD ENDSEND STAR2. 通过编译,连接形成可执行文件。
3. 用DEBUG 将可执行文件调入,并进行调试。
1) 用D 命令观察数据区在内存中的具体内容,记录单元A 和B 的具体地址。
2) 用U 命令对目标代码反汇编,观察反汇编后的结果。
注意发现源程序的起始位置,并记录这个起始地址。
3) 用T 命令作单步跟踪调试。
比较每条指令执行后的结果和原来的理解是否一致,得出程序运行的结果:它们是写在什么单元,具体内容是什么;并判断结果是否正确。
微机原理与接口技术硬件实验报告学院:信息与通信工程学院班级:201******学生姓名:****** ******学号:201******* 201*******班内序号:** **实验一熟悉实验环境及IO的使用一、实验目的:1. 通过实验了解和熟悉实验台的结构,功能及使用方法。
2. 通过实验掌握直接使用Debug 的I、O 命令来读写IO 端口。
3. 学会Debug 的使用及编写汇编程序二、实验内容:1. 学习使用Debug 命令,并用I、O 命令直接对端口进行读写操作,2.用汇编语言编写跑马灯程序。
(使用EDIT 编辑工具)实现功能A.通过读入端口状态(ON 为低电平),选择工作模式(灯的闪烁方式、速度等)。
B.通过输出端口控制灯的工作状态(低电平灯亮)三、实验步骤:1.实验板的IO 端口地址为0E8E0H在Debug 下,I 是读命令。
(即读输入端口的状态---拨码开关的状态)O 是写命令。
(即向端口输出数据---通过发光管来查看)进入Debug 后,读端口拨动实验台上八位拨码开关输入I 端口地址回车屏幕显示 xx 表示从端口读出的内容,即八位开关的状态ON 是0,OFF 是 1 写端口输入 O 端口地址xx (xx 表示要向端口输出的内容)回车查看实验台上的发光二极管状态,0 是灯亮,1 是灯灭。
2. 在Debug 环境下,用a 命令录入程序,用g 命令运行C>Debug -amov dx, 端口地址mov al,输出内容out dx, almov ah, 0bhint 21hor al, aljz 0100int 20h-g运行查看结果,修改输出内容再运行查看结果分析mov ah, 0bhint 21hor al, aljz 0100int 20h该段程序的作用:检测键盘有没有按键,有则返回DOS。
没有继续执行3.利用EDIT 工具编写汇编写跑马灯程序程序实现功能A.通过读入端口状态(ON 为低电平),选择工作模式(灯的闪烁方式、速度等)。
北邮通信原理软件实验报告北邮通信原理软件实验报告一、实验目的本次实验旨在加深对通信原理知识的理解,并通过实际操作掌握常用通信原理技术。
二、实验内容及原理本次实验分为三项实验内容:1、FSK解调实验FSK是一种通信调制技术,在数字信号传输领域中比较常用。
FSK解调实验中,我们使用MATLAB软件编写程序,模拟FSK解调过程,了解解调过程中的基本原理。
FSK是通过改变载波频率来传输信息的调制技术。
在数字信号的传输中,我们一般将数字信号分为两种,0和1,然后分别将它们对应到两个频率上,再将这两个频率进行交错发送,接收方通过检测频率的变化来判断发送方的信息。
在FSK解调实验中,我们使用的解调技术是匹配滤波器法。
解调的过程是将接收到的信号经过低通滤波器,合并成一个信号。
2、QAM解调实验QAM是一种把两路模拟信号叠加的数字调制技术,它是组合了ASK和PSK的数字传输技术。
QAM解调实验中,通过MATLAB软件仿真的方法,模拟QAM解调过程,了解解调过程中的基本原理。
QAM技术是将两路数模合成的模拟信号进行数字化处理,将两路模拟信号进行分别调制成两个独立的数字信号,然后将这两个数字信号通过载波同步合成一个数字信号进行传输。
在QAM解调实验中,我们使用的解调技术是相干解调。
解调的过程是将接收到的信号经过相干解调器解调,得到原始的时域信号,然后通过低通滤波器进行滤波。
3、OFDM调试实验OFDM技术是目前广泛应用于高速数据传输的一种技术,它是通过将信号分成多个子载波进行传输,提高频率利用率,并实现抗多径衰落的效果。
OFDM调试实验中,我们通过软件界面和Matlab代码相结合,模拟OFDM调制和解调过程,了解其中的基本原理。
OFDM技术是通过将原始信号分成多个子信道,每个子信道独立传输,最终将其合并成整个信号。
因此,在OFDM模式下,每个子信道的公共频率就成为可利用的带宽,提高了传输率并减少了所需的带宽。
在OFDM调试实验中,我们使用了MATLAB软件进行调制和解调。
信息与通信工程学院微机原理软件实验报告班级:2012211103姓名:申宇飞学号:2012210064日期:2014年11月实验一 DEBUG 的使用 (3)一、实验目的 (3)二、实验内容 (3)三、预习思考 (5)四、实验过程 (6)五、实验总结 (10)实验二分支、循环程序设计 (11)一、实验目的 (11)二、实验内容 (11)三、预习思考 (11)四、实验过程 (13)(一)流程图 (13)(二)源代码 (14)(三)实验分析 (18)五、实验总结 (18)实验三代码转换程序设计 (20)一、实验目的 (20)二、实验内容 (20)三、预习思考 (20)四、实验过程 (21)(一)流程图 (21)(二)模块层次图 (21)(三)源代码 (22)(四)实验分析 (26)五、实验总结 (28)实验四子程序设计 (29)一、实验目的 (29)二、实验内容 (29)三、预习思考 (29)四、实验过程 (30)(一)流程图 (30)(二)源代码 (31)(四)实验分析 (34)五、实验总结 (36)实验五中断程序设计 (37)一、实验目的 (37)二、实验内容 (37)三、预习思考 (37)四、实验过程 (38)(一)流程图 (38)(二)源代码 (39)(三)实验分析 (45)五、实验总结 (46)实验一DEBUG 的使用一、实验目的1.掌握汇编程序的编辑、编译、连接和执行的全过程;2.学习和掌握用DEBUG调试程序的方法。
二、实验内容1.用编辑软件,输入以下汇编语言源程序:DAT SEGMENTA DB 20B DB 15Y DB 3 DUP(0)Z DB 0,0DAT ENDSSTA SEGMENT STACKDW 50 DUP(?)STA ENDSCOD SEGMENTASSUME CS:COD,DS:DATSTAR PROC FARPUSH DSXOR AX,AXPUSH AXMOV AX,DATMOV DS,AXMOV AX,STAMOV SS,AXMOV AL,AMOV Z,ALMOV Z+1,ALCALL SUB1MOV AL,BMOV Z,ALMOV Z+1,ALCALL SUB1MOV AL,AMOV Z,ALMOV AL,BMOV Z+1,ALCALL SUB1ADD WORD PTR Y,AXADC BYTE PTR[Y+2],0RETSTAR ENDPSUB1 PROCMOV AL,ZMOV AH,Z+1MUL AHADD WORD PTR Y,AXADC BYTE PTR[Y+2],0RETSUB1 ENDPCOD ENDSEND STAR2.通过编译,连接形成可执行文件。
实验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.掌握基本分⽀,循环程序设计;3.掌握最简单的DOS 功能调⽤.⼆.实验内容:1.安排⼀个数据区(数据段),内存有若⼲个正数,负数和零.每类数的个数都不超过9.2.编写⼀个程序统计数据区中正数,负数和零的个数.3.将统计结果在屏幕上显⽰.三.预习题:1.⼗进制数0 -- 9 所对应的ASCII 码是什么? 如何将⼗进制数0 -- 9 在屏幕上显⽰出来?答:0—9对应的ASCII码是30H,31H,32H,33H,34H,35H,36H,37H,38H,39H,将⼗进制数转换成相应的ASCII码并调⽤字符显⽰功能即能实现⼗进制数在屏幕上的显⽰。
2.如何检验⼀个数为正,为负或为零? 你能举出多少种不同的⽅法?答:将该数与0字符(ASCII码为30H)⽐较,根据⽐较的结果转⼊不同的分⽀。
四.流程图:开始初始化CX,BX,AH,DH,DL[BX] 0?[BX]=0?DH++DH 记录等于零的个数BX++BX++CX--AH++AH 记录⼩于零的个数DL++DL 记录⼤于零的个数CX 0?将AH,DH,DL 中的数转成ASCII 码并存储显⽰结束YES YES NOYESNO NO CX 是待处理的数的个数,BX 是这串数的⾸地址五.代码:六.运⾏结果:七.总结:第⼀次在DOS窗⼝下⽤汇编编程,⼀些基本的操作和以前的⾼级语⾔迥然不同,如建⽴⽂件,编译,链接,调试,这些操作都是要在DOS窗⼝中键⼊语⾔指令来完成的,不像⾼级语⾔的编译器只要按下相关的键就好了,⽤语⾔指令能更加明⽩编译,调试这些操作真正的含义。
更重要的是调试指令,通过这些指令,可以直接看到寄存器,内存中真真切切的变化,对硬件的⼯作机制特别是cpu的指令运⾏,内存的数据存储与读取,整个程序运⾏的本质过程有了更加透彻的了解和认识。
微机原理软件实验报告学院:信息与通信工程学院班级:班内序号:姓名:学号:实验二分支,循环程序设计一.实验目的:1.开始独立进行汇编语言程序设计;2.掌握基本分支,循环程序设计;3.掌握最简单的DOS 功能调用.二.实验内容:1.安排一个数据区(数据段),内存有若干个正数,负数和零.每类数的个数都不超过9.2.编写一个程序统计数据区中正数,负数和零的个数.3.将统计结果在屏幕上显示.三.预习题:1.十进制数0 -- 9 所对应的ASCII 码是什么? 如何将十进制数0 -- 9 在屏幕上显示出来?答:0—9对应的ASCII 码是30H—39H;在屏幕上显示0—9,需要将对应字符的ASCII 码赋给DL,并进行DOS的2号功能调用,0—9的ASCII 码正是其本身的数值加上30H。
2.如何检验一个数为正,为负或为零? 你能举出多少种不同的方法?答:①用CMP命令和0比较,如果ZF为1,则该数为零;再用该数和8000H相与,取出符号位判断,可区分正负;②用CMP命令和0比较,结果不小于0时用JGE命令进行跳转,否则为负数;用JGE 命令跳转后,如果为0再用JZ命令跳转,否则为正数。
四.选作题:统计出正奇数,正偶数,负奇数,负偶数以及零的个数.五.实验过程1.流程图2.源代码DATA SEGMENTNUM DW 0,0,1,2,3,4,5,101,-6,-7,-8,-8,-9 ;有2个0,6 个正数,5 个负数N DW ($-NUM)/2 ;该组数据的个数Z DB 0 ;0 的个数P DB 0 ;正数的个数PO DB 0 ;正奇数的个数PE DB 0;正偶数的个数M DB 0 ;负数的个数MO DB 0;负奇数的个数ME DB 0 ;负偶数的个数STR0 DB 'number of zeros : $' ;STR0-4为用于显示的字符串STR1 DB 0DH, 0AH, 'number of positive numbers : $'STR2 DB 0DH, 0AH, 'number of negative numbers : $'STR3 DB 0DH, 0AH, ' odd : $'STR4 DB ' even : $'DATA ENDSSTACK SEGMENT STACKDW 100 DUP(?)STACK ENDSCODE SEGMENTASSUME DS:DATA, SS:STACK, CS:CODESTART: MOV AX, DATAMOV DS, AXMOV AX, STACKMOV SS, AX ;初始化DS、SSLEA BX, NUM ;将NUM 中第一个数字的地址送入BXMOV CX, N ;将数据个数送入CXAGAIN: MOV AX, [BX] ;取出NUM 中的第一个数字CMP AX, 0 ;和0比较JGE PLU ;大于等于0时转PLUINC M ;负数的个数加1TEST AX, 1 ;检测该数据最低位是否为1,即是否为负奇数JNZ MINODD ;ZF为0时转MINODD,该数为负奇数INC ME ;负偶数个数加1JMP NEXTMINODD: INC MO ;负奇数个数加1JMP NEXTPLU: JZ ZER ;等于0时转ZERINC P ;正数个数加1TEST AX, 1 ;检测该数据最低位是否为1,即是否为正奇数JNZ PLUODD ;ZF为0时转PLUODD,该数为正奇数INC PE ;正偶数个数加1JMP NEXTPLUODD: INC PO ;正奇数个数加1JMP NEXTZER: INC Z ;零的个数加1NEXT: ADD BX,2 ;偏移地址加2,指向下一数字LOOP AGAIN ;CX自减,CX≠0时继续循环DISPLAY: ;在屏幕上显示统计结果MOV AH, 09H ;9号功能调用,显示字符串MOV DX, OFFSET STR0 ;将字符串的首地址的偏移地址送到DX,DS已;是其段基址INT 21HMOV AH, 02H ;2号功能调用,显示单个字符MOV DL, Z ;将零的个数送到DLADD DL, 30H ;0—9数字本身加上30H即为其ASCII 码INT 21HMOV AH, 09H ;正数部分统计结果显示,原理同上MOV DX, OFFSET STR1INT 21HMOV AH, 02HMOV DL, PADD DL, 30HINT 21HMOV AH, 09HMOV DX, OFFSET STR3INT 21HMOV AH, 02HMOV DL, POADD DL, 30HINT 21HMOV AH, 09HMOV DX, OFFSET STR4INT 21HMOV AH, 02HMOV DL, PEADD DL, 30HINT 21HMOV AH, 09H ;负数部分统计结果显示,原理同上MOV DX, OFFSET STR2INT 21HMOV AH, 02HMOV DL, MADD DL, 30HINT 21HMOV AH, 09HMOV DX, OFFSET STR3INT 21HMOV AH, 02HMOV DL, MOADD DL, 30HINT 21HMOV AH, 09HMOV DX, OFFSET STR4INT 21HMOV AH, 02HMOV DL, MEADD DL, 30HINT 21HMOV AX, 4C00H ;返回DOSINT 21HCODE ENDSEND START3.运行结果数据为:0,0,1,2,3,4,5,101,-6,-7,-8,-8,-9运行结果:zero表示零的个数,为2;positive number表示正数的个数,为6,其中奇数odd为4个,偶数even为2个;negative number表示负数的个数,为5,其中奇数odd为2个,偶数even 为3个。
实验一1.实验要求:编一程序,将地址偏移量为100H单元开始的256个单元分别写入00H,01H,……,FFH数据;统计写入的数据块的0元素、正元素、负元素的个数,并分别将统计结果送入上述数据块后的三个单元中;用DOS功能调用显示上面数据快各单元(包括统计结果)内容,要求每行显示16个数据,两个数据之间用空格隔开。
程序设计思路:分配256个单元存放数据00H,01H,……,FFH,3个单元存放统计结果。
约定:DH存放0的个数,BH存放负数的个数,BL存放正数的个数,然后进行将256个数据一一与0进行比较,得到 DH、BH、BL。
将DH、BH、BL 存入SI的最后三个单元。
最后在以高、低4位,依次将每个单元的数据输出。
2. 程序流程:4.子程序:DISP PROC NEAR ;Show number MOV DL,AL MOV AH,2 INT 21H RET DISP ENDP开始初始化;SI 前256个单元存放00 H……FFH;CX=256;DH=0;BX=0;CMP AL ,0;MOV AL ,[SI] CX=0?将DH ,BX 存入SI ;INC SI ;CX=259;YESINC DH ;INC BHINC BL显示高4位显示低4位; 添加空格; INC SI ;BH=0??BH=16;CX=0?SF=ELSZF=1N ONO YE SN O终止YE实验二1.实验要求:编一程序,把键入的十六进制数转换成十进制,要求:(1)在屏幕上显示转换的十进制数,键入的最大值为FFFFH;(2)若键入非16进制的数,则提示错误;(3)程序中至少用一个子程序和宏命令。
2.程序设计思路:首先判断键入的字符是否为合法的十六进制字符,若是十六进制,将其转化成二进制数值,放入BX中,然后接收下一个字符,并将上一个字符左移4位,再讲此时的BX与接收到的BX相加,直到键入回车,停止接收。
然后通过除以10000,依次将余数除以1000、100、10、1,将二进制转化为十进制,再显示出来。
实验名称:汇编语言程序设计实验日期:2023年3月10日实验地点:计算机实验室实验者:张三一、实验目的1. 熟悉汇编语言的基本语法和指令系统。
2. 掌握汇编语言程序设计的基本方法。
3. 通过实验,加深对微机原理的理解。
二、实验内容本次实验主要涉及以下内容:1. 数据传送指令的应用2. 算术运算指令的应用3. 控制转移指令的应用4. 子程序设计三、实验步骤1. 编写一个简单的程序,实现以下功能:(1)将数据0x1234存入寄存器AX;(2)将数据0x5678存入寄存器BX;(3)计算AX和BX的乘积,并将结果存入寄存器DX;(4)将乘积的高16位和低16位分别存入寄存器CX和AX。
2. 编写一个程序,实现以下功能:(1)将数据0x1A2B3C4D存入内存单元[0x1000];(2)从内存单元[0x1000]开始,读取连续4个字节的数据;3. 编写一个程序,实现以下功能:(1)定义一个子程序,实现两个整数的加法运算;(2)在主程序中调用该子程序,实现两个整数的加法运算。
四、实验结果与分析1. 数据传送指令的应用(1)将数据0x1234存入寄存器AX;MOV AX, 0x1234(2)将数据0x5678存入寄存器BX;MOV BX, 0x5678(3)计算AX和BX的乘积,并将结果存入寄存器DX;MUL BX(4)将乘积的高16位和低16位分别存入寄存器CX和AX; MOV CX, DXMOV AX, DX2. 算术运算指令的应用(1)将数据0x1A2B3C4D存入内存单元[0x1000];MOV [0x1000], 0x1A2B3C4D(2)从内存单元[0x1000]开始,读取连续4个字节的数据; MOV AX, [0x1000]MOV BX, [0x1000+2]MOV CX, [0x1000+4]MOV DX, [0x1000+6]MOV AH, 0x0EINT 0x103. 控制转移指令的应用(1)定义一个子程序,实现两个整数的加法运算;ADD procedure:ADD AX, BXRET(2)在主程序中调用该子程序,实现两个整数的加法运算;MOV AX, 0x1MOV BX, 0x2CALL ADDMOV CX, AX五、实验心得通过本次实验,我深刻理解了汇编语言的基本语法和指令系统,掌握了汇编语言程序设计的基本方法。
微机原理与接口技术硬件实验报告目录3.实验三8253计数器/定时器的应用 (3)3.1.实验目的 (3)3.2.实验内容 (3)3.2.1.连接电路并测试 (3)3.2.2.音乐播放 (6)3.2.3.弹琴 (17)3.3.思考题 (27)3.4.心得体会 (27)参考资料 (28)声明与致谢 (28)3.实验三8253计数器/定时器的应用3.1.实验目的学习掌握8253用作定时器的编程原理。
3.2.实验内容3.2.1.连接电路并测试8253的CS接译码器输出Y1(其地址为E820-E827H);8253的OUT接蜂鸣器的BELL端;8253的门控信号GATE接+5V;8253的CLK端接Q7(32KHz);清零复位电路中的T/C端接地(或接RESET端)。
图13电路连接示意(局部)图14线路连接在本实验中,只采用定时器0,方式3,只用低字节初始化,故初始化控制字为00010110B,即16H。
它发往控制口E803H。
初值赋给端口E800H。
利用下表,在debug模式下,测试8253与蜂鸣器工作状况。
表4不同音高对应分频数(基频32KHz)音名分频数(十六进制)低音中音高音更高音甚高音Do80402010Re72391C0EMi663319Fa603018So552B15La4D2613Si87442211 CODE(debug mode)MOV DX,E823MOV AL,16OUT DX,ALMOV DX,E820MOV AL,80OUT DX,AL经检验,蜂鸣器发声正常。
3.2.2.音乐播放完成一个音乐发生器,通过蜂鸣器放出音乐,并在数码管上显示乐谱。
程序设计:音乐为巴赫的小步舞曲,只放一遍。
放音乐时,在最左边的数码管上显示播放的音符。
放完音乐或用户敲击键盘时退出程序返回DOS。
返回DOS 前,数码管全灭,蜂鸣器静音。
流程图如下:图15音乐播放流程图程序源代码:CODE(minuet.asm);FILENAME:minuet.asm;AUTHOR:XIAO,Zhiqing(No.13,Cl.07105);DATE:20091223;DESCRIPTION:play music;=============macro=============;macro:myOut(WARNING:it may change the value of AL);it's strongly recommended that data be ALmyOut MACRO portAddr,dataPUSH DXMOV DX,portAddrMOV AL,dataOUT DX,ALPOP DXENDM;macro:myLutOut(WARNING:it may change the value of AL);it's strongly recommended that data be ALmyLutOut MACRO portAddr,lut,dataPUSH DXPUSH BXMOV BX,OFFSET lutMOV AL,dataXLAT lutMOV DX,portAddrOUT DX,ALPOP BXPOP DXENDM;macro:myIn(WARNING:it may change the value of AL);it's strongly recommended that data be ALmyIn MACRO portAddr,dataPUSH DXMOV DX,portAddrIN AL,DXMOV data,ALPOP DXENDM;=============data segment=============Data SEGMENT;Segments Lookup TableSegLut DB0EDH,21H,0F4H,0F1H,39H;"01234"DB0D9H,0DDH,61H,0FDH,0F9H;"56789"DB7DH,9DH,0CCH,0B5H,0DCH,5CH; "ABCDEF"DB3DH,8CH;'H'(10H)'L'(11H)DB00H,10H;''(12H)'-'(13H)space EQU12Hbar EQU13H;Content index array to printContent DB12H,12H,12H,12H,12H,12H;Voice to playFreq DB0H;freqsiF EQU87H;32k/240;0do0EQU80H;32k/256;1re0EQU72H;32k/288;2mi0EQU66H;32k/320;3fa0EQU60H;32k/341;4so0EQU55H;32k/384;5la0EQU4DH;32k/427;6si0EQU44H;32k/480;7do1EQU40H;32k/512;8re1EQU39H;32k/576;9mi1EQU33H;32k/640;Afa1EQU30H;32k/682;Bso1EQU2BH;32k/768;Cla1EQU26H;32k/853;Dsi1EQU22H;32k/960;Edo2EQU20H;32k/1024;Fre2EQU1CH;mi2EQU19H;fa2EQU18H;so2EQU15H;la2EQU13H;si2EQU11H;do3EQU10H;re3EQU0EH;;music freq lookup tableFreqLut DB siF; (00H)DB do0,re0,mi0,fa0,so0,la0,si0;(01H-07H)DB do1,re1,mi1,fa1,so1,la1,si1;(08H-0EH)DB do2;(0FH)DB re2,mi2,fa2,so2,la2,si2DB do3,re3;music display lookup tableTubeLut DB 61H;(00H)DB21H,0F4H,0F1H,39H,0D9H,0DDH,61H; (01H-07H)DB21H,0F4H,0F1H,39H,0D9H,0DDH,61H; (08H-0EH)DB21H;(0FH)DB0F4H,0F1H,39H,0D9H,0DDH,61HDB21H,0F4H,0F1H,39H,0D9H,0DDH,61H ;button matrixbuttonPressed DB0;0FFH for pressed,00H for not.buttonRow DB0buttonCol DB0buttonIndex DB0buttonEnable DW0000Hlab EQU1;1stand for Xue9,0stand for Jiao2IF lab;Xue9PortSw EQU0E8E0H;8255PortA EQU0E800HPortB EQU0E801HPortC EQU0E802HPortControl EQU0E803H;8253Timer0EQU0E820HTimer1EQU0E821HTimer2EQU0E822HTimerControl EQU0E823HELSE;Jiao2PortSw EQU0EEE0H;8255PortA EQU0EE00HPortB EQU0EE01HPortC EQU0EE02HPortControl EQU0EE03H;8253Timer0EQU0EE20HTimer1EQU0EE21HTimer2EQU0EE22HTimerControl EQU0EE23HENDIFNotes DB07H+5,07H+1,07H+2,07H+3,07H+4,07H+5, 07H+1,07H+1DB07H+6,07H+4,07H+5,07H+6,07H+7,0EH+1, 07H+1,07H+1DB07H+4,07H+5,07H+4,07H+3,07H+2,07H+3, 07H+4,07H+3,07H+2,07H+1DB00H+7,07H+1,07H+2,07H+3,07H+1,07H+2DB07H+5,07H+1,07H+2,07H+3,07H+4,07H+5, 07H+1,07H+1DB07H+6,07H+4,07H+5,07H+6,07H+7,0EH+1, 07H+1,07H+1DB07H+4,07H+5,07H+4,07H+3,07H+2,07H+3, 07H+4,07H+3,07H+2,07H+1DB07H+2,07H+3,07H+2,07H+1,00H+7,07H+1DB0EH+1,07H+7,07H+6,07H+7,07H+3,07H+3DB07H+6,00H+6,00H+7,07H+1,07H+2,07H+3, 07H+3,07H+2,07H+3DB07H+4,07H+5,07H+4,07H+3,07H+2,07H+3, 07H+4,07H+3,07H+2,07H+1DB07H+2,07H+3,07H+2,07H+1,07H+2,00H+7DB0EH+1,07H+7,07H+6,07H+7,07H+3,07H+3DB07H+6,00H+6,00H+7,07H+1,07H+2,07H+3, 07H+3,07H+2,07H+3DB07H+4,07H+5,07H+4,07H+3,07H+2,07H+3, 07H+4,07H+3,07H+2,07H+1DB07H+2,07H+3,07H+2,07H+1,00H+7,07H+1 LengthOfSong EQU$-NotesDuration DB4,2,2,2,2,4,4,4DB4,2,2,2,2,4,4,4DB4,2,2,2,2,4,2,2,2,2DB4,2,2,2,2,12DB4,2,2,2,2,4,4,4DB4,2,2,2,2,4,4,4DB4,2,2,2,2,4,2,2,2,2DB4,2,2,2,2,12DB4,4,4,4,4,4DB4,2,2,2,2,4,2,2,4DB4,2,2,2,2,4,2,2,2,2DB4,2,2,2,2,12DB4,4,4,4,4,4DB4,2,2,2,2,4,2,2,4DB4,2,2,2,2,4,2,2,2,2DB4,2,2,2,2,12Data ENDS;=============stack segment============= Stack SEGMENT STACK'STACK'DB100H DUP(?)Stack ENDS;=============code segment============= Code SEGMENTASSUME CS:Code,DS:Data,SS:StackMain PROC FARPUSH DSXOR AX,AXPUSH AXMOV AX,DataMOV DS,AXmyOut PortControl,80H;8255:10000000B means:;A--mode0,output;B--mode0,output;C High--output(it will change during running);C Low--output(it will change during running)myOut PortB,01H;show the left most digitCALL PlaymyOut PortB,00HRETMain ENDPPlay PROCPUSH SIXOR SI,SInextTune:CALL ShowTubeCALL PlayNoteCALL NoteDurationCALL PlayHushCALL HushDurationCALL CheckExitINC SICMP SI,LengthOfSongJB nextTunePOP SIRETPlay ENDPShowTube PROCPUSH AXPUSH BXPUSH SIMOV BX,OFFSET NotesMOV AX,SIXLAT NotesmyLutOut PortA,TubeLut,ALPOP SIPOP BXPOP AXRETShowTube ENDPPlayNote PROCPUSH AXPUSH BXPUSH SIMOV BX,OFFSET NotesMOV AX,SIXLAT NotesPUSH AXmyOut TimerControl,16HPOP AXmyLutOut Timer0,FreqLut,ALPOP SIPOP BXPOP AXRETPlayNote ENDPNoteDuration PROCPUSH AXPUSH BXPUSH CXPUSH SIMOV BX,OFFSET DurationMOV AX,SIXLAT DurationXOR AH,AH;useless instruct indeed,since high byte of SI is zeroMOV CX,0100HMUL CXSUB CX,10HnextSubNoteDelay:CALL BasicDelayDEC AXJNZ nextSubNoteDelayPOP SIPOP CXPOP BXPOP AXRETNoteDuration ENDPPlayHush PROCPUSH AXPUSH BXPUSH SImyOut TimerControl,16H;00:Timer0;01:Lower Byte only;011:Mode3;0:Binary CountingmyOut Timer0,1POP SIPOP BXPOP AXRETPlayHush ENDP HushDuration PROCPUSH AXPUSH BXPUSH CXPUSH SIMOV CX,10H nextSubHushDelay:CALL BasicDelayJNZ nextSubHushDelayPOP SIPOP CXPOP BXPOP AXRETHushDuration ENDP BasicDelay PROCPUSH CXMOV CX,0080H myLoopLabel:PUSH CXMOV CX,1000H myLoopLabel2:DEC CXJNZ myLoopLabel2POP CXDEC CXJNZ myLoopLabelPOP CXRETBasicDelay ENDPCheckExit PROCPUSH AXMOV AH,0BH;check whether user input something from keyboardINT21HOR AL,AL;if he does,then return to DosJZ exitCheckAndQuitmyOut PortA,00HmyOut PortB,00HCALL PlayHushMOV AX,4C00HINT21HexitCheckAndQuit:POP AXRETCheckExit ENDPCode ENDSEND Main;=============end of file=============经过测验,程序运行正常。
北京邮电大学实验报告题目:微机原理软件实验三班级: 2010211127专业:信息工程姓名:付莹学号:10210759实验五:中断实验1. 实验类设计型实验:编程实现时钟的显示。
2. 实验目的掌握计数器/定时器8253的工作原理和编程方法;掌握中断控制器8259的工作原理;掌握中断处理程序的编写。
3. 实验条件硬件条件:PC机一台。
软件条件:DOS操作系统;任意一种编辑程序,如EDIT;宏汇编程序MASM;连接程序LINK;调试程序DEBUG。
可借用该程序中的中断服务程序以及8253的初始化程序段(口地址为40H、41H、42H、43H,控制字为36H=00110110B,时间常数TC=11932:1.1932MHz/11932=100Hz,输出方波频率为100Hz,其周期为1000/100=10ms)。
4. 实验内容及步骤编一程序,在显示器上显示时、分、秒。
借用计数器8253的Timer0作为中断源,通过8259A向CPU发中断,每10ms产生一次中断。
在中断服务程序中管理刷新时、分、秒Current time is: xx:xx:xx (时分秒键盘输入)回车后时、分、秒开始计时,时钟不停的刷新。
当键入CTRL+C时,停止计时,返回系统,且系统正常运行不死机。
5. 实验报告(1)画出程序流程图。
开始等待回车键按下(08H 中断调用)取原8H 中断的中断矢量并压栈保护建立数据段的可寻址性 装载现在的中断服务程序8253初始化产生10ms 方波,10ms 中断一次重写IMR ,只开放时钟和键盘中断开中断监测键盘(06H 中断调用)是Ctrl+C ? 关中断 恢复IMR重置8253,,55ms 中断一次恢复原中断开中断返回DOS ,结束Yes有键按下?显示时间值(09H 中断调用)取消秒Yes 计数达到100次(1秒)?NoYesNoNo实现等待计时功能实现循环,秒值变化则返回继续执行程序显示“Current time is :” 读入键盘输入(2)提交调试好的汇编语言源程序(.asm)。
北邮微机原理实验报告一、实验目的本实验旨在通过对微机原理的实际操作,加深对计算机内部结构和工作原理的理解,并通过实验验证理论知识的正确性。
二、实验设备和材料•计算机硬件设备:PC机一台、示波器一台、数字信号发生器一台。
•软件工具:TASM、MASM汇编语言编译器。
三、实验内容本实验分为以下几个步骤:1. 准备工作•将PC机与示波器、数字信号发生器连接。
•打开PC机,进入实验环境。
2. 实验一:简单指令的执行•编写一个简单的汇编程序,实现两个数相加并将结果存储到指定寄存器中。
•使用TASM或MASM编译器对汇编程序进行编译,生成可执行文件。
•运行可执行文件,在示波器上观察到相加过程的波形。
3. 实验二:数据传输操作•编写一个汇编程序,实现数据在不同寄存器和内存之间的传输。
•编译并运行程序,通过观察PC机上的输出结果,验证数据传输的正确性。
4. 实验三:逻辑运算和移位操作•编写程序,实现逻辑运算和移位操作,并观察运算结果。
•通过数字信号发生器产生相应的输入信号,验证程序的正确性。
5. 实验四:中断处理•编写一个汇编程序,实现对中断请求的响应和处理。
•通过示波器观察中断请求和处理的波形,验证程序的正确性。
6. 实验五:串行通信操作•编写程序,实现串行通信的发送和接收操作。
•通过示波器观察串行通信的波形,验证程序的正确性。
四、实验结果和分析•对每个实验步骤进行记录,并详细分析实验结果。
•比较实验结果与理论预期是否一致,并给出原因分析。
五、实验心得通过本次实验,我深刻理解了微机原理的实际应用和操作过程。
通过实际操作,我对计算机内部结构和工作原理有了更深入的了解,并通过实验验证了理论知识的正确性。
同时,我也意识到在实际操作中的一些细节和注意事项,这对我今后的学习和工作都有很大的帮助。
六、实验总结通过本次实验,我不仅掌握了微机原理的实际应用技能,还深化了对计算机内部结构和工作原理的理解。
实验过程中,我遇到了一些问题,但通过思考和实践,逐步解决了这些问题,并取得了满意的实验结果。
本文部分内容来自网络整理,本司不为其真实性负责,如有异议或侵权请及时联系,本司将立即删除!== 本文为word格式,下载后可方便编辑和修改! ==北邮微机原理软件实验报告微机原理软件实验报告实验二分支,循环程序设计一、预习题:1.十进制数 0 -- 9 所对应的 ASCII 码是什么? 如何将十进制数 0 -- 9 在屏幕上显示出来?答:要屏显0-9的数码,可以调用02h中断,然后将要显示的数码的ASCII码存进DL里,然后执行INT 21H就可以打印字符。
当然,若不只一个数,调用09h中断(显示字符串)更好,但要将DS:DXZ指向要显示的数字在内存中的首地址,并要求以$结束。
2.如何检验一个数为正,为负或为零? 你能举出多少种不同的方法?答:CMP X,0 检验标志位CFCF=1,X为负数CF=0接着检验ZF:ZF=1,X为零,ZF=0,X为正数二、实验目的:1.开始独立进行汇编语言程序设计;2.掌握基本分支,循环程序设计;3.掌握最简单的 DOS 功能调用.三、实验内容:1.安排一个数据区,内存有若干个正数,负数和零.每类数的个数都不超过 9.2.编写一个程序统计数据区中正数,负数和零的个数.四、实验源代码assume cs:code,ds:datadata segmentbuff db 1,2,3,4,5,-1,-2,-3,0,0 ;安排的数据区string db '>0:'plus db 0db 0ah,0dhstring1 db '=0:'zero db 0db 0ah,0dhstring2 db '<0:'minus db 0db '$'data endscode segmentstart:movax,datamovds,axmov cx,10mov dx,0 mov ah,0 ;初始化,并将CX赋为10,因为共有10个数 ;用变量plus来存储正数的个数 ;用变量zero来存储零的个数 ;用变量minus来存储负数的个数 ;将计数器dx,ah初始化为0lea bx,buffcompare:cmp byte ptr [bx],0jgeplu inc ah jmp next ;取出一个数与0进行比较 ;大于等于0,跳至plu 执行 ;小于0,用ah暂存小于0的个数,ah+1 ;比完后进行下一个数的比较plu: je zer;等于0,跳至zer执行 inc dl jmp next zer: inc dh ;大于0,用dl暂存大于0的个数,dl+1 ;比完后进行下一个数的比较 ;等于0,用dh暂存等于0的个数,dh+1 ;将dl,dh,ah分别赋值给变量plus,zero,minus,其ASCII分别加next:incbx loop compare48add dl,48 movplus,dl add dh,48 movzero,dh add ah,48 movminus,ah mov ah,09h lea dx,string int 21h ;调用09h中断,将最终结果输出mov ax,4c00hint 21hcode ends否 end start实验截图六、实验总结及心得体会:这个实验有两个要点。
微机原理软件实验报告学院:信息与通信工程学院班级:2012211123班内序号:学生姓名:学号:实验二分支,循环程序设计一、实验目的1.开始独立进行汇编语言程序设计;2.掌握基本分支,循环程序设计;3.掌握最简单的DOS 功能调用.二、实验任务及内容1.安排一个数据区,内存有若干个正数,负数和零。
每类数的个数都不超过9。
2.编写一个程序统计数据区中正数,负数和零的个数。
3.将统计结果在屏幕上显示。
4.(扩展题)统计出正奇数、正偶数,负奇数、负偶数以及零的个数。
三、画出程序流程图Y四、给出源程序(要求加注释)data segmentbuff dw 1, 2, 0, 0 ,-1 ;数据段,初始化数据count equ $-buffplus db ? ;定义三种数的存储位置zero db ?minus db ?string1 db 'plus number:','$'string2 db 'zero number:','$'string3 db 'minus number:','$'data endsstack segment stack 'stack'db 100 dup(?)stack endscode segmentassume cs:code,ds:data,es:data,ss:stackbegin:mov ax,datamov ds,axmov cx,countshr cx,1mov dx,0mov ah,0lea bx,buffagain: cmp word ptr[bx],0 ;首先和0比较jge pluinc ah ;小于零MINUS+1jmp nextplu: jz zer ;判断是否等于零,等于零ZERO+1 inc dl ;不等于零PLUS+1jmp nextzer: inc dhnext: inc bx ;下一个数inc bxloop againadd dl,48mov plus,dladd dh,48mov zero,dhadd ah,48mov minus,ahshow:sub dx,dx ;显示模块mov dx,offset string1mov ax,0900h ;送显示指令int 21hmov dl,[plus]mov ax,0200hint 21hmov dl,0dhint 21hmov dl,0ahint 21hmov dx,offset string2mov ax,0900hint 21hmov dl,[zero]mov ax,0200hint 21hmov dl,0dhint 21hmov dl,0ahint 21hmov dx,offset string3mov ax,0900hint 21hmov ax,0200hmov dl,[minus]int 21hmov ax,4c00h ;结束程序int 21hcode endsend begin五、给出程序运行结果(运行结果抓屏保存)data segment 中存入1,2, 0, 0,-1显示有2个0、2个大于0的数、1个小于0的数,结果正确六、预习题1.十进制数0 -- 9 所对应的ASCII 码是什么? 如何将十进制数0 -9 在屏幕上显示出来? 答:对应的ASCII码是30H~39H,把0-9加上30H即可得到对应的ASCII,送给DL,再执行INT 21H即可显示。
北邮微机原理实验报告北邮微机原理实验报告引言:微机原理是计算机科学与技术专业的一门重要课程,通过学习和实践,我们可以深入了解计算机的组成结构和工作原理。
本次实验旨在通过对北邮微机原理实验的探索,加深对计算机硬件和软件的理解,并提升我们的实践能力。
一、实验目的本次实验的目的是熟悉计算机的硬件组成和工作原理,并通过实践操作加深对微机原理的理解。
具体包括以下几个方面:1. 熟悉计算机的硬件组成,包括中央处理器(CPU)、内存、硬盘等;2. 掌握计算机的启动过程和操作系统的加载;3. 理解计算机的指令集和指令执行过程;4. 学习计算机的输入输出设备和外部接口。
二、实验过程1. 实验一:计算机硬件的组装与连接在本实验中,我们需要将计算机的各个硬件组件进行正确的连接和组装。
首先,我们需要将主板与CPU、内存、显卡等硬件设备进行连接。
其次,我们需要将硬盘、光驱等存储设备与主板进行连接。
最后,我们需要将键盘、鼠标、显示器等外部设备与计算机进行连接。
通过这一步骤,我们可以了解计算机硬件的组成结构,并掌握正确的连接方式。
2. 实验二:计算机的启动过程和操作系统的加载在本实验中,我们需要了解计算机的启动过程和操作系统的加载过程。
首先,我们需要按下电源按钮,启动计算机。
然后,计算机会进行自检和硬件初始化,并加载操作系统。
在这个过程中,我们可以观察到计算机的启动画面和加载过程。
通过这一步骤,我们可以深入了解计算机的启动过程和操作系统的加载机制。
3. 实验三:计算机的指令集和指令执行过程在本实验中,我们需要学习计算机的指令集和指令执行过程。
首先,我们需要了解不同类型的指令,包括算术指令、逻辑指令、数据传输指令等。
然后,我们需要通过编写简单的汇编语言程序,来实现对数据的处理和操作。
在这个过程中,我们可以观察到指令的执行过程和结果。
通过这一步骤,我们可以深入理解计算机的指令集和指令执行过程。
4. 实验四:计算机的输入输出设备和外部接口在本实验中,我们需要学习计算机的输入输出设备和外部接口。
实验38255A并行口实验(一)一、实验目的1.了解实验箱的组成及实验系统软件的使用。
2.掌握8255A的工作方式、编程原理和与微机的接口方法。
二、实验内容用8255PA口控制PB口。
三、实验接线图四、编程指南⒈8255A芯片简介: 8255A可编程外围接口芯片是INTEL公司生产的通用并行接口芯片,它具有A、B、C三个并行接口,用+5V单电源供电,能在以下三种方式下工作:方式0:基本输入/ 输出方式方式l:选通输入/ 输出方式方式2:双向选通工作方式⒉使8255A端口A工作在方式0并作为输入口,读取Kl-K8个开关量,PB 口工作在方式0作为输出口。
8255端口地址见第一章表“I/O地址分配(二)”五、实验程序框图六、实验步骤1 8255A芯片A口的PA0-PA7依次和开关量输入Kl-K8相连。
2 8255A芯片B口的PB0-PB7依次接Ll-L8。
3 运行实验程序。
七、思考题1 由8255PA口接发光二极管,PB口接开关,该如何编程?CODE SEGMENTASSUME CS:CODEORG 1000HSTART:JMP STARTOPA EQU 0FF28HPB EQU 0FF29HCTL EQU 0FF2BHSTARTO:MOV DX,0FF2BHMOV AL,10000010BOUT DX,ALTEST_IT:MOV DX,0FF29HIN AL,DXMOV DX,0FF28HOUT DX,ALJMP TEST_ITCODE ENDSEND START2 由8255控制发光二极管顺序循环点亮,即“流水灯”过程,该如何编程?3 利用8255在方式0下工作,令其在PB1和PB2产生如图所示的波形,试编程实现。
(将图中的延时时间单位为ms的地方均改为s)CODE SEGMENTASSUME CS:CODEORG 1000HSTART:JMP STARTOPA EQU 0FF28HPB EQU 0FF29HCTL EQU 0FF2BHSTARTO:MOV DX,0FF2BHMOV AL,10010000BOUT DX,ALTEST_IT:MOV DX,0FF28HIN AL,DXMOV DX,0FF29HOUT DX,ALJMP TEST_ITCODE ENDSEND STARTCODE SEGMENT ASSUME CS:CODEORG 1000H START:JMP STARTO PA EQU 0FF28HPB EQU 0FF29H CTL EQU 0FF2BHSTARTO: MOV DX,0FF2BHMOV AL,10010000BOUT DX,ALMOV AL,11111110B MOV DX,0FF29H TEST_IT: OUT DX,AL DELAY:MOV CX,60000LP2:PUSHFPOPFLOOP LP2ROL AL,1JMP TEST_ITCODE ENDSEND START。
北京邮电大学微机原理软件实验·第三次实验题目一:一、实验目的1、初步掌握中断程序的设计方法;2、初步掌握修改DOS 系统中断,以适应实际使用的方法。
二、实验内容编一程序,在显示器上显示时、分、秒。
借用计数器8253的Timer0作为中断源,通过8259A向CPU发中断,每10ms产生一次中断。
在中断服务程序中管理刷新时、分、秒。
要求:1、输入文件名(如:CLK)后清屏后显示:2、Current time is: xx:xx:xx(时分秒键盘输入)3、打回车,时、分、秒开始计时。
时钟不停的刷新。
4、当键入CTRL+C时,停止计时,返回系统,且系统正常运行不死机。
提示:8253的初始化程序段可借用。
口地址为40H、41H、42H、43H,控制字为36H=00110110B,时间常数TC=11932:1.1932MHz/11932=100Hz,输出方波频率为100Hz,其周期为1000/100=10ms。
三、设计思路1、程序流程图开始定义数据段和堆栈段保存源中断向量将timer子程序地址设置为中断向量设置8253工作状态,使其输出方波100Hz设置8259A工作状态输出一条提示信息,要求用户设定时间判断设定时间是否符合规范否输出一条错误信息是显示字符串:“Nowthe time is:”判断内存中的时间是否被修改是重新在屏幕上打印时间否判断键盘缓冲区有无按键按下回车是否按下是秒表功能否判断“S”是否按下是否判断Ctrl+C是否按下是退出程序否2、中断子程序流程图子程序开始记下进入中断的次数判断次数是否为100是计数清零,修改内存中存储的时间查看是否否有进位进位调整结束3、可能用到的指令①STI 置中断允许位.CLI 清中断允许位.格式:CLI STI功能:开关中断允许标志,用于在程序中防止中断嵌套,设置中断。
②STOS(STOre into String) 存入串指令格式:STOS DSTSTOSB //存放字节串( DI ) = ALSTOSW //存放字串( DI ) = AX执行操作:把AL或AX中的内容存放由DI指定的附加段的字节或字单元中,并根据DF值修改及数据类型修改DI的内容。
字节操作:((DT))←(AL),(DI)←(DI)±1字操作:((DI))←(AX),(DI)←(DI)±2无条件转移指令③IN输入指令长格式为:IN AL,PORT(字节)IN AX,PORT(字)执行的操作:(AL)<-(PORT)(字节)(AX)<-(wPORT+1,PORT)(字)短格式为:IN AL,DX(字节)IN AX,DX(字)④OUT输出指令长格式为:OUT PORT,AL(字节)OUT PORT,AX(字)执行的操作:(PORT)<-(AL)(字节)(PORT+1,PORT)<-(AX)(字)短格式为:OUT DX,AL(字节)OUT DX,AX(字)执行的操作:((DX))<-(AL)(字节)((DX)+1,(DX))<-AX(字)⑤设置中断向量格式:mov al,8mov ah,25hint 21hDS:DX=中断向量AL=中断类型号⑥查看中断向量格式:mov al,8mov ah,35hAL=中断类型ES:BX=中断向量4、计数器芯片8253简介①初始化使用8253前,要进行初始化编程。
初始化编程的步骤是:A向控制寄存器端口写入控制字对使用的计数器规定其使用方式等。
B 向使用的计数器端口写入计数初值。
②8253控制字D7D6=00:使用0号计数器,D7D6=01:使用1号计数器D7D6=10:使用2号计数器,D7D6=11:无效D5D4=00:锁存当前计数值D5D4=01:只写低8位(高8位为0),读出时只读低8位D5D4=10:只写高8位(低8位为0),读出时只读高8位D5D4=11:先读/写低8位,后读/写高8位计数值D3D2D1=000:选择方式0,D3D2D1=001:选择方式1D3D2D1=X10:选择方式2,D3D2D1=X11:选择方式3D3D2D1=100:选择方式4,D3D2D1=101:选择方式5D0=0:计数初值为二进制,D0=1:计数初值为BCD码数四、源程序data segmentcount100 db 100;100个10ms=1s,此处count100起计数作用msg1 db 'Please enter the currenttime(XX:XX:XX)!(Press ENTER to use default time)$' msg2 db 'Sorry,your date enteredincorrectly ,please try again!$'msg3 db 'Now, the time is:',0ah,'(Press Ctrl+C to EXIT.)',0ah,'(Press Enter to use as a Stopwatch.)',0ah,'(Press S or s to set current time again.)(XX:XX:XX)$'msg4 db 0ah,'Program EXIT normally.$'tenhour db '0';小时十位数hour db '0',':';小时个位数tenmin db '0';分钟十位数minute db '0',':' ;分钟个位数tensec db '0';秒十位数second db '0’;秒个位数data endsstack segment stack 'stack'db 256 dup(0)stack endscode segmentassume cs:code,ds:data,es:datastart: mov ax,seg datamov es,axmov ds,axcli ;使中断标志IF=0mov al,8;保存源中断向量mov ah,35hint 21hpush espush bx mov ax,0mov es,ax; es置零,这是准备中断向量的写入mov di,20hmov ax,offset timer;中断子程序timer的偏移量stows;字符串填充,将AX的内容;(timer偏移量)存入di所指向的单元,;di的增减取决于DF,默认段基址总是ES mov ax,csstosw;timer端基址mov al,36hout 43h,a;设置8253控制字为36Hmov bx,11932;分频系数为11932,分频结;果1.1932MHz/11932=100Hz,10ms变化一次mov al,bl;分两次设置分频系数out 40h,almov al,bhout 40h,almov al,0fch;主PIC端口设置为0fchout 21h,alsti;开中断,允许外部中断mov ax,seg datamov es,axmov ds,axmov dx,offset msg1;打印提示信息1mov ah,09hint 21hmov dl,0ahmov ah,02hint 21hsettime:mov si,offset tenhour;设定时间mov ah,01hint 21hcmp al,0dhjz forever1cmp al,'0'jc error2 ;如果输入不合法,报错cmp al,'3'jnc error2mov [si],alinc sicmp al,'2'jz ershimov ah,01h;如果小时高位为1,;低位可以设置0~9int 21hcmp al,0dhjz forever1cmp al,'0'jc error2cmp al,'9'+1jnc error2mov [si],alinc sijmp fenershi: m ov ah,01h;如果小时高位为2,低位可以设置0~4 int 21hcmp al,0dhjz forever1cmp al,'0'jc error2cmp al,'4'jnc error2mov [si],alinc sijmp fenfen: mov ah,01h;分高位可设置0~5int 21hcmp al,0dhjz forever1cmp al,':'jnz error1mov [si],alinc simov ah,01hint 21hcmp al,0dhjz forever1cmp al,'0'jc error1cmp al,'6'jnc error1mov [si],alinc si zcy4: mov ah,01h ;分低位0~9int 21hcmp al,0dhjz forever1cmp al,'0'jc error1cmp al,'9'+1jnc error1mov [si],alinc sijmp zcysettime2:jmp settime;用来跳转接力error2: jmp error1forever1:jmp next2zcy: mov ah,01h;秒高位可设置0~5int 21hcmp al,0dhjz forever1cmp al,':'jnz error1mov [si],alinc simov ah,01hint 21hcmp al,0dhjz forever1cmp al,'0'jc error1cmp al,'6'jnc error1mov [si],alinc simov ah,01h;秒低位可设置0~9int 21hcmp al,0dhjz forever1cmp al,'0'jc error1cmp al,'9'+1jnc error1mov [si],alinc sijmp next2error1: mov dl,0ah;用来报错:设置时间不合法mov ah,02hint 21hmov dx,offset msg2;打印提示信息2mov ah,09hint 21hmov dl,0ahmov ah,02hint 21hjmp settimesettime3: jmp settime2;跳转接力next2: MOV AX,0003H;做时钟显示初始化INT 10H;清屏显示mov dl,0ahmov ah,02hint 21hmov dx,offset msg3;打印提示信息3mov ah,09hint 21hmov dl,0ahmov ah,02hint 21hforever:mov bx,offset tenhour;这个程序段循环执行mov cx,8cmp tenhour,'2';如果超过24点,置为0点jnz dispclkcmp hour,'4'jnz dispclkmov tenhour,'0'mov hour,'0'dispclk:mov dl,[bx];用来显示当前时间call dispcharinc bxloop dispclk;调用显示子程序,显示初始状态时间,;比如”11:11:11"mov dl,0dh;输出一个换行call dispcharxor al,al ;读键盘缓冲区mov ah,0bhint 21hcmp al,0FFHjnz next3mov ah,08h;取其字符int 21hcmp al,03h;Ctrl+C退出jz stopcmp al,'s';S/s设定时间jz settime3cmp al,'S'jz settime3cmp al,0dhjnz next3mov dl,0ah;回车则使用秒表功能mov ah,02hint 21hjmp forevernext3: mov al,secondnext: cmp al,second;判断second是否发生变化je next;如果没有,循环比较jmp forever;如果有变化,刷新输出stop: mov dx,offset msg4;打印提示信息4 mov ah,09hint 21hmov dl,0ahmov ah,02hint 21hpop dx;恢复中断向量pop dsmov al,8mov ah,25hint 21hmov ah,4chint 21htimer proc far;中断程序timerpush axdec count100;计数100次jnz timerx;如果计数小于100,跳出中断mov count100,100;否则重置count100<=100;1s已经到达inc second;加一秒cmp second,'9';判断大小,用于进位,以下原理相同jle timerxmov second,'0'inc tenseccmp tensec,'6'jl timerxmov tensec,'0'inc minutecmp minute,'9'jle timerxmov minute,'0'inc tenmincmp tenmin,'6'jl timerxmov tenmin,'0'inc hourcmp hour,'9'ja adjhourcmp hour,'3'jnz timerxcmp tenhour,'1'jnz timerxmov hour,'1'mov tenhour,'0'jmp short timerx ;段内短转移adjhour:inc tenhourmov hour,'0'timerx: mov al,20hout 20h,al;主PIC口地址pop ax;出栈恢复iret;中断返回timer endpdispchar proc near;显示子函数push bxmov bx,0mov ah,02hint 21h ;DOS功能调用,输出DL内容pop bxretdispchar endpcode endsend start五、实验结果(反色)这幅图是运行程序之后,设定时间,输入的时间不合法的截图。