北邮微机原理中断程序报告

合集下载

北京邮电大学微机原理软件实验报告

北京邮电大学微机原理软件实验报告

信息与通信工程学院微机原理软件实验报告班级:姓名:学号:班内序号:时间:微机原理软件实验·报告实验一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 命令作单步跟踪调试。

比较每条指令执行后的结果和原来的理解是否一致,得出程序运行的结果:它们是写在什么单元,具体内容是什么;并判断结果是否正确。

微机中断服务实验报告

微机中断服务实验报告

实验三中断服务实验一、实验目的熟练掌握使用DEBUG命令动态调试程序熟练掌握中断的概念、中断响应过程掌握中断服务程序的设计方法二、实验原理1.内部中断服务程序,利用中断向量表获取中断服务程序入口地址,进而控制转移到中断服务程序中2.对于向量号为n的中断服务程序的入口地址要从物理地址=n×4取得3.外部可屏蔽中断用于实现微处理器与外设交换信息。

三、实验内容(1)内部中断服务程序编写29H号中断服务程序,使其具有显示以“0”结尾字符串的功能(利用显示器功能调用INT 10H)。

字符串缓冲区首地址为入口参数,利用DS:DX(段基地址:偏移地址)传递。

程序代码:.model small.stack.dataintoff dw ? ;用于保存原中断服务程序的偏移地址intseg dw ? ; 用于保存原中断服务程序的段基地址intmsg db '2011080331229 ll',0dh,0ah,0;字符串. codestart: mov ax,@datamov ds,axmov ax,3529h ;获取系统的原29H中断服务程序入口地址int 21hmov intoff,bx ;保存偏移地址mov intseg,es ;保存段基地址push dsmov dx,offset ll29hmov ax,seg ll29hmov ds,axmov ax,2529h ;设置本程序29H中断服务程序的入口地址int 21hpop ds;mov dx,offset intmsg ;设置入口参数int 29h ;调用29H中断服务程序,显示字符串;mov dx,intoff ;恢复系统的原29H中断服务程序入口地址mov ax,intsegmov ds,axmov ax,2529hint 21hmov ax,4c00hint 21h ;主程序返回;ll29h proc ;过程定义sti ;开中断push ax ;保护寄存器push bxpush simov si,dxll1: mov al,[si] ;获取预显示字符cmp al,0 ;为0结束jz ll2mov bx,0mov ah,0ehint 10hinc si ;显示下一个字符jmp ll1ll2: pop si ;恢复寄存器pop bxpop axiret ;中断返回ll29h endp;中断服务程序结束;end start程序截图;(2)可屏蔽中断服务程序8259A的IRQ0(向量号为09H)的中断请求来自键盘,本程序新的09H中断服务程序,使得每次中断显示一串信息,显示10次后,恢复原中断服务程序,返回DOS.程序代码:.model small.stack.dataintmsg db 'A Instrucetion Interrupt !',0dh,0ah,0counter db 0 ;中断次数记录.codestart: mov ax,@datamov ds,axmov ax,3509h;获取原中断服务程序的入口地址int 21hpush es;保存原中断服务程序的入口地址push bxcli;关中断push ds;设置新中断服务程序的入口地址mov ax,seg new09hmov ds,axmov dx,offset new09hmov ax,2509hint 21hpop dsin al,21h;读出IMRpush ax;保存原IMR内容and al,0feh;允许IRQ0,其他内容不变out 21h,al;设置新IMR 内容mov counter,0;设置中断次数初值sti;开中断start1: cmp counter,10jb start1;中断10次退出;Cli;关中断pop ax;恢复IMRout 21h,alpop dxpop ds;恢复原中断服务程序人口地址mov ax,2508hint 21hsti;开中断mov ax,4c00h;返回DOSint 21h;主程序结束;new08h proc;中断服务程序sti;开中断push axpush dsmov ax,@data;外部随机产生中断mov ds,axinc counter;中断次数加一mov si,offset intmsg;显示信息call dpstrimov al,20hout 20h,alpop ds;恢复寄存器pop bxpop ax;iret;中断返回new08h endpdpstri proc;显示字符串程序push ax;入口参数push bxdps1: lodsbcmp al,0jz dps2mov bx,0;调用ROM-BIOS功能显示AL中的字符mov ah,0ehint 10hjmp dps1dps2: pop bxpop axretdpstri endp;end start程序截图;。

北邮微机原理软件实验报告(精)

北邮微机原理软件实验报告(精)

北邮微机原理软件实验报告(精)微机原理软件实验报告实验二分支、循环程序设计一.实验目的1.启动独立的汇编语言编程。

2.掌握基本分支和循环编程。

3.掌握最简单的DOS函数调用。

二、实验内容1.安排一个数据区,内存有若干个正数,负数和零。

每类数的个数都不超过9。

2.编写一个程序统计数据区中正数,负数和零的个数。

3.将统计结果在屏幕上显示。

三.流程图IV源代码datasegmentzdw0;数据adw0中的零数;大于0 bdw0的数据数;数据中小于0的数量numdw9,8,0,-7,6,-5,-4,3,2,-1,0,-8,-1,9,0,0,1;设定的一组数据,其中4个0,7个正数,6个负数,符合题目要求NDW($-num/2);此组中的数据数量为类型0DB0DH,0ah,‘零的数量:$’类型1DB0DH,0ah,‘格雷特的数量:$'type2db0dh,0ah,'numberoflessthan0:$'locatedwtype0,type1,type2dataendsstacksegmentstackdw128dup(?stackendscodesegmentassumeds:data,ss:stack,cs:codestart:movax,datamovds,axmovax,stack莫夫斯,斧头;初始化DS和Ss以指向stamovbx,offsetnum;将num中第一个数字的地址送入bxmovcx,n;将n中数字个数送入cxloop1:movax[bx];取出num中的第一个数字cmpax,0;与零相比jzifz;判断结果为是0,跳转到ifz处继续执行salax,1jcifl;如果判断结果小于0,跳转到IFLincwordptra;否则,a自加,然后继续执行程序jmpcontinueifl:incwordptrb;B计数加上1jmpcontinueifz:incz;Z计数加1继续:addbx,2;指针+2,继续送入下一数字looploop1;循环cx次判断movcx,3;共显示3个字符串xorbx,bxdisp:movdx,定位[bx]movah,09h;dos09号功能调用,显示字符串int21hmovdx,z[bx]adddx,'0';转换为ASCII码movah,02h;dos02号功能调用,显示字符int21haddbx,2;指针+2(DW)loopdispmovax,4c00hint21h;返回dos系统codeendsendstart五.运行结果Vi预览问题1.十进制数0--9所对应的ascii码是什么?如何将十进制数0--9在屏幕上显示出来?。

中断程序实验报告

中断程序实验报告

一、实验目的1. 理解中断程序的基本概念和作用。

2. 掌握中断程序的编写方法。

3. 通过实验加深对中断程序在实际应用中的理解。

二、实验环境1. 操作系统:Windows 102. 编译器:Visual Studio 20193. 芯片:Intel Core i5三、实验内容1. 编写一个简单的中断程序,实现按下键盘任意键后,屏幕显示“中断发生”。

2. 编写一个中断程序,实现定时中断,每秒显示一次当前时间。

四、实验步骤1. 编写中断程序首先,我们需要编写一个中断程序,用于实现按下键盘任意键后,屏幕显示“中断发生”。

```c#include <stdio.h>#include <conio.h>#include <dos.h>void interrupt_handler() {printf("中断发生\n");while(1); // 无限循环,防止中断程序执行完毕后退出}int main() {int intr_no = 1; // 中断号int flag = interrupt(intr_no, interrupt_handler); // 注册中断if (flag != 0) {printf("注册中断失败\n");return 1;}printf("等待按键...\n");while(1) {if (kbhit()) { // 判断是否有按键按下break;}}printf("程序结束\n");return 0;}```在上述代码中,我们首先包含了必要的头文件,并定义了一个中断处理函数`interrupt_handler`,该函数负责打印“中断发生”信息。

然后,我们使用`interrupt`函数注册了中断,中断号为1,即键盘中断。

在主函数中,我们等待用户按下任意键,当按键按下后,中断处理函数会被调用。

(完整版)北航微机原理实验报告

(完整版)北航微机原理实验报告

微计算机原理及运用实验报告目录实验一:I/O地址译码实验 (4)一、实验目的 (4)二、实验原理和内容 (4)三、实验程序 (4)四.实验总结 (5)实验二:8255并行接口实验 (6)一、实验目的 (6)二、实验原理和内容 (6)三、程序框图 (7)四.实验程序 (7)五.实验总结 (8)实验三:键盘显示控制实验 (9)一、实验目的 (9)二、实验内容及原理 (9)三、流程图 (10)四.程序 (10)五.实验总结 (13)实验四:8254定时器/计数器实验 (14)一、实验目的 (14)二、实验原理和内容 (14)三、实验程序 (14)四.实验总结 (15)实验五:继电器控制实验 (16)一、实验目的 (16)二、实验原理和内容 (16)三、实验中使用的程序 (16)四.实验总结 (18)实验六:DMA传送 (18)一、实验目的 (18)二、实验原理和内容 (18)三、程序 (19)四.实验总结 (20)实验七:8259 中断控制实验 (20)一、实验目的 (20)二、实验原理和内容 (21)三、流程图 (21)四.程序 (21)五.实验总结 (25)实验八:8255中断实验 (25)一、实验目的 (25)二、实验原理和内容 (25)三.实验程序 (26)四.实验总结 (27)实验一:I/O地址译码实验一、实验目的掌握I/O地址译码电路的工作原理。

二、实验原理和内容实验电路如附图1所示,其中74LS74为D触发器,可直接使用实验台上数字电路实验区的D触发器,74LS138为地址译码器。

译码输出端Y0~Y7在实验台上“I/O地址“输出端引出,每个输出端包含8个地址,Y0:280H~287H,Y1:288H~28FH,……当CPU执行I/O指令且地址在280H~2BFH范围内,译码器选中,必有一根译码线输出负脉冲。

附图1 I/O地址译码电路利用这个负脉冲控制L7闪烁发光(亮、灭、亮、灭、……),时间间隔通过软件延时实现。

中断程序实验报告

中断程序实验报告

中断程序实验报告
《中断程序实验报告》
实验目的:通过编写中断程序,掌握中断处理的基本原理和方法。

实验设备:个人电脑、汇编语言编译器
实验步骤:
1. 编写中断服务程序
2. 将中断服务程序与中断向量表关联
3. 测试中断程序的功能和效果
实验结果:
通过编写中断服务程序,我们成功掌握了中断处理的基本原理和方法。

在实验中,我们编写了一个简单的中断服务程序,然后将其与中断向量表进行了关联。

在测试中,我们发现当特定的中断事件发生时,中断服务程序能够正确地被调用,并且能够完成预期的功能。

这表明我们的中断程序编写是成功的。

实验结论:
通过这次实验,我们深入了解了中断处理的原理和方法,掌握了中断程序的编
写和调用过程。

中断程序的编写是计算机系统中非常重要的一部分,它能够提
高系统的响应速度和处理效率,使系统能够更好地处理各种外部事件和异常情况。

因此,我们将继续学习和探索中断处理的更多知识,为今后的系统开发和
优化打下坚实的基础。

总结:
通过本次实验,我们对中断程序的编写和调用有了更深入的了解,掌握了中断
处理的基本原理和方法。

这将为我们今后的学习和工作提供重要的帮助,使我
们能够更好地理解和应用中断处理的知识。

希望通过不断的学习和实践,我们
能够进一步提高自己的编程能力,为计算机系统的发展和优化做出更大的贡献。

嵌入式技术及应用实验中断实验报告

嵌入式技术及应用实验中断实验报告

实验步骤与结果分析1、建立工程1)、在工程文件中包含如下文件(int、doc、user、lib、start)2)、选择STM32F103VB芯片3)、分别添加如下文件2、运行过程(1) 使用Keil uVision3 通过ULINK仿真器连接EduKit-M3实验平台,打开实验例程NVIC_test子目录下的NVIC.Uv2例程,编译链接工程;(2) 点击MDK 的Debug菜单,选择Start/Stop Debug Session项或Ctrl+F5键,远程连接EduKit-M3实验平台并下载调试代码到目标系统的RAM中;(3) 程序正常启动运行后,会有以下结果:当第一次发生EXTI9 中断后(按下EduKit-M3实验平台上Key按钮),SysTick 中断的优先级比EXTI0中断优先级高。

因此当EXTI0中断发生时(按下Wakeup按钮),将先执行主要程序代码分析/* Configure one bit for preemption priority */NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);主从优先级的选择Group_1,有先占优先级1位,从优先级3位//配置一个比特为抢占优先级/* Enable the EXTI0 Interrupt */ //使能EXTI0中断NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = PreemptionPriorityValue;主优先级的选择PreemptionPriorityValueNVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//从优先级等于0.NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);/* Enable the EXTI9_5 Interrupt */ //使能EXTI9_5中断NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//EXTI9_5主优先级的选择等于0NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//EXTI9_5主优先级的选择等于0NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);/* Configure the SysTick Handler Priority: Preemption priority and sub priority */ //配置SysTick处理程序优先级:抢占优先级和子优先级NVIC_SystemHandlerPriorityConfig(SystemHandler_SysTick, !PreemptionPriorityValue, 0);while (1){if(PreemptionOccured != FALSE)//当PreemptionOccured != FALSE)抢占发生{GPIO_WriteBit(GPIOC, GPIO_Pin_6, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_6)));Delay(0x5FFFF);GPIO_WriteBit(GPIOC, GPIO_Pin_7, (BitAction)(1 -GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_7)));Delay(0x5FFFF);GPIO_WriteBit(GPIOC, GPIO_Pin_8, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_8)));Delay(0x5FFFF);GPIO_WriteBit(GPIOC, GPIO_Pin_9, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_9)));Delay(0x5FFFF);}}void GPIO_Configuration(void){/* Configure PC6, PC7, PC8 and PC9 as output push-pull */ 使能为推挽输出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //使能其速度为50MHz GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //使能为推挽输出GPIO_Init(GPIOC, &GPIO_InitStructure);/* Configure GPIOA Pin0 as input floating */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 使能为浮空输入GPIO_Init(GPIOA, &GPIO_InitStructure);/* Configure GPIOB Pin9 as input floating */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 使能为推挽输出入GPIO_Init(GPIOB, &GPIO_InitStructure);}GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);/* Configure EXTI Line0 to generate an interrupt on falling edge */ 配置EXTI Line0产生一个中断在下降沿EXTI_InitStructure.EXTI_Line = EXTI_Line0;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);(写不完时,可调整表结构。

北邮微机原理软件实验报告

北邮微机原理软件实验报告

微机原理软件实验报告实验二分支、循环程序设计一.实验目的1.开始独立进行汇编语言程序设计。

2.掌握基本分支,循环程序设计。

3.掌握最简单的DOS 功能调用。

二.实验内容1.安排一个数据区,内存有若干个正数,负数和零。

每类数的个数都不超过9。

2.编写一个程序统计数据区中正数,负数和零的个数。

3.将统计结果在屏幕上显示。

三.流程图四.源代码DATA SEGMENTZ DW 0 ;数据中0的个数A DW 0 ;数据中大于0的个数B DW 0 ;数据中小于0的个数NUM DW 9,8,0,-7,6,-5,-4,3,2,-1,0,-8,-1,9,0,0,1 ;设定的一组数据,其中4个0,7个正数,6个负数,符合题目要求N DW ($-NUM)/2 ;该组数据的个数TYPE0 DB 0DH, 0AH, 'Number of zeros : $'TYPE1 DB 0DH, 0AH, 'Number of greater than 0 : $'TYPE2 DB 0DH, 0AH, 'Number of less than 0 : $'LOCATE DW TYPE0, TYPE1, TYPE2DATA ENDSSTACK SEGMENT STACKDW 128 DUP(?)STACK ENDSCODE SEGMENTASSUME DS:DATA, SS:STACK, CS:CODESTART: MOV AX, DATAMOV DS, AXMOV AX, STACKMOV SS, AX ;初始化DS、SS指向STAMOV BX, OFFSET NUM ;将NUM中第一个数字的地址送入BXMOV CX, N ;将N中数字个数送入CXLOOP1: MOV AX, [BX] ;取出NUM中的第一个数字CMP AX, 0 ;与零相比JZ IFZ ;判断结果为是0,跳转到IFZ处继续执行SAL AX, 1JC IFL ;判断结果是小于0,跳转到IFLINC WORD PTR A ;否则,A自加,然后继续执行程序JMP C ONTINUEIFL: INC WORD PTR B ;B计数加1JMP C ONTINUEIFZ: INC Z ;Z计数加1CONTINUE:ADD BX, 2 ;指针+2,继续送入下一数字LOOP LOOP1 ;循环CX次判断MOV CX, 3 ;共显示3个字符串XOR BX, BXDISP:MOV DX, LOCATE[BX]MOV AH, 09H ;DOS 09号功能调用,显示字符串INT 21HMOV DX, Z[BX]ADD DX, '0' ;转换为ASCII码MOV AH, 02H ;DOS 02号功能调用,显示字符INT 21HADD BX, 2 ;指针+2(DW)LOOP DISPMOV AX, 4C00HINT 21H ;返回DOS系统CODE ENDSEND START五.运行结果六.预习题1.十进制数0 -- 9 所对应的ASCII 码是什么? 如何将十进制数0 -- 9 在屏幕上显示出来?答:0—9的ASCII码值依次为:30H,31H,32H,33H,34H,35H,36H,37H,38H,39H。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

北京邮电大学实验报告题目:微机原理软件实验学院:信息与通信工程专业:信息工程______中断实验报告一、实验目的1、初步掌握中断程序的设计方法;2、初步掌握修改 DOS 系统中断,以适应实际使用的方法。

二:实验要求编一程序,在显示器上显示时、分、秒。

1:借用计数器8253的Timer0作为中断源,通过8259A下向CPU发中断,每10ms 产生一次中断。

2:在中断服务程序中管理刷新时、分、秒。

3:输入文件名(如:CLK)后清屏显示Current time is XX:XX:XX(时分秒键盘输入)打回车,时、分、秒开始计时,时钟不停的刷新。

4:当键入CTRL+C时,停止计时,返回系统,且系统正常运行不死机。

提示:1、8253的初始化程序段可借用。

2、口地址为40H、41H、42H、43H,控制字为36H=00110110B3、时间常数TC=11932:1.1932MHz/11932=100Hz,输出方波频率为100Hz,其周期为1000/100=10ms三:设计思路这个实验需要用到中断控制器8259A和计数器8253。

我们先初始化8253的工作方式,利用工作方式3来计数时间,让其分频后产生100hz的方波,每100个周期即为1s,将这个方波作为中断源,通过8259A每10ms向CPU发出一次中断。

然后我们将子程序Timer0的地址(CS以及IP)设置为中断向量,每次中断即执行这个子程序,在这个之程序中编写相应代码,看时间是否到1S,没到则跳出中断,等待下一次(1ms之后)中断到来,到1S则让时间+1并且重置计数值,再加上相应的时间显示程序,这样即可实现时间的自动增加与显示,可以当做一个计时器来用,这即是这个工程的主体部分。

除此之外,还需要一部分程序来实现键盘输入相应时间,这里要注意时间的每一位都有取值方面的要求,这里就要通过一系列的CMP/JMP指令的组合来达到正确输入的效果,将顺序输入的时间存储起来,配合Timer0子程序即可输出当前设置的时间并且实现时间刷新。

当然,如果选择不输入时间直接回车的话,程序可以从0开始计时,可以当成一个秒表。

还有一些细节的设计如在计时过程中输入S可以重新设置时间,Ctrl+C可以退出这些也是利用CMP/JMP组合来实现。

最后整个程序可以实现以下功能:可以设置开始时间然后自动计时,也可以当做秒表来使用,可以正常退出。

四:实验流程否是是否是否否是中断流程:否是否五:实验结果执行程序,输入格式不对时有错误提示:直接按回车,清屏后进入秒表计时模式:按下S后重新设置时间为12:34:10后开始计时:计时时按回车可以保存当前时间:利用ctrl+c退出:六:实验总结这次综合实验是很有难度的,它不仅需要对汇编语言有一定层次的了解,还需要对8259A与8253这两个硬件的工作方式很熟悉。

通过不断的查找资料,参考学习,我终于完成了这次实验,在这个过程中我经历了许多也学习到了许多。

首先得到提升的是我的debug能力,编的越多能力也就越强。

除此之外,我对课本上学习到的微机原理有了更直观与深层次的了解,这对我使用计算机以及今后的学习都是非常有帮助的,最后,感谢这次实验给我带来的宝贵的经历。

附录(源代码与子程序清单)data segmentcount100 db 100 ;100个10ms=1s,此处起计数作用msg1 db 'Please enter the current time(XX:XX:XX)!(Press ENTER to use default time)$'msg2 db 'Input Error,please use the correct format!$'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.$'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: movax,seg datamoves,axmovds,axcli ;置中断标志IF=0mov al,8 ;保存源中断向量,8中断为定时器mov ah,35h ;取中断向量,al为中断类型,ES:BX为中断向量int 21hpush bxmov ax,0moves,ax ; es置零,这是准备中断向量的写入mov di,20hmovax,offset Timer0 ;中断子程序timer的偏移量stosw ;字符串填充,将AX的内容;(timer偏移量)存入di所指向的单元,;di的增减取决于DF,默认段基址总是ES movax,csstosw ;timer端基址mov al,36hout 43h,al ;设置8253控制字为36Hmov bx,11932 ;分频系数为11932,分频结果1.1932MHz/11932=100Hz,10ms 变化一次moval,bl ;分两次设置分频系数out 40h,almoval,bhout 40h,almov al,0fch ;主PIC端口设置为0fchout 21h,alsti ;开中断,允许外部中断movax,seg datamoves,axmovds,axmovdx,offset msg1 ;打印提示信息1mov ah,09hint 21hmov dl,0ah ;回车mov ah,02hint 21hsettime:movsi,offsettenhour ;设定时间mov ah,01hint 21hcmp al,0dhjz forever1jc error2 ;如果输入不合法,报错cmp al,'3'jnc error2mov [si],alincsicmp al,'2'jzershimov ah,01h ;如果小时高位为1,低位可以设置0~9 int 21hcmp al,0dhjz forever1cmp al,'0'jc error2cmp al,'9'+1jnc error2mov [si],alincsijmp fenershi: mov ah,01h ;如果小时高位为2,低位可以设置0~4 int 21hcmp al,0dhjz forever1cmp al,'0'jc error2cmp al,'4'jnc error2mov [si],alincsijmp fenfen: mov ah,01h ;分高位可设置0~5int 21hcmp al,0dhjz forever1cmp al,':'jnz error1mov [si],alincsimov ah,01hcmp al,0dhjz forever1cmp al,'0'jc error1cmp al,'6'jnc error1mov [si],alincsizcy4: mov ah,01h ;分低位0~9 int 21hcmp al,0dhjz forever1cmp al,'0'jc error1cmp al,'9'+1jnc error1mov [si],alincsijmpzcysettime2:jmp settime ;用来跳转接力error2: jmp error1forever1:jmp next2zcy: mov ah,01h ;秒高位可设置0~5 int 21hcmp al,0dhjz forever1cmp al,':'jnz error1mov [si],alincsimov ah,01hint 21hcmp al,0dhjz forever1cmp al,'0'jc error1cmp al,'6'jnc error1mov [si],alincsimov ah,01h ;秒低位可设置0~9int 21hcmp al,0dhjz forever1cmp al,'0'jc error1cmp al,'9'+1jnc error1mov [si],alincsijmp next2error1: mov dl,0ah ;用来报错:设置时间不合法mov ah,02hint 21hmovdx,offset msg2 ;打印提示信息2mov ah,09hint 21hmov dl,0ahmov ah,02hint 21hjmpsettimesettime3: jmp settime2 ;跳转接力next2: MOV AX,0003H ;做时钟显示初始化INT 10H ;清屏显示mov dl,0ahmov ah,02hint 21hmovdx,offset msg3 ;打印提示信息3mov ah,09hint 21hmov dl,0ahmov ah,02hint 21hforever:movbx,offsettenhour ;这个程序段循环执行mov cx,8cmp tenhour,'2' ;如果超过24点,置为0点jnzdispclkcmp hour,'4'mov tenhour,'0'mov hour,'0'dispclk:mov dl,[bx] ;用来显示当前时间call dispcharincbxloop dispclk ;调用显示子程序,显示初始状态时间,;比如”11:11:11" mov dl,0dh ;输出一个换行call dispcharxoral,al ;读键盘缓冲区mov ah,0bhint 21hcmp al,0FFHjnz next3mov ah,08h ;取其字符int 21hcmp al,03h ;Ctrl+C退出jz stopcmpal,'s' ;S/s设定时间jz settime3cmpal,'S'jz settime3cmp al,0dhjnz next3mov dl,0ah ;回车则使用秒表功能mov ah,02hint 21hjmp forevernext3: moval,secondnext: cmpal,second ;判断second是否发生变化je next ;如果没有,循环比较jmp forever ;如果有变化,刷新输出stop: movdx,offset msg4 ;打印提示信息4mov ah,09hint 21hmov dl,0ahmov ah,02hint 21hpop dx ;恢复中断向量mov al,8mov ah,25h ;25H 设置中断向量int 21hmov ah,4chint 21hTimer0 proc far ;中断程序timerpush axdec count100 ;计数100次jnztimerx;如果计数小于100,跳出中断mov count100,100 ;否则重置count100<=100;1s已经到达inc second ;加一秒cmp second,'9' ;判断大小,用于进位,以下原理相同jletimerxmov second,'0'inctenseccmp tensec,'6'jltimerxmov tensec,'0'inc minutecmp minute,'9'jletimerxmov minute,'0'inctenmincmp tenmin,'6'jltimerxmov tenmin,'0'inc hourcmp hour,'9'ja adjhourcmp hour,'3'jnztimerxcmp tenhour,'1'jnztimerxmov hour,'1'mov tenhour,'0'jmp short timerx ;段内短转移adjhour:inctenhourmov hour,'0'timerx: mov al,20hout 20h,al ;主PIC口地址pop ax ;出栈恢复iret ;中断返回Timer0 endpdispchar proc near ;显示子函数push bx ;入栈保护mov bx,0mov ah,02hint 21h ;DOS功能调用,输出DL内容pop bxretdispcharendpcode endsend start子程序清单:子程序名:Timer0功能:通过计数是否到100次(1s)来控制中断,时间增加所用寄存器:AX入口参数:无出口参数:无调用其他子程序:无子程序名:dispchar功能:显示字符所用寄存器:AH,BX,DL入口参数:DL出口参数:无调用其他子程序:无。

相关文档
最新文档