当前位置: 首页 > ops >正文

H_Prj06_03 8088单板机串口读取8088ROM复位内存

1.8088CPU复位时,CS=FFFFH,IP=0000H,因此在ROM的逻辑地址FFFF:0000(FFF0H)处一般要防止一个长跳转指令LJMP(机器码位EAH)

2.写一个完整的8086汇编程序,通过查询方式检测串口接收符串‘r’,然后从内存地址FFFF:0000H开始发送16字节数据。程序使用18.432MHz时钟的16550 UART,波特率9600

3.程序

; 串口查询接收'r'后发送内存数据程序
; 硬件配置:
;   PC16550 基地址: 100H
;   时钟频率: 18.432MHz
;   波特率: 9600 bps
;   数据源: FFFF:0000H 开始的16字节内存ORG 100H
JMP START; 数据段
WAIT_MSG DB 'Waiting for "r"...', 0Dh, 0Ah, 0
SENDING_MSG DB 'Sending 16 bytes...', 0Dh, 0Ah, 0
DONE_MSG DB 'Transfer complete!', 0Dh, 0Ah, 0; 16550寄存器偏移地址
UART_BASE EQU 100H
RBR_THR EQU UART_BASE + 0  ; 接收/发送寄存器
LSR     EQU UART_BASE + 5  ; 线路状态寄存器
LCR     EQU UART_BASE + 3  ; 线路控制寄存器
DLL     EQU UART_BASE + 0  ; 除数锁存低字节 (DLAB=1)
DLM     EQU UART_BASE + 1  ; 除数锁存高字节 (DLAB=1); 初始化UART (波特率9600, 18.432MHz时钟)
INIT_UART:; 设置波特率除数(9600 @ 18.432MHz)MOV DX, LCRMOV AL, 80H       ; 设置DLAB=1OUT DX, ALMOV DX, DLL       ; 除数锁存低字节MOV AL, 78H       ; 120 = 78HOUT DX, ALMOV DX, DLM       ; 除数锁存高字节MOV AL, 00H       ; 高位为0OUT DX, AL; 设置线路参数: 8位数据, 1停止位, 无校验MOV DX, LCRMOV AL, 03H       ; 8N1, DLAB=0OUT DX, AL; 禁用中断MOV DX, UART_BASE + 1 ; IERMOV AL, 00HOUT DX, ALRET; 发送单个字符
; 输入: AL = 要发送的字符
SEND_CHAR:PUSH DXPUSH AX; 保存字符MOV AH, ALSEND_WAIT:; 检查发送保持寄存器是否为空MOV DX, LSRIN AL, DXTEST AL, 20H      ; 检查THRE位(bit5)JZ SEND_WAIT      ; 不为空则等待; 发送字符MOV DX, RBR_THRMOV AL, AHOUT DX, ALPOP AXPOP DXRET; 接收单个字符
; 输出: AL = 接收到的字符
RECV_CHAR:PUSH DXRECV_WAIT:; 检查接收数据就绪MOV DX, LSRIN AL, DXTEST AL, 01H      ; 检查DR位(bit0)JZ RECV_WAIT      ; 无数据则等待; 读取字符MOV DX, RBR_THRIN AL, DXPOP DXRET; 发送字符串
; 输入: DS:SI = 字符串地址(以0结尾)
SEND_STRING:PUSH SIPUSH AXSEND_STR_LOOP:LODSB             ; 从[DS:SI]加载字符到AL, SI++OR AL, AL         ; 检查是否结束(AL=0)JZ SEND_STR_DONE  ; 是则结束CALL SEND_CHAR    ; 发送当前字符JMP SEND_STR_LOOP ; 继续发送SEND_STR_DONE:POP AXPOP SIRET; 发送内存块
; 输入: ES:BX = 数据起始地址
;       CX = 数据长度(字节数)
SEND_MEMORY:PUSH AXPUSH BXPUSH CXPUSH DX; 发送状态消息MOV SI, OFFSET SENDING_MSGCALL SEND_STRING; 设置计数器MOV CX,16SEND_MEM_LOOP:; 读取内存字节MOV AL, ES:[BX]; 发送字节CALL SEND_CHAR; 更新指针和计数器INC BXLOOP SEND_MEM_LOOP; 发送完成消息MOV SI, OFFSET DONE_MSGCALL SEND_STRINGPOP DXPOP CXPOP BXPOP AXRET; 主程序
START:; 初始化UARTCALL INIT_UARTAGAIN:   ; 显示等待消息MOV SI, OFFSET WAIT_MSGCALL SEND_STRING; 等待接收字符'r'
WAIT_FOR_R:CALL RECV_CHARCMP AL, 'r'       ; 检查是否收到'r'JNE WAIT_FOR_R    ; 不是则继续等待; 收到'r'后发送内存数据MOV AX, 0ffffH     ; 设置段地址0000HMOV ES, AXMOV BX, 0000H     ; 设置偏移地址2000HCALL SEND_MEMORY  ; 发送512字节数据                JMP  AGAIN; 程序结束MOV AH, 4CHINT 21H    DB  55H,55H,55H,55H,55HEND START

 4.验证

http://www.xdnf.cn/news/12570.html

相关文章:

  • Jetpack Compose 中,DisposableEffect、LaunchedEffect 和 sideEffect 区别和用途
  • 深入解析 CAS 操作
  • Linux 系统、代码与服务器进阶知识深度解析
  • 【Python】当前最稳定3.12版本安装,基于Anaconda的环境配置及换源
  • 力扣面试150题--除法求值
  • 计算矩阵A和B的乘积
  • 基于Python学习《Head First设计模式》第八章 模板方法模式
  • Readest(电子书阅读器) v0.9.53
  • 缓存一致性 与 执行流
  • STM32学习笔记:外部中断(EXTI)原理与应用详解
  • 什么是可恢复保险丝
  • 永恒之蓝(CVE-2017-0146)详细复现
  • day49 python 注意力热图
  • Oracle 客户端深度指南:SQL Developer 与 PL/SQL Developer 全面安装使用教程
  • MySQL中的内置函数
  • 深入剖析Nginx:从入门到高并发架构实战
  • day24 元组和OS模块
  • 十、【ESP32开发全栈指南: TCP客户端】
  • LinkedList、Vector、Set
  • 嵌入式学习笔记 - freeRTOS vTaskPlaceOnEventList()函数解析
  • VirtualBox启动失败@Ubuntu22.04 说是配置文件有问题
  • 使用ORM Bee (ormbee) ,如何利用SQLAlchemy的模型生成数据库表.
  • “组件、路由懒加载”,在 Vue3 和 React 中分别如何实现? (copy)
  • 使用Python和Flask构建简单的机器学习API
  • MySQL事务与锁中的MVCC 深度解析与面试题讲解
  • Spring AI 核心工作流
  • 每日Prompt:治愈动漫插画
  • 基于深度学习的金枪鱼各类别目标检测含完整数据集
  • Strong Baseline: Multi-UAV Tracking via YOLOv12 with BoT-SORT-ReID 2025最新无人机跟踪
  • 【C/C++】实现固定地址函数调用