8088 单板机 NMI 中断程序示例 (脱离 DOS 环境)

article/2025/8/3 20:01:11

求组DeepSeek给的将要进行的8088单板机NMI中断编程示例。

/* nmidemo.c - 8088 单板机 NMI 中断演示程序 */
/* 脱离 DOS 环境,直接运行在裸机上 */
/* 使用 Digital Mars C 编译器,TINY 模式编译 *//* 硬件配置假设:- 8088 CPU @ 4.77MHz- 8255 PPI (可编程外设接口) 连接 LED- NMI 按钮连接到 NMI 引脚- 系统 ROM 从 0xF0000 开始 *//* 端口定义 */
#define PORT_PPI_A     0x60    // 8255 PPI 端口 A (LED 控制)
#define PORT_PPI_B     0x61    // 8255 PPI 端口 B
#define PORT_PPI_C     0x62    // 8255 PPI 端口 C
#define PORT_PPI_CTRL  0x63    // 8255 PPI 控制端口/* 函数声明 */
void nmi_handler(void);
void set_nmi_handler(void);
void init_ppi(void);
void delay(unsigned int count);
void outportb(unsigned short port, unsigned char value);
unsigned char inportb(unsigned short port);/* NMI 计数器 */
volatile unsigned char nmi_count = 0;/* 主函数 */
int main() {// 设置栈指针 (在 64KB RAM 顶部)asm {mov ax, csmov ss, axmov sp, 0xFFFE}// 初始化硬件init_ppi();set_nmi_handler();// 初始状态: 点亮 LED 0outportb(PORT_PPI_A, 0x01);// 主循环 - 等待 NMIwhile (1) {// 循环点亮 LEDfor (int i = 0; i < 8; i++) {outportb(PORT_PPI_A, 1 << i);delay(0xFFFF);}}return 0;
}/* 设置 NMI 处理程序 */
void set_nmi_handler() {// 保存原始 NMI 向量 (中断号 2)unsigned int nmi_vector = 2 * 4; // 每个中断向量占 4 字节// 获取原始 NMI 处理程序地址unsigned int orig_offset, orig_segment;asm {push dsxor ax, axmov ds, axmov si, [nmi_vector]mov [orig_offset], simov si, [nmi_vector+2]mov [orig_segment], sipop ds}// 设置新的 NMI 处理程序asm {push dsxor ax, axmov ds, axmov si, [nmi_vector]mov word ptr [si], offset nmi_handlermov si, [nmi_vector+2]mov [si], cs   ; 段地址 = CSpop ds}// 启用 NMI (清除 CMOS 寄存器第 7 位)outportb(0x70, inportb(0x70) & 0x7F);
}/* NMI 中断处理程序 */
void nmi_handler() {// 保存寄存器asm {push axpush bxpush cxpush dxpush ds}// 设置数据段asm {mov ax, csmov ds, ax}// 增加 NMI 计数器nmi_count++;// 在 LED 上显示 NMI 发生 (二进制计数)outportb(PORT_PPI_A, nmi_count);// 延迟一段时间 (视觉反馈)delay(0xFFFF);// 恢复寄存器asm {pop dspop dxpop cxpop bxpop ax}// 中断返回asm iret;
}/* 初始化 8255 PPI */
void init_ppi() {// 设置 8255 控制字: 端口 A 输出, 模式 0outportb(PORT_PPI_CTRL, 0x80);  // 10000000b: 端口 A 输出, 端口 B 输出, 端口 C 输出// 初始状态: 关闭所有 LEDoutportb(PORT_PPI_A, 0x00);
}/* 端口输出函数 */
void outportb(unsigned short port, unsigned char value) {asm {mov dx, portmov al, valueout dx, al}
}/* 端口输入函数 */
unsigned char inportb(unsigned short port) {unsigned char value;asm {mov dx, portin al, dxmov value, al}return value;
}/* 简单延迟函数 */
void delay(unsigned int count) {asm {mov cx, countdelay_loop:noploop delay_loop}
}


http://www.hkcw.cn/article/QqDWjrAyLq.shtml

相关文章

详解鸿蒙开发如何上传三方库到ohpm仓库

前两天幽蓝君在ohpm仓库上传了自己的第一个三方库&#xff0c;完整体验了一下ohpm的上传流程&#xff0c;感觉还是比较繁琐的&#xff0c;所以把上传流程和一些注意事项分享给大家。 先介绍一下怎么开发一个三方库&#xff0c;在项目名称右键&#xff0c;新建Module&#xff0…

PHP与MYSQL结合中中的一些常用函数,HTTP协议定义,PHP进行文件编程,会话技术

MYSQL&#xff1a; 查询函数: 执行查询语句: 1.mysql_query("SQL语法"); 凡是执行操作希望拿到数据库返回的数据进行展示的(结果返回: 数据结果); 2.执行结果的处理:成功为结果集&#xff0c;失败为false; 成功返回结果:SQL指令没有错误&#xff0c;但是查询结果…

[Protobuf]常见数据类型以及使用注意事项

[Protobuf]常见数据类型以及使用注意事项 水墨不写bug 文章目录 一、基本数据类型1、字段2、字段的修饰规则 二、自定义数据类型1、message类型2、enum类型3、Any类型4、oneof类型5、map类型 三、小工具1.hexdump2.decode 四、注意事项 一、基本数据类型 protobuf 支持多种基础…

邂逅Webpack和打包过程

前端开发方向 目前国内的前端开发 主要使用Vue和React 一般你写个项目&#xff0c;过程就是&#xff1a;npm/yarn --> webpack架构 --> Vue/React框架 而针对Vue和React都有脚手架的&#xff0c;脚手架是基于webpack搭建的 你写.jsx或者ts之类的浏览器是不认识的&…

计算机网络第1章(下):网络性能指标与分层模型全面解析

目录 一、计算机网络的性能指标1.1 性能指标1&#xff1a;速率1.2 性能指标2&#xff1a;带宽1.3 性能指标3&#xff1a;吞吐量1.4 性能指标4&#xff1a;时延1.5 性能指标5&#xff1a;时延带宽积1.6 性能指标6&#xff1a;往返时延1.7 性能指标7&#xff1a;信道利用率 二、计…

多模态大语言模型arxiv论文略读(102)

Chat2Layout: Interactive 3D Furniture Layout with a Multimodal LLM ➡️ 论文标题&#xff1a;Chat2Layout: Interactive 3D Furniture Layout with a Multimodal LLM ➡️ 论文作者&#xff1a;Can Wang, Hongliang Zhong, Menglei Chai, Mingming He, Dongdong Chen, Ji…

python学习打卡day42

DAY 42 Grad-CAM与Hook函数 知识点回顾 回调函数lambda函数hook函数的模块钩子和张量钩子Grad-CAM的示例 作业&#xff1a;理解下今天的代码即可 1.回调函数 Hook本质是回调函数&#xff0c;所以我们先介绍一下回调函数 回调函数是作为参数传递给其他函数的函数&#xff0…

VeriFree:无需Verifier的通用RL框架

文章目录 前言1. 研究背景与挑战1.1 传统强化学习框架&#xff08;RLVR&#xff09;的领域局限性1.2 引入LLM作为验证器的新挑战1.3 研究目标的提出 2. VeriFree方法核心原理2.1 问题定义与形式化建模2.2 核心思想&#xff1a;隐式验证与概率最大化2.3 训练技术细节 3. 实验4. …

uniapp uni-id 如果是正式项目,需自行实现发送邮件的相关功能

(3) 使用云对象sendEmailCode 发送邮箱验证码&#xff0c;报错送邮箱验证码失败 Error: 已启动测试模式&#xff0c;直接使用&#xff1a;123456作为邮箱验证码即可。 如果是正式项目&#xff0c;需自行实现发送邮件的相关功能 - DCloud问答 uni-id 没有实现邮箱验证码逻辑&am…

HiEV独家 | 整合智能化战线,奇瑞辅助驾驶驶向何方?

作者 |德新 编辑 |王博 组织调整是战略变革的映射&#xff0c;而战略变革最终要在产品上体现。 5月30日&#xff0c;奇瑞汽车官宣整合旗下雄狮科技、大卓智能与研发总院相关业务&#xff0c;成立「智能化中心」。智能化中心下设有智能座舱、智能辅助驾驶、电子电气架构等子中…

什么是软件需求可视化?如何实际运用?

一、什么是软件需求可视化&#xff1f; 将软件需求可视化是一个有助于团队成员更好地理解项目需求、促进沟通和协作的重要过程。以下是几种常见的方法和技术&#xff0c;可以帮助你有效地实现这一目标&#xff1a; 用户故事地图&#xff1a;这是一种通过创建一个从用户角度出发…

腾讯:强化学习提高LLM机器翻译

&#x1f4d6;标题&#xff1a;TAT-R1: Terminology-Aware Translation with Reinforcement Learning and Word Alignment &#x1f310;来源&#xff1a;arXiv, 2505.21172 &#x1f31f;摘要 最近&#xff0c;像DeepSeek-R1这样的深度推理大型语言模型&#xff08;LLM&…

C++ IO流

目录 一、C语言的输入与输出 二、流 三、CIO流 3.1 C标准IO流 3.2 C文件IO流 3.3 stringstream字符串流 一、C语言的输入与输出 在 C 语言中&#xff0c;最常用的输入输出函数是 scanf() 和 printf()。它们分别用于从标准输入读取数据&#xff0c;以及将数据输出到标准输出…

linux文件管理(补充)

1、查看文件命令 1.1 cat 用于连接文件并打印到标准输出设备上&#xff0c;它的主要作用是用于查看和连接文件。 用法&#xff1a; cat 参数 文件名 参数&#xff1a; -n&#xff1a;显示行号&#xff0c;会在输出的每一行前加上行号。 -b&#xff1a;显示行号&#xff0c;…

Relational Algebra(数据库关系代数)

目录 What is an “Algebra” What is Relational Algebra? Core Relational Algebra Selection Projection Extended Projection Product&#xff08;笛卡尔积&#xff09; Theta-Join Natural Join Renaming Building Complex Expressions Sequences of Assignm…

操作系统:进程管理(王道+计算机操作系统)

第二章 进程与线程 2.1进程的概念、组成与特征 2.1.1 进程与程序的区别 ​ 1.程序&#xff1a;静态的&#xff0c;就是放在磁盘里的可执行文件&#xff0c;如&#xff1a;QQ.exe。 ​ 2.进程&#xff1a;动态的&#xff0c;是程序的一次执行过程&#xff0c;如&#xff1a;…

浅谈简历制作的四点注意事项

如大家所了解的&#xff0c;一份工作&#xff0c;往往是从制作一份简历开始。 对于新人来说&#xff0c;简历制作的注意事项&#xff0c;你又了解多少呢&#xff1f;下面一起来看看吧&#xff01; 简历字数&#xff1a;一封合格的简历字数大概在 350 词 – 650 词之间&#xf…

软考-数据库系统工程师-程序设计语言知识要点

小房学堂&#xff0c;程序设计语言知识要点 汇编、编译、解释系统的基础知识 计算机只能理解由0-1组成的指令&#xff0c;就像一个只会本国语言的人&#xff0c;他听不懂其他国家的语言 而程序员编程使用的是低级语言&#xff08;汇编语言&#xff09;或者高级语言如C、C、Jav…

6级翻译学习

找到一个中文句子先看中文句子的主谓宾&#xff0c;主系表 不会写的词不要写&#xff0c;不会影响得分&#xff0c;只要其他地方写对

【Rhino】【Python】adjust repeated column marks

#codingutf-8 import rhinoscriptsyntax as rs import re import System.Guiddef process_column_marks():# 获取目标图层中的所有文本对象layer_name "03 STR. DRAFT MEMBER::COLUMN MARK"text_objects rs.ObjectsByLayer(layer_name, True)if not text_objects o…