北邮微机原理中断程序报告
北京邮电大学微机原理软件实验报告
![北京邮电大学微机原理软件实验报告](https://img.taocdn.com/s3/m/12d554cbaa00b52acfc7ca22.png)
信息与通信工程学院微机原理软件实验报告班级:姓名:学号:班内序号:时间:微机原理软件实验·报告实验一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 命令作单步跟踪调试。
比较每条指令执行后的结果和原来的理解是否一致,得出程序运行的结果:它们是写在什么单元,具体内容是什么;并判断结果是否正确。
微机中断服务实验报告
![微机中断服务实验报告](https://img.taocdn.com/s3/m/21c78acb08a1284ac8504319.png)
实验三中断服务实验一、实验目的熟练掌握使用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程序截图;。
北邮微机原理软件实验报告(精)
![北邮微机原理软件实验报告(精)](https://img.taocdn.com/s3/m/56d7d02ccdbff121dd36a32d7375a417866fc128.png)
北邮微机原理软件实验报告(精)微机原理软件实验报告实验二分支、循环程序设计一.实验目的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在屏幕上显示出来?。
中断程序实验报告
![中断程序实验报告](https://img.taocdn.com/s3/m/cb536c20a36925c52cc58bd63186bceb18e8ed1b.png)
一、实验目的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,即键盘中断。
在主函数中,我们等待用户按下任意键,当按键按下后,中断处理函数会被调用。
(完整版)北航微机原理实验报告
![(完整版)北航微机原理实验报告](https://img.taocdn.com/s3/m/fd163fe3a8956bec0875e394.png)
微计算机原理及运用实验报告目录实验一: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闪烁发光(亮、灭、亮、灭、……),时间间隔通过软件延时实现。
中断程序实验报告
![中断程序实验报告](https://img.taocdn.com/s3/m/434badacf9c75fbfc77da26925c52cc58bd690cb.png)
中断程序实验报告
《中断程序实验报告》
实验目的:通过编写中断程序,掌握中断处理的基本原理和方法。
实验设备:个人电脑、汇编语言编译器
实验步骤:
1. 编写中断服务程序
2. 将中断服务程序与中断向量表关联
3. 测试中断程序的功能和效果
实验结果:
通过编写中断服务程序,我们成功掌握了中断处理的基本原理和方法。
在实验中,我们编写了一个简单的中断服务程序,然后将其与中断向量表进行了关联。
在测试中,我们发现当特定的中断事件发生时,中断服务程序能够正确地被调用,并且能够完成预期的功能。
这表明我们的中断程序编写是成功的。
实验结论:
通过这次实验,我们深入了解了中断处理的原理和方法,掌握了中断程序的编
写和调用过程。
中断程序的编写是计算机系统中非常重要的一部分,它能够提
高系统的响应速度和处理效率,使系统能够更好地处理各种外部事件和异常情况。
因此,我们将继续学习和探索中断处理的更多知识,为今后的系统开发和
优化打下坚实的基础。
总结:
通过本次实验,我们对中断程序的编写和调用有了更深入的了解,掌握了中断
处理的基本原理和方法。
这将为我们今后的学习和工作提供重要的帮助,使我
们能够更好地理解和应用中断处理的知识。
希望通过不断的学习和实践,我们
能够进一步提高自己的编程能力,为计算机系统的发展和优化做出更大的贡献。
嵌入式技术及应用实验中断实验报告
![嵌入式技术及应用实验中断实验报告](https://img.taocdn.com/s3/m/9277b5472b160b4e767fcf37.png)
实验步骤与结果分析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);(写不完时,可调整表结构。
北邮微机原理软件实验报告
![北邮微机原理软件实验报告](https://img.taocdn.com/s3/m/debd1dd63c1ec5da51e27032.png)
微机原理软件实验报告实验二分支、循环程序设计一.实验目的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。
北邮微机原理软件部分报告
![北邮微机原理软件部分报告](https://img.taocdn.com/s3/m/f9d0c8ac7c1cfad6195fa796.png)
微机原理与接口技术软件部分实验报告实验B 分支、循环程序设计一、实验目的1.开始独立进行汇编语言程序设计;2.掌握基本分支,循环程序设计;3.掌握最简单的DOS功能调用。
二、实验任务及内容1.安排一个数据区,内存有若干个正数,负数和零。
每类数的个数都不超过9。
2.编写一个程序统计数据区中正数,负数和零的个数。
3.将统计结果在屏幕上显示。
4. 选作题:统计出正奇数,正偶数,负奇数,负偶数以及零的个数.四、源程序DISPSTR MACRO STR ;打出字符串(属于DOS功能调用)MOV AH,9MOV DX,SEG STRMOV DS,DXMOV DX,OFFSET STRINT 21HENDMDISPNUM MACRO NUM ;打出数字(属于DOS功能调用)MOV AH,2MOV DL,NUMADD DL,30H ;加30H变为ASCII码INT 21HENDMDATA SEGMENTNUM DB 1,3,5,0,0,0,-5,-4,0COUNT EQU $-NUM ;统计数据个数ZEROS DB 0 ;各类数初值均为0PLUSES DB 0MINUSES DB 0EVENMINUSES DB 0ODDMINUSES DB 0EVENPLUSES DB 0ODDPLUSES DB 0ZEROSTR DB 0DH,0AH,'ZERO:$' ;待输出字符串PLUSSTR DB 0DH,0AH,'PLUS:$'MINUSSTR DB 0DH,0AH,'MINUS:$'EVENMINUSSTR DB 0DH,0AH,'EVENMINUS:$'ODDMINUSSTR DB 0DH,0AH,'ODDMINUS:$'EVENPLUSSTR DB 0DH,0AH,'EVENPLUS:$'ODDPLUSSTR DB 0DH,0AH,'ODDPLUS:$'DATA ENDSSTACK SEGMENT STACK 'STACK'DB 100 DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE, DS:DATA, SS:STACKSTART PROC FARPUSH DS ;初始化MOV AX,0PUSH AXMOV AX,DATAMOV DS,AXMOV CX,COUNT ;CX控制循环次数MOV SI,OFFSET NUM ;SI指向数据的偏移地址LOOP1: CMP BYTE PTR[SI],0 ;将SI指向的内容与0比较大小JZ ZERO ;等于0跳转JG PLUS ;大于0跳转INC MINUSES ;负数加一SHR BYTE PTR[SI],1 ;判断是负奇数还是负偶数JNC EVENMINUS ;是负偶数跳转INC SI ;SI指针后移INC ODDMINUSES ;负奇数加一RETURN: LOOP LOOP1 ;循环直至CX=0JMP DISP ;循环结束后跳转至打出结果ZERO: INC ZEROSINC SIJMP RETURN ;返回循环体PLUS: INC PLUSESSHR BYTE PTR[SI],1JNC EVENPLUSINC SIINC ODDPLUSESJMP RETURNEVENPLUS: INC SIINC EVENPLUSESJMP RETURNEVENMINUS: INC SIINC EVENMINUSESJMP RETURNDISP: DISPSTR ZEROSTR ;打出结果DISPNUM ZEROSDISPSTR PLUSSTRDISPNUM PLUSESDISPSTR MINUSSTRDISPNUM MINUSESDISPSTR EVENPLUSSTRDISPNUM EVENPLUSESDISPSTR ODDPLUSSTRDISPNUM ODDPLUSESDISPSTR EVENMINUSSTRDISPNUM EVENMINUSESDISPSTR ODDMINUSSTRDISPNUM ODDMINUSESRETSTART ENDPCODE ENDSEND STARTend start五、程序运行结果进行统计的数据为1,3,5,0,0,0,-5,-4,0。
微机中断程序实验报告
![微机中断程序实验报告](https://img.taocdn.com/s3/m/14509cb418e8b8f67c1cfad6195f312b3069eb64.png)
一、实验目的1. 理解微机中断的概念和作用。
2. 掌握中断程序的编写和调试方法。
3. 学会使用中断服务程序实现特定功能。
二、实验环境1. 电脑一台2. Keil for 8051编译器3. Proteus仿真软件三、实验内容本次实验主要围绕中断程序的设计和调试展开,具体包括以下步骤:1. 创建项目2. 编写中断服务程序3. 调试程序4. 分析实验结果四、实验步骤1. 创建项目打开Keil for 8051编译器,创建一个新的项目,命名为“中断程序实验”。
2. 编写中断服务程序在中断程序实验项目中,我们需要编写两个中断服务程序,分别对应外部中断0和外部中断1。
(1)外部中断0服务程序```cvoid External0_ISR(void) interrupt 0 {// 外部中断0服务程序代码// 在此处编写外部中断0的处理代码}```(2)外部中断1服务程序```cvoid External1_ISR(void) interrupt 2 {// 外部中断1服务程序代码// 在此处编写外部中断1的处理代码}```3. 调试程序在Proteus仿真软件中,搭建实验电路,并连接好8051单片机。
将编写好的中断服务程序烧录到单片机中,然后进行仿真调试。
(1)调试外部中断0在Proteus中,连接一个按钮作为外部中断0的触发信号。
按下按钮时,程序应该能够进入外部中断0服务程序。
(2)调试外部中断1在Proteus中,连接另一个按钮作为外部中断1的触发信号。
按下按钮时,程序应该能够进入外部中断1服务程序。
4. 分析实验结果经过调试,我们发现外部中断0和外部中断1服务程序均能正确执行。
这表明我们已经成功实现了中断程序的设计。
五、实验心得通过本次实验,我对微机中断程序有了更深入的了解,以下是我在实验过程中的心得体会:1. 中断程序在微机系统中具有重要作用,它可以提高系统的实时性和效率。
2. 编写中断服务程序时,需要注意中断优先级和中断嵌套问题。
北邮微机原理 第二次软件实验报告
![北邮微机原理 第二次软件实验报告](https://img.taocdn.com/s3/m/dc21dd9c680203d8ce2f24de.png)
微机原理与接口技术中断实验与编程报告姓名学院信息与通信工程学院专业班级学号班内序号目录一、实验目的 (2)二、实验任务及内容 (2)1设计思路 (2)2流程图 (3)3源代码 (4)4子程序清单 (9)三、实验结果 (10)四、实验总结 (12)一、实验目的编一程序,在显示器上显示时、分、秒。
借用计数器8253的Timer0作为中断源,通过8259A向CPU发中断,每10ms产生一次中断。
在中断服务程序中管理刷新时、分、秒。
要求:输入文件名,(如CLK)后,清屏后显示:Current time is xx:xx:xx(时分秒键盘输入)打回车,时、分、秒开始计时。
时钟不停的刷新。
当键入ctrl+c时,停止计时,返回系统,且系统正常运行不死机。
二、实验任务及内容1设计思路1)定义数据段和堆栈段。
数据段存放中断次数count100,输入的时间信息(8位字符),用于提示的字符串信息。
堆栈段存放256个空字符。
2)宏名check的定义。
判断输入的字符是否超出允许输入的范围,若超出范围,报错后返回程序开始处。
3)主程序。
初始化寄存器。
清屏。
(执行过程见注释部分)显示字符串str1。
用于说明输入格式(xx:xx:xx)和输入后开始计时的方式(按回车键开始)将输入的8个字符存入数据段。
使用DOS功能调用01H,通过DI,把存放在AL 中的键入字符存入以tenhour为开始的数据段,并使用宏指令check判断输入字符是否超过范围。
键入回车,开始计时。
使用DOS 功能调用01H ,把键入的键与回车键对应码0DH进行比较。
若键入其他键,报错,返回程序开始。
将原来08H 中断号设置的入口地址换成本程序中timer 的起始地址,保证在发生08H 中断时,程序自动进入timer 过程。
为时钟计时器置初值。
43H 端口是指8253三通道定时器中的命令寄存器,所使用的命令字36H 表示选用0通道定时器,以3号方式(产生方波)计数等。
中断实验原理实验报告
![中断实验原理实验报告](https://img.taocdn.com/s3/m/788428db8662caaedd3383c4bb4cf7ec4afeb63b.png)
一、实验目的1. 理解中断的基本概念和原理。
2. 掌握中断请求和中断响应的过程。
3. 熟悉中断处理程序的编写和调试。
二、实验原理1. 中断的概念中断是指计算机在执行程序过程中,由于某些事件的发生而暂时中止当前程序的执行,转而执行处理该事件的程序。
中断是计算机系统中一种重要的处理机制,可以提高计算机的效率和处理能力。
2. 中断请求和中断响应中断请求是指由外部设备或其他事件产生的请求,要求CPU暂停当前程序的执行。
中断响应是指CPU接收到中断请求后,暂停当前程序的执行,转而执行中断处理程序。
3. 中断处理程序中断处理程序是专门用来处理中断事件的程序。
当CPU接收到中断请求后,会自动调用中断处理程序,执行相应的中断处理操作。
三、实验内容1. 编写中断请求程序编写一个简单的中断请求程序,实现以下功能:(1)设置中断向量表,将中断处理程序入口地址存储在表中。
(2)编写中断处理程序,处理中断事件。
(3)向CPU发送中断请求。
2. 编写中断响应程序编写一个简单的中断响应程序,实现以下功能:(1)接收中断请求,判断中断类型。
(2)调用对应的中断处理程序。
(3)恢复被中断程序的执行。
3. 编写中断处理程序编写一个简单的中断处理程序,实现以下功能:(1)读取中断请求中的相关信息。
(2)处理中断事件。
(3)返回中断向量表,继续执行被中断程序。
四、实验步骤1. 编写中断请求程序(1)定义中断向量表,存储中断处理程序入口地址。
(2)编写中断处理程序,处理中断事件。
(3)编写中断请求函数,向CPU发送中断请求。
2. 编写中断响应程序(1)接收中断请求,判断中断类型。
(2)调用对应的中断处理程序。
(3)恢复被中断程序的执行。
3. 编写中断处理程序(1)读取中断请求中的相关信息。
(2)处理中断事件。
(3)返回中断向量表,继续执行被中断程序。
五、实验结果与分析1. 实验结果通过编写中断请求程序、中断响应程序和中断处理程序,实现了中断请求、中断响应和中断处理的基本功能。
中断程序实验报告
![中断程序实验报告](https://img.taocdn.com/s3/m/7af61ba8541810a6f524ccbff121dd36a22dc46b.png)
中断程序实验报告中断程序实验报告一、实验目的本次实验的目的是通过编写中断程序,了解中断的概念、原理和应用。
通过实践操作,掌握中断程序的编写和调试技巧,进一步提高对计算机系统的理解和应用能力。
二、实验原理中断是计算机系统中一种重要的机制,它能够在程序执行过程中,根据设定的条件自动中断当前正在执行的程序,转而执行相应的中断服务程序。
这种机制能够提高计算机系统的效率和灵活性,使得计算机能够及时响应外部设备的请求和处理各种异常情况。
中断程序是一种特殊的程序,它通常由硬件设备或操作系统触发,用于处理特定的事件或异常情况。
中断程序的编写需要遵循一定的规范和流程,包括中断向量表的设置、中断服务程序的编写和中断处理的过程等。
三、实验步骤1. 确定实验环境:选择合适的开发平台和编程语言,如使用汇编语言进行实验。
2. 设置中断向量表:根据实验需求,确定中断向量表的大小和地址,并进行相应的设置。
3. 编写中断服务程序:根据实验要求,编写相应的中断服务程序,包括中断处理和相关的操作。
4. 编写主程序:编写主程序,用于模拟中断的触发和测试中断程序的功能。
5. 进行编译和调试:将编写好的程序进行编译和调试,确保程序的正确性和可靠性。
6. 运行实验:在实验环境中运行编写好的程序,观察和记录实验结果。
7. 分析实验结果:根据实验结果,对中断程序的功能和效果进行分析和评估。
四、实验结果与分析通过实验,我们成功编写了一个简单的中断程序,并进行了测试和分析。
在实验过程中,我们模拟了一个外部设备的中断请求,并观察了中断程序的执行情况。
实验结果显示,当外部设备发出中断请求时,中断程序能够及时响应,并执行相应的中断服务程序。
中断服务程序根据中断类型和相关参数,进行相应的处理和操作,最后返回到主程序继续执行。
这种机制能够有效提高计算机系统的响应速度和处理能力,增强了系统的稳定性和可靠性。
通过对实验结果的分析,我们发现中断程序设计的合理性对系统性能和稳定性有着重要的影响。
微机原理实验6中断实验
![微机原理实验6中断实验](https://img.taocdn.com/s3/m/a86c04e85ef7ba0d4b733b02.png)
微机原理实验6实验设备:LAB6000通用微控制器实验系统实验用时8小时一、实验内容:中断实验1.简单中断程序:INT0为中断入口,对单脉冲按键开关次数计数,并用发光二极管二进制方式显示按键次数。
2.用逻辑分析仪分析中断时序3.中断程序:采用INT0和INT1两个中断源,INT1输入改为实验系统上频率输入,INT0接单脉冲按键开关。
设计中断服务程序,要求INT1中断服务程序对输入计数,每1000次,发光二极管显示加1。
INT0中断服务程序开、关INT1中断。
(程序启动后,INT0不计数,按单脉冲按键开关后,开INT0中断,发光二极管二进制方式显示中断次数,再次按单脉冲按键开关,关INT0中断,如此反复)4.绘制电路原理图,增加8259芯片,要求地址9000H起。
这里增加一译码芯片,每一引脚具有16地址单元。
为以后芯片扩展用实验报告:中断服务程序清单和中断时序分析电路原理图二、程序代码如下:mode equ 82h ; 8255 工作方式PA8255 equ 8000h ; 8255 PA口输出地址CTL8255 equ 8003hICW1 equ 00010011b ; 单片8259, 上升沿中断, 要写ICW4ICW2 equ 00100000b ; 中断号为20HICW4 equ 00000001b ; 工作在8086/88 方式OCW1 equ 11111100b ; 既响应INT0 中断,也响应INT1中断CS8259A equ 09000h ; 8259地址CS8259B equ 09001hdata segmentCNT dw 0CNNT dw 0sign db 11111100bdata endscode segmentassume cs:code, ds: dataIEnter proc nearpush axpush dxmov dx, PA8255inc CNTcmp CNT,50jnb add1jmp outputadd1:inc CNNTmov CNT,0mov ax, CNNTout dx, ax ; 输出计数值output:mov dx, CS8259Amov al, 20h ; 中断服务程序结束指令out dx, alpop dxpop axiretIEnter endpIEnter2 proc nearpush axpush dxmov dx, PA8255xor sign, 00000001bmov dx, CS8259Bmov al, signout dx, almov dx, CS8259Amov al, 20h ; 中断服务程序结束指令out dx, alpop dxpop axiretIEnter2 endpIInit procmov dx, CS8259Amov al, ICW1out dx, almov dx, CS8259Bmov al, ICW2out dx, almov al, ICW4out dx, almov al, OCW1out dx, alretIInit endpstart proc nearmov dx, CTL8255mov al, modeout dx, alclimov ax, 0mov ds, axmov bx, 4*ICW2 ; 中断号mov ax, codeshl ax, 4 ; x 16add ax, offset IEnter ; 中断入口地址(段地址为0)mov [bx], axmov ax, 0inc bxinc bxmov [bx], ax ; 代码段地址为0;添加内容inc bxinc bxmov ax, codeshl ax, 4add ax, offset IEnter2mov [bx], axmov ax, 0inc bxinc bxmov [bx], ax;添加结束call IInitmov ax, datamov ds, axmov CNT, 0 ; 计数值初始为0mov ax, CNTmov dx, PA8255out dx, axstiLP: ; 等待中断,并计数。
北京邮电大学实验报告实验三微机
![北京邮电大学实验报告实验三微机](https://img.taocdn.com/s3/m/6767eeccbb4cf7ec4afed058.png)
北京邮电大学实验报告题目:微机原理软件实验三班级: 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)。
北邮 微机原理实验报告
![北邮 微机原理实验报告](https://img.taocdn.com/s3/m/2991aa7242323968011ca300a6c30c225901f0fb.png)
北邮微机原理实验报告一、实验目的本实验旨在通过对微机原理的实际操作,加深对计算机内部结构和工作原理的理解,并通过实验验证理论知识的正确性。
二、实验设备和材料•计算机硬件设备:PC机一台、示波器一台、数字信号发生器一台。
•软件工具:TASM、MASM汇编语言编译器。
三、实验内容本实验分为以下几个步骤:1. 准备工作•将PC机与示波器、数字信号发生器连接。
•打开PC机,进入实验环境。
2. 实验一:简单指令的执行•编写一个简单的汇编程序,实现两个数相加并将结果存储到指定寄存器中。
•使用TASM或MASM编译器对汇编程序进行编译,生成可执行文件。
•运行可执行文件,在示波器上观察到相加过程的波形。
3. 实验二:数据传输操作•编写一个汇编程序,实现数据在不同寄存器和内存之间的传输。
•编译并运行程序,通过观察PC机上的输出结果,验证数据传输的正确性。
4. 实验三:逻辑运算和移位操作•编写程序,实现逻辑运算和移位操作,并观察运算结果。
•通过数字信号发生器产生相应的输入信号,验证程序的正确性。
5. 实验四:中断处理•编写一个汇编程序,实现对中断请求的响应和处理。
•通过示波器观察中断请求和处理的波形,验证程序的正确性。
6. 实验五:串行通信操作•编写程序,实现串行通信的发送和接收操作。
•通过示波器观察串行通信的波形,验证程序的正确性。
四、实验结果和分析•对每个实验步骤进行记录,并详细分析实验结果。
•比较实验结果与理论预期是否一致,并给出原因分析。
五、实验心得通过本次实验,我深刻理解了微机原理的实际应用和操作过程。
通过实际操作,我对计算机内部结构和工作原理有了更深入的了解,并通过实验验证了理论知识的正确性。
同时,我也意识到在实际操作中的一些细节和注意事项,这对我今后的学习和工作都有很大的帮助。
六、实验总结通过本次实验,我不仅掌握了微机原理的实际应用技能,还深化了对计算机内部结构和工作原理的理解。
实验过程中,我遇到了一些问题,但通过思考和实践,逐步解决了这些问题,并取得了满意的实验结果。
北邮微机原理实验报告
![北邮微机原理实验报告](https://img.taocdn.com/s3/m/d6a96fe30b1c59eef9c7b400.png)
微机原理软件实验报告学院:信息与通信工程学院班级: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即可显示。
微机原理课程设计报告(数据采集中断法)
![微机原理课程设计报告(数据采集中断法)](https://img.taocdn.com/s3/m/9930e59ce45c3b3566ec8b30.png)
课程设计报告纸数据采集系统三(中断法)一、实验目的进一步掌握微机原理知识,了解微机在实时采集过程中的应用,学习、掌握编程和程序调试方法。
二、实验内容1、用中断法,将ADC 0809 通道0外接0 ~ 5V 电压,转换成数字量后,在七段LED 数码管上,以小数点后两位(几十毫伏)的精度,显示其模拟电压的十进值;0809 通道0 的数字量以线性控制方式送DAC0832 输出,当通道0的电压为5V时,0832的OUT 为0V, 当通道0的电压为0时,0832的OUT 为2.5V;此模拟电压再送到ADC 0809 通道1,转换后的数字量在CRT 上以十六进制显示。
2、ADC 0809 的CLK 脉冲,由定时器8254的OUT0 提供;ADC 0809 的EOC 信号,用作8259 中断请求信号。
3、要有较好的人机对话界面;控制程序的运行。
三、总体设计1、ADC 0809的IN0 采集电位器0 —5V 电压,IN1 采集0832 输出的模拟量。
2、DAC 0832将ADC 0809的IN0 数字量后重新转换成模拟量输出。
3、8259用于检测ADC 0809转换是否结束和向CPU发送INTR信号4、8255 为七段LED数码管显示提供显示驱动信息。
5、七段LED 数码管显示ADC 0809的IN0 的值。
6、8254提供ADC 0809的采样时钟脉冲。
7、有良好的人—机对话界面。
系统运行时,显示主菜单,开始数据采集, 在数据采集时, 主键盘有键按下, 退出返回DOD 系统。
四、硬件设计因采用了PC机和微机实验箱, 硬件电路设计相对比较简单, 主要利用微机实验箱上的8255并行口、ADC0 809、DAC0 832、七段LED数码管单元、8254定时/ 计数器、74LS574 输出接口、电位器等单元电路, 就构成了数据采集系统, 硬件电原理框图4-3-1 所示。
1 2 3 课程设计报告纸4XD0-XD7 /Y2 XIOWXD0-XD7 XIOW XIOR XA2XA3/Y3XD0-XD7XIOW XIOR/Y0XD0-XD7 XIOW XIOR INTR/Y7XD0-XD7 XIOW XIOR XA2XA3/Y1XA5XA6XA7RfeWRD0-D7WRRDA0A1CSD0-D7WRRDCSD0-D7WRRDNTRCSD0-D7WRRDA0A1CS00883322825408098259825574138Iout23Iout12GATE0CLK0 1.8432MHZOUT0CLKXA2XA3C XA4 IN0 IN1EOCIR0A0PA0-PA5PB0-PB7/Y0/Y1/Y2/Y3/Y4/Y5/Y6/Y746B75LM3241OUT+5VL1-L610K +5V数码管键盘单元A,B-G,DpTitleSize Number RevisionD a课程设计报告纸五、软件设计本设计通过软件编程,实现模/数转换器0809 分别对IN0 0-5V 直流电压的采样,和经0832 线性控制后输出电压的IN1 采样,IN0 的值转换成十进制后, 在七段数码管上显示; IN1 的值在显示器上显示。
北邮微机原理硬件实验 实验报告
![北邮微机原理硬件实验 实验报告](https://img.taocdn.com/s3/m/7be44a8a6c85ec3a86c2c558.png)
微机原理与接口技术硬件实验报告姓名:曹爽学号:2013210640班级:20132111242016年1月10日目录实验一:熟悉实验环境及IO的使用 (3)一、实验目的 (3)二、实验内容及要求 (3)三、实验步骤 (3)四、程序流程图 (4)五、源代码 (4)六、思考题 (5)七、实验结果和心得体会 (6)实验二:8255A并行接口应用 (7)一、实验目的 (7)二、实验内容及要求 (7)三、实验步骤 (8)四、程序流程图 (9)五、源代码 (10)六、实验结果和心得体会 (14)实验三:8253计数器/定时器的应用 (15)一、实验目的 (15)二、实验内容及要求 (15)三、8253定时器 (15)四、电路的调试与连接 (16)五、实验连接图 (16)六、程序流程图 (18)七、源代码 (19)八、思考题 (21)九、实验结果和心得体会 (21)实验一:熟悉实验环境及IO的使用一、实验目的1.通过实验了解和熟悉实验台的结构、功能及使用方法。
2.通过实验掌握直接使用Debug 的I、O命令来读写IO 端口。
3.学会Debug 的使用及编写汇编程序。
二、实验内容及要求1.学习使用Debug命令,并用I、O命令直接对端口进行读写操作。
2.用汇编语言编写跑马灯程序。
(使用EDIT编辑工具)实现功能。
A. 通过读入端口状态(ON为低电平),选择工作模式(灯的闪烁方式、速度等)。
B. 通过输出端口控制灯的工作状态(低电平灯亮)。
注意:电源打开时不得插拔电缆及各种器件。
连接电路时一定要在断电的情况下连接,否则可能会烧坏整个实验系统。
三、实验步骤这里仅简要叙述利用EDIT工具编写汇编写跑马灯程序的步骤。
编写:C>EDIT 文件名.asm编译:C>MASM 文件名.asm连接:C>LINK 文件名.obj运行:C>文件名.exe或用Debug进行调试。
四、程序流程图图1.4.1 程序流程图五、源代码CODE SEGMENTASSUME CS:CODESTART: MOV AH,0FEH;将初始灯设为右起第1灯亮LOOP0: MOV DX,0EEE0H;将I/O端口地址设为EEE0IN AL,DX;从端口读入数据,提取拨码开关右起第3位状态AND AL,20HCMP AL,20HJNZ STOP;若状态为‘0’,则保持位置不变,暂停IN AL,DX;提取拨码开关右起第2位状态AND AL,40HCMP AL,40HJNZ FAN;若状态为‘0’,则右移亮灯位置ROL AH,1;左移亮灯位置STOP: JMP DISPFAN: ROR AH,1DISP: MOV AL,AHOUT DX,AL;输出到端口,亮灯MOV CX,8000H;外循环次数MOV BX,8000H;内循环次数LOOP1: DEC BXJNZ LOOP1;内循环,BX减少到0MOV BH,80H;重设内循环次数80H次IN AL,DXAND AL,10HCMP AL,10H;提取拨码开关右起第4位状态JNZ S;若为‘1’,则设置内循环次数为10H次MOV BH,10HS: LOOP LOOP1;外循环,CX减少到0IN AL,DXAND AL,80HCMP AL,80H;提取拨码开关右起第1位状态JNZ LOOP0;若为‘0’,则继续显示,否则结束程序MOV AH,4CHINT 21HCODE ENDSEND START六、思考题通过实验说明用debug中的a命令录入实验中给出的小程序中,有些语句可以不写出“h”字符的原因。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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出口参数:无调用其他子程序:无。