微机8254计数实验

INTR_IVADD     EQU   003CH        ;INTR对应的中断矢量地址

IOY0           EQU   0A000H        ;片选IOY0对应的端口始地址
MY8254_COUNT0  EQU   IOY0+00H*2   ;8254计数器0端口地址
MY8254_COUNT1  EQU   IOY0+01H*2   ;8254计数器1端口地址
MY8254_COUNT2  EQU   IOY0+02H*2   ;8254计数器2端口地址
MY8254_MODE    EQU   IOY0+03H*2   ;8254控制寄存器端口地址
                             
STACK1 SEGMENT STACK
        DW 256 DUP(?)
STACK1 ENDS

DATA SEGMENT
CS_BAK   DW  ?                    ;保存INTR原中断处理程序入口段地址的变量
IP_BAK   DW  ?                    ;保存INTR原中断处理程序入口偏移地址的变量
IM_BAK   DB  ?                    ;保存INTR原中断屏蔽字的变量
STR1     DB  ‘COUNT: $‘           ;显示的字符串
DATA ENDS

CODE SEGMENT
        ASSUME CS:CODE,DS:DATA

START: MOV AX,DATA
       MOV DS,AX
       CLI

MOV AX,0000H               ;替换INTR的中断矢量
       MOV ES,AX
       MOV DI,INTR_IVADD         
       MOV AX,ES:[DI]
       MOV IP_BAK,AX              ;保存INTR原中断处理程序入口偏移地址
       MOV AX,OFFSET MYISR
       MOV ES:[DI],AX             ;设置当前中断处理程序入口偏移地址

ADD DI,2
       MOV AX,ES:[DI]
       MOV CS_BAK,AX              ;保存INTR原中断处理程序入口段地址
       MOV AX,SEG MYISR
       MOV ES:[DI],AX             ;设置当前中断处理程序入口段地址

IN  AL,21H
       MOV IM_BAK,AL              ;保存INTR原中断屏蔽字
       AND AL,7FH
       OUT 21H,AL

STI
       MOV DX,OFFSET STR1         ;显示字符串
       MOV AH,9
       INT 21H

MOV DX,MY8254_MODE         ;初始化8254工作方式
       MOV AL,10H                 ;计数器0,方式0 
       OUT DX,AL

MOV DX,MY8254_COUNT0       ;装入计数初值
       MOV AL,5
       OUT DX,AL

WAIT1: MOV AH,1                   ;判断是否有按键按下
       INT 16H
       JZ  WAIT1                  ;无按键则跳回继续等待,有则退出

QUIT:  CLI

MOV AX,0000H               ;恢复INTR原中断矢量
       MOV ES,AX
       MOV DI,INTR_IVADD 
       MOV AX,IP_BAK              ;恢复INTR原中断处理程序入口偏移地址
       MOV ES:[DI],AX
       ADD DI,2
       MOV AX,CS_BAK              ;恢复INTR原中断处理程序入口段地址
       MOV ES:[DI],AX

MOV AL,IM_BAK              ;恢复INTR原中断屏蔽寄存器的屏蔽字
       OUT 21H,AL
       STI

MOV AX,4C00H               ;返回到DOS
       INT 21H

MYISR PROC NEAR                   ;中断处理程序MYISR
       PUSH AX
       MOV AL,36H
       MOV AH,0EH
       INT 10H
       MOV AL,20H
       INT 10H

MOV DX,MY8254_COUNT0       ;重装计数初值
       MOV AL,5
       OUT DX,AL

OVER:  MOV AL,20H                 ;向PC机内部8259发送中断结束命令
       OUT 20H,AL
       POP AX
       IRET
      
MYISR ENDP
      
CODE ENDS
     END START

时间: 2024-11-08 10:17:16

微机8254计数实验的相关文章

定时器计数实验

#include <reg52.h>typedef unsigned char u8;typedef unsigned int  u16;sbit led = P1^0;u8 timer;void main (void){    TMOD = 0x01;//设置TMOD,使得T0工作在16位定时.    TH0 = (65535-50000) / 256;    TL0 = (65535-50000) % 256;    EA = 1; //开放总中断    ET0 = 1;//开放定时器0的

大数据【四】MapReduce(单词计数;二次排序;计数器;join;分布式缓存)

   前言: 根据前面的几篇博客学习,现在可以进行MapReduce学习了.本篇博客首先阐述了MapReduce的概念及使用原理,其次直接从五个实验中实践学习(单词计数,二次排序,计数器,join,分布式缓存). 一 概述 定义 MapReduce是一种计算模型,简单的说就是将大批量的工作(数据)分解(MAP)执行,然后再将结果合并成最终结果(REDUCE).这样做的好处是可以在任务被分解后,可以通过大量机器进行并行计算,减少整个操作的时间. 适用范围:数据量大,但是数据种类小可以放入内存. 基

2017-2018-1 20155333 《信息安全系统设计基础》实验三

2017-2018-1 20155333 <信息安全系统设计基础>实验三 实验三-并发程序-1 学习使用Linux命令wc(1) 基于Linux Socket程序设计实现wc(1)服务器(端口号是你学号的后6位)和客户端 客户端传一个文本文件给服务器 服务器返加文本文件中的单词数 提交代码 提交测试截图,至少要测试附件中的两个文件 mywc.c #include<stdio.h> #include<string.h> #define LEN 4096 int text_

NVIDIA DIGITS 学习笔记(NVIDIA DIGITS-2.0 + Ubuntu 14.04 + CUDA 7.0 + cuDNN 7.0 + Caffe 0.13.0)

转自:http://blog.csdn.net/enjoyyl/article/details/47397505?from=timeline&isappinstalled=0#10006-weixin-1-52626-6b3bffd01fdde4900130bc5a2751b6d1 NVIDIA DIGITS-2.0 + Ubuntu 14.04 + CUDA 7.0 + cuDNN 7.0 + Caffe 0.13.0环境配置 引言 DIGITS简介 DIGITS特性 资源信息 说明 DIGI

Spark入门实战系列--3.Spark编程模型(上)--概念及SparkShell实战

[注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送–Spark入门实战系列>获取 1 Spark编程模型 1.1 术语定义 应用程序(Application): 基于Spark的用户程序,包含了一个Driver Program 和集群中多个的Executor: 驱动程序(Driver Program):运行Application的main()函数并且创建SparkContext,通常用SparkContext代表Driver Program: 执行单元(Executor): 是为某

我的成绩

学年 学期 课程代码 课程名称 课程性质 课程归属 学分 绩点 成绩 辅修标记 开课学院 2014-2015 1 CMC120197T 英语听说Ⅰ 校选 沟通交流类 2 88 0 外语部 2014-2015 1 ELI221012P 专业感知与实践 必修 2 3 80 0 信息学院 2014-2015 1 ELI300059T 新生研讨 必修 1 4.4 94 0 2014-2015 1 ENG1A0011T 大学英语(Ⅲ) 必修 6 3.7 87 0 2014-2015 1 MAT1A0001

第一次微机实验的前前后后

还记得大概两周前,微机老师在课堂上就说到要准备做微机实验了,也就是上机编译汇编.汇编~~!!每次上课都是听老师讲来讲去~好像就记得个MOV指令...这是我当时的感受,自己也没有怎么当回事儿,昨天才把实验报告打印出来,今天一开始上课就傻眼了~~ "同学们先把实验报告上面的代码验证一下,然后你们再把下面的题目自己做一下,做完后就可以走了~~",老师在前面说道. 然后我才第一次认真看实验报告,上面密密麻麻的汇编代码错落有致的排列着,"都是上面玩意儿啊,一个都看不懂~~",

微机接口技术与汇编语言上机实验报告_汇编初步(intel8086)

实验环境:intel x386 一.要求:将3000H单元开始置数为00H-0FH SSTACK SEGMENT STACK DW 32 DUP(?) SSTACK ENDS CODE SEGMENT ASSUME CS:CODE, SS:SSTACK START: PUSH DS XOR AX, AX MOV DS, AX MOV SI, 3000H MOV CX, 16 AA1: MOV [SI], AL INC SI INC AL LOOP AA1 ;CX == 0? NEXT():AA1

Storm实验 -- 单词计数4

在上一次单词计数的基础上做如下改动: 使用 自定义  分组策略,将首字母相同的单词发送给同一个task计数 自定义 CustomStreamGrouping package com.zhch.v4; import backtype.storm.generated.GlobalStreamId; import backtype.storm.grouping.CustomStreamGrouping; import backtype.storm.task.WorkerTopologyContext;