微机接口课设——基于Proteus和8086的打地鼠设计(8255、8253、8259)Proteus中Unknown 1-byte opcode / Unknown 2-byte opcode错误

原理图设计

汇编代码

; I/O 端口地址定义
IOY0 EQU 0600H 
IOY1 EQU 0640H 
IOY2 EQU 0680HMY8255_A EQU IOY0+00H*2     ; 8255 A 口端口地址
MY8255_B EQU IOY0+01H*2     ; 8255 B 口端口地址
MY8255_C EQU IOY0+02H*2     ; 8255 C 口端口地址
MY8255_MODE EQU IOY0+03H*2  ; 8255 模式控制端口地址MY8253_COUNT0 EQU IOY1+00H*2 ;8053 计时器0端口地址
MY8253_COUNT1 EQU IOY1+01H*2 ;8053 计时器1端口地址
MY8253_COUNT2 EQU IOY1+02H*2 ;8053 计时器2端口地址
MY8253_MODE EQU IOY1+03H*2 ;8253 模式控制端口地址MY8259_ODD EQU IOY2
MY8259_EVEN EQU IOY2+01H*2CODE SEGMENTASSUME CS:CODE, DS:DATA,SS:STACK1START:MOV AX,STACK1MOV SS,AXMOV AX,0000HMOV DS,AX;写NMI中断(重置)向量表MOV AX,OFFSET INTNMIMOV SI,02H*4MOV [SI],AXMOV AX,CSMOV [SI+2],AX;写0号中断(慢速)向量表MOV AX,OFFSET INT0MOV SI,20H*4MOV [SI],AXMOV AX,CSMOV [SI+2],AX;写1号中断(快速)向量表MOV AX,OFFSET INT1MOV SI,21H*4MOV [SI],AXMOV AX,CSMOV [SI+2],AX;写2号中断(超时)向量表MOV AX,OFFSET INT2MOV SI,22H*4MOV [SI],AXMOV AX,CSMOV [SI+2],AX;写3号中断(失败)向量表MOV AX,OFFSET INT3MOV SI,23H*4MOV [SI],AXMOV AX,CSMOV [SI+2],AX;这时候再装入数据段,之前让DS段超越是0000(中断向量表特有的要求)MOV AX,DATAMOV DS, AX   ;8255工作方式MOV AL,90H ;A输入 B输出 C输出MOV DX,MY8255_MODE OUT DX,AL;8253工作方式 //写在8259前正好ignore掉定时器2因为装载工作字产生的第一次跳变MOV DX, MY8253_MODEMOV AL, 00110100B ;定时器0,双字节,方式3OUT DX, ALMOV AL,01111000B ;定时器1,双字节,方式4OUT DX,ALMOV AL, 10110100B ;定时器2,双字节,方式2OUT DX,AL;8259工作方式MOV AL,13HMOV DX,MY8259_ODDOUT DX,ALMOV DX,MY8259_EVENMOV AL,20HOUT DX,ALMOV AL,01HOUT DX,ALMOV AL,0E0HOUT DX,ALRESET:STIMOV RESETR,0MOV SCORER,0MOV FAILR,0;8255初始化;B全1MOV AL,0FFH ;B输出全1MOV DX,MY8255_BOUT DX,AL;PC7(发声器)无效,数码管,老鼠灯全部有效MOV AL,00H MOV DX,MY8255_COUT DX,AL;8253初始化;计数器1 60秒一次性中断信号MOV AX,TIMEMOV BX,1000MUL BXMOV DX,MY8253_COUNT1OUT DX,ALMOV AL,AHOUT DX,AL;计数器2 SPEED秒一次老鼠信号MOV AX,SPEEDMOV BX,1000MUL BX MOV DX,MY8253_COUNT2OUT DX,ALMOV AL,AHOUT DX,AL;主工作循环
A0:CALL SHOWDATA ;显示数据CALL SCAN ;扫描键盘CMP ENDR,1JE EDJMP NED
ED:CLI MOV DX,MY8255_CMOV AL, 07FHOUT DX,ALMOV DX,MY8255_BMOV AL,00HOUT DX,ALJMP A0
NED:  CMP RESETR,1JE RESETJMP A0;NMI号中断,处理重置,完成
INTNMI PROCCLIMOV RESETR,1MOV ENDR,0STIIRET
INTNMI ENDP; 0号中断,摸鱼模式,完成
INT0 PROCCLICMP MODE, 0JZ A1MOV SPEED, 5CALL SETSPEEDMOV AL,20HMOV DX,IOY2OUT DX,ALSTI
A1: IRET 
INT0 ENDP
; 1号中断,鸡血模式,完成
INT1 PROCCLICMP MODE, 1JZ A2MOV SPEED, 2CALL SETSPEED ;修改游戏速度MOV AL,20HMOV DX,IOY2OUT DX,ALSTI
A2: IRET
INT1 ENDP; 2号中断,计时结束,完成
INT2 PROCCLIMOV ENDR,1MOV AL,20HMOV DX,IOY2OUT DX,ALSTIIRET
INT2 ENDP; 3号中断,老鼠
INT3 PROCCLICMP ALIVE, 0JZ A3 JMP A4A3: ;若老鼠死了MOV ALIVE,1;死老鼠复活MOV SOLVE,1CALL RANDMOV AL,20HMOV DX,IOY2OUT DX,ALSTIIRETA4: ;若老鼠活着MOV ALIVE,0;杀死老鼠XOR AL,ALMOV AL,SOLVEADD AL,FAILRCMP AL, 2JNA A9MOV ENDR,1
A9:   MOV FAILR,ALMOV AL,20HMOV DX,IOY2OUT DX,ALSTIIRET
INT3 ENDP; 生成0到5的随机数,并将其转换成老鼠放在RATR中
RAND PROC; 线性同余法参数MOV AX, [SEED]       ; 加载当前种子MOV BX, 110355      ; 乘数IMUL BX              ; AX = AX * BX,结果存储在 DX:AXADD AX, 12345       ; 加增量 cMOV BX, 6           ; 限制范围到 0-5XOR DX, DX           ; 清空 DXDIV BX               ; (DX:AX) / BX,余数在 DXMOV SEED, AX       ; 更新种子MOV AL, DL ; 保存灯号(余数)ADD AL,1MOV RATR,ALRET
RAND ENDPDALLY2 PROC ;防抖延迟D0: MOV CX, 8D1: MOV AX, 7D2: DEC AXJNZ D2LOOP D1DEC DLJNZ D0RET
DALLY2 ENDP; 胜利处理过程
WIN PROCINC SCORERMOV SOLVE, 0WIN_LODE: ;打开蜂鸣器,加载音乐MOV DX,MY8255_CMOV AL,11111111B;OUT DX,ALMOV SI, OFFSET WIN_FREQ_LISTMOV DI, OFFSET WIN_TIME_LISTWIN_PLAY: ;播放音乐MOV DX, 0FHMOV AX, 4240HDIV WORD PTR [SI]MOV DX, MY8253_COUNT0OUT DX, ALMOV AL, AHOUT DX, ALMOV DL, [DI]CALL DALLY3ADD SI, 2INC DICMP WORD PTR [SI], 0JE NOTWINJMP WIN_PLAYNOTWIN:MOV DX,MY8255_CMOV AL,01111111B;OUT DX,ALRET
WIN ENDP; 失败处理过程
LOSE PROCINC FAILRMOV SOLVE, 0CMP FAILR, 2JNA NOTEDMOV ENDR, 1NOTED:    
LOSE_LODE: ;打开蜂鸣器,加载音乐MOV DX,MY8255_CMOV AL,11111111B;OUT DX,ALMOV SI, OFFSET LOSE_FREQ_LISTMOV DI, OFFSET LOSE_TIME_LISTLOSE_PLAY: ;播放音乐MOV DX, 0FHMOV AX, 4240HDIV WORD PTR [SI]MOV DX, MY8253_COUNT0OUT DX, ALMOV AL, AHOUT DX, ALMOV DL, [DI]CALL DALLY3ADD SI, 2INC DICMP WORD PTR [SI], 0JE NOTLOSEJMP LOSE_PLAYNOTLOSE:MOV DX,MY8255_CMOV AL,01111111B;OUT DX,ALRET
LOSE ENDPSETSPEED PROC ;设定游戏速度MOV AX, SPEEDMOV BX,1000MUL BXMOV DX, MY8253_COUNT2OUT DX, ALMOV AL,AHOUT DX,ALRET
SETSPEED ENDPSHOWDATA PROC ;展示数据到数码管CALL PUTBUFCALL DISDATARET
SHOWDATA ENDPDISDATA PROC ;读取缓冲区,数码管显示MOV SI, 3005H       ; 将SI寄存器指向显示缓冲区起始地址MOV CX,6
AGAIN: MOV AL,1DEC CLROL AL,CLINC CLNOT ALAND AL,01111111BMOV DX, MY8255_C    ;位选OUT DX, AL          ; 输出显示码到端口CMOV AL, [SI]        ; 读取缓冲区中的字符MOV BX, OFFSET DTABLEAND AX, 00FFH       ; 获取字符的低字节ADD BX, AX          ; 计算DTABLE的偏移地址MOV AL, [BX]        ; 读取显示码MOV DX, MY8255_BOUT DX, AL          ; 输出显示码到端口BCALL DALLYDEC SI              ; 移动到下一个缓冲区位置LOOP AGAIN           ; 继续输出字符CMP ALIVE,0JE OMITMOV AL,00111111BMOV DX,MY8255_COUT DX,ALMOV AL, RATR        ; 读取老鼠位置MOV BX, OFFSET DTABLEAND AX, 00FFH       ; 获取字符的低字节ADD BX, AX          ; 计算DTABLE的偏移地址MOV AL, [BX]        ; 读取显示码MOV DX, MY8255_BOUT DX, AL          ; 输出显示码到端口BCALL DALLYOMIT:    RET                 ; 返回
DISDATA ENDP
PUTBUF PROC ;写入缓冲区;读计数器1(游戏时间)计数器值;MOV AL,80H;MOV DX,MY8253_MODE ;锁存;OUT DX,AL;MOV DX,MY8253_COUNT1;IN AL,DX;MOV AH,AL;IN AL,DX;XCHG AH,AL ;读出计数值;XOR DX,DX;MOV BX,1000 ;DIV BX ;得到秒数MOV SI, 3000H;MOV BL,10;DIV BL;此时AH是余数个位,AL是十位MOV AL,0MOV AH,0MOV [SI], ALMOV [SI+1], AHXOR AH,AHMOV AL,SCORERMOV BL,10DIV BL;此时AH是余数个位,AL是十位MOV [SI+2], ALMOV [SI+3], AHXOR AH,AHMOV AL,FAILRMOV BL,10DIV BL;此时AH是余数个位,AL是十位MOV [SI+4], ALMOV [SI+5], AHRET
PUTBUF ENDPDALLY PROC ;显示延迟PUSH CX             ; 保存CX寄存器的值MOV CX, 8      ; 设置延时计数器
T1: MOV AX, 40       ; 进入内层循环
T2: DEC AX              ; 递减AXJNZ T2              ; 如果AX不为零,继续循环LOOP T1             ; 每次循环,CX寄存器减1POP CX              ; 恢复CX寄存器的值RET                 ; 返回
DALLY ENDP
DALLY3 PROC ;音乐延时PUSH CXPUSH AX
A6:    MOV CX,16
A7:MOV AX,200
A8:DEC AX JNZ A8LOOP A7DEC DLJNZ A6POP AXPOP CXRET 
DALLY3 ENDP 
CLEAR PROCMOV DX, MY8255_BMOV AL, 00HOUT DX, AL            ; 清除显示数据RET
CLEAR ENDPSCAN PROC ;扫描按键MOV DX,MY8255_AIN AL,DXNOT ALAND AL, 00111111BMOV HITR,ALCMP HITR, 0JZ A5CALL DALLY2CMP HITR,0JZ A5 ;防抖JNZ DICIDE
A5:RET
SCAN ENDPDICIDE PROC ;决策函数CMP ALIVE,1JNE DICIDEL; 将HITR和RATR加载到AL和BL中MOV AL, HITRMOV BL, RATRDEC BL; 将RATR转换成对应的位掩码XOR CX, CX      ; 清除CX,用于计数MOV CL, BL      ; 将RATR的值移动到CL作为循环计数MOV BH, 01H     ; 准备初始掩码00000001bROL BH,CLCOMPARE:AND AL, BH      ; 比较HITR和转换后的RATR掩码JNZ DICIDEW         ; 如果两个值相等,跳转到WINJMP DICIDEL        ; 否则跳转到LOSE
DICIDEW:CALL WINRET
DICIDEL:CALL LOSERET
DICIDE ENDPCODE ENDSSTACK1 SEGMENT PARA STACKDW 1000H DUP(?)
STACK1 ENDSDATA SEGMENT; 数据段定义 ;时间相关TIME DW 60      ; 游戏时间设置 60SSPEED DW 5 ;老鼠出现时间间隔 5s;计数相关;时间计数器由计数器2负责SCORER DB 1       ; 打中地鼠的数量计数器FAILR DB 2   ; 失败次数计数器MODE DB 0 ;游戏模式,0摸鱼模式,1鸡血模式;重置相关RESETR DB 0 ;重置表示,1重置;结束相关ENDR DB 0 ;结束表示,1结束;音乐相关WIN_FREQ_LIST DW 1100, 800,0LOSE_FREQ_LIST DW 392, 120,0WIN_TIME_LIST DB 1,1LOSE_TIME_LIST DB 1,1;老鼠存在相关ALIVE DB 0;老鼠存在表示,1存在;决策相关RATR DB 0HITR DB 0SOLVE DB 0;数码管相关DTABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH  ; 0~9的显示码; LCG 参数SEED DW 12345D ; 生成随机数种子DATA ENDS
END START

Proteus中Unknown 1-byte opcode / Unknown 2-byte opcode错误的可能解决方案

  1. 没用的电路要断开,或者连了外设就要写控制方式字
  2. 数据段要在写完中断向量表之后装载到DS中(这里主要是因为用了DS:SI)
  3. 使用单片8259也要写ICW4
  4. 数据段放在代码段后面
  5. 栈开大一点
  6. 8086内存给够

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/65182.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024年12月一区SCI-加权平均优化算法Weighted average algorithm-附Matlab免费代码

引言 本期介绍了一种基于加权平均位置概念的元启发式优化算法,称为加权平均优化算法Weighted average algorithm,WAA。该成果于2024年12月最新发表在中JCR1区、 中科院1区 SCI期刊 Knowledge-Based Systems。 在WAA算法中,加权平均位置代表当…

实现某海外大型车企(T)Cabin Wi-Fi 需求的概述 - 4

大家好,我是Q,邮箱:1042484520qq.com。 今天我们在上几讲的基础上再扩展下 Cabin Wi-Fi 的功能需求,讲讲如何使能 5G TCU Wi-Fi STA Bridge 模式。 参考: 实现某海外大型车企(T)Cabin Wi-Fi 需求…

《CS2》报错dxgi.dll缺失怎么办?《CS2》游戏提示dxgi.dll缺失要怎么解决?

一、dxgi.dll缺失的根源 游戏安装问题:dxgi.dll文件是DirectX图形接口的一部分,如果游戏安装不完整或安装过程中出现问题,可能会导致该文件缺失。 系统更新或配置变动:Windows操作系统的更新或某些系统配置的变动,有时…

Level DB --- MemTable

MemTable是Level DB中重要的组件,它主要处理Level DB内存级别的增删查改。 基本数据结构 基础的存储数据结构如图1所示,这是一个存储单元的结构。其中1是internal key size,这里面包括两部分,一部分我们Level DB存储key-value中…

SDK 设备树创建

嘿嘿,好使 好使 好使 设备树相同的平台环境,但是细微差异的补充配置

【hackmyvm】Adroit靶机wp

tags: HMVjava反编译SQL注入 1. 基本信息^toc 文章目录 1. 基本信息^toc2. 信息收集3. java反编译4. sql注入5. 解密密码6. 提权 靶机链接 https://hackmyvm.eu/machines/machine.php?vmAdroit 作者 alienum 难度 ⭐️⭐️⭐️⭐️️ 2. 信息收集 ┌──(root㉿kali)-[~] └…

OSCP课后练习-tcpdump

本篇文章旨在为网络安全渗透测试行业OSCP考证教学。通过阅读本文,读者将能够对tcpdump日志分析关键信息过滤有一定了解 1、下载练习分析文件 wget https://www.offensive-security.com/pwk-online/password_cracking_filtered.pcap2、查看分析文件所有内容 sudo t…

Windows下C++使用SQLite

1、安装 进入SQLite Download Page页面,下载sqlite-dll-win-x86-*.zip、sqlite-amalgamation-*.zip、sqlite-tools-win-x64-*.zip三个包,这三个包里分别包含dll文件和def文件、头文件、exe工具。 使用vs命令行工具生成.lib文件:进入dll和def文…

文件上传绕过最新版安全狗

更多网安思路,可前往无问社区 http分块传输绕过 http分块传输⼀直是⼀个很经典的绕过⽅式,只是在近⼏年分块传输⼀直被卡的很死,很多waf都开始加 ⼊了检测功能,所以的话,分块传输这⾥也不是很好使,但是配…

搭建Elastic search群集

一、实验环境 二、实验步骤 Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎Elasticsearch目录文件: /etc/elasticsearch/elasticsearch.yml#配置文件 /etc/elasticsearch/jvm.options#java虚拟机 /etc/init.d/elasticsearch#服务启动脚本 /e…

正点原子串口例程解读

首先是串口初始化,这里初始化的是usart3 void esp8266_init(void) {huart_wifi.InstanceESP8266; //uart3huart_wifi.Init.BaudRate115200; // 设置波特率为115200huart_wifi.Init.WordLengthUART_WORDLENGTH_8B; // 设置数据位长度为8位huart_wifi.Init.StopBi…

KVM虚拟机管理脚本

思路: 在/opt/kvm下创建一个磁盘文件,做差异镜像,创建一个虚拟机配置文件,做虚拟机模版 [rootnode01 ~]# ls /opt/kvm/ vm_base.qcow2 vm_base.xml创建虚拟机的步骤:首先创建虚拟机的差异镜像,然后复制虚…

Null value was assigned to a property of primitive type setter of 的原因与解决方案

Null value was assigned to a property of primitive type setter of 的原因与解决方案 org.hibernate.PropertyAccessException: Null value was assigned to a property of primitive type setter of com.xxx.xxx.DealerUser.dealerId数据库表结构 实体类 当数据库的dealer…

【数据结构与算法】排序算法(下)——计数排序与排序总结

写在前面 书接上文:【数据结构与算法】排序算法(中)——交换排序之快速排序 文章主要讲解计数排序的细节与分析源码。之后进行四大排序的总结。 文章目录 写在前面一、计数排序(非比较排序)代码的实现: 二、排序总结 2.1、稳定性 3.2、排序算法复杂度及…

Multi移动端开发

Multi移动端开发 安装环境 安装功能 VS2022安装 【ASP.NET和Web开发】、【.NET Multi-platform App UI开发】、【.NET桌面开发】 配置程序源 【工具】–>【选项】–>【NuGet包管理器】–>【程序包源】,添加如下: 名称:MES_APP 源&…

若依plus apifox导入接口显示为空

项目已经正常启动 访问接口有些没问题,有些有问题 其他模块都可以正常导入 解决:

音视频入门基础:AAC专题(13)——FFmpeg源码中,获取ADTS格式的AAC裸流音频信息的实现

音视频入门基础:AAC专题系列文章: 音视频入门基础:AAC专题(1)——AAC官方文档下载 音视频入门基础:AAC专题(2)——使用FFmpeg命令生成AAC裸流文件 音视频入门基础:AAC…

英文学术会议海报poster模板【可编辑】

英文学术会议海报poster模板【可编辑】 下载链接:学术会议海报poster模板【可编辑】 横版海报 竖版海报 下载链接:学术会议海报poster模板【可编辑】 提供了一套学术海报的PPT模板,适用于学术会议、研讨会等场合。 竖版,包含11…

机器学习之KNN算法预测数据和数据可视化

机器学习及KNN算法 目录 机器学习及KNN算法机器学习基本概念概念理解步骤为什么要学习机器学习需要准备的库 KNN算法概念算法导入常用距离公式算法优缺点优点:缺点︰ 数据可视化二维界面三维界面 KNeighborsClassifier 和KNeighborsRegressor理解查看KNeighborsRegr…

Jmeter自学【8】- 使用JMeter模拟设备通过MQTT发送数据

今天使用jmeter推送数据到MQTT,给大家分享一下操作流程。 一、安装JMeter 参考文档:Jmeter自学【1】- Jmeter安装、配置 二、安装MQTT插件 1、下载插件 我的Jmeter版本是5.6.3,用到的插件是:mqtt-xmeter-2.0.2-jar-with-depe…