鱼C论坛

 找回密码
 立即注册
楼主: 无名侠

[技术交流] 汇编 显示系统时间【优化版】

  [复制链接]
发表于 2020-8-22 15:55:05 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-9-3 18:32:58 | 显示全部楼层
DING
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-21 16:33:50 | 显示全部楼层
反正看一下
学习学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-25 14:58:49 | 显示全部楼层
谢谢lz
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-20 19:11:31 From FishC Mobile | 显示全部楼层
完全不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-5 20:45:01 | 显示全部楼层
康康
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-10 14:39:45 From FishC Mobile | 显示全部楼层
感谢分享!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-14 10:53:17 | 显示全部楼层
5
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-18 14:35:14 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-3 14:36:51 | 显示全部楼层
学习一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-30 23:57:53 | 显示全部楼层
支持鱼C,顶一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-31 16:37:31 | 显示全部楼层
666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-6-16 14:09:53 | 显示全部楼层
支持一下!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-21 09:36:12 | 显示全部楼层
正要学这个方法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-27 16:26:57 | 显示全部楼层
学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-7-17 11:47:51 | 显示全部楼层
本帖最后由 行客 于 2024-7-17 11:50 编辑

这个程序是一个汇编语言编写的示例,它旨在通过直接操作硬件端口(这里使用的是端口70h和71h,这通常是IBM PC兼容机的CMOS实时钟访问端口)来获取系统时间,并将其格式化后输出到屏幕的特定区域(通常是文本模式下的显示缓冲区,地址为0xb800h)。程序从数据段读取期望的时间格式(虽然这里实际使用的是硬编码的时间值而不是从硬件时钟读取),然后将时间数据显示在屏幕上。
程序的主要步骤可以概括如下:
1. 数据段定义:定义了一个数据段,其中包含了期望显示的时间数据(硬编码的时间)以及时间格式的分隔符。
2. 段寄存器设置:通过
mov ax, data

mov ds, ax

指令设置数据段寄存器DS指向数据段。
3. 显示缓冲区设置:通过
mov bx, 0b800h


mov es, bx

设置附加段寄存器ES指向文本模式的显示缓冲区地址。
4. 循环处理:使用CX寄存器作为循环计数器,设定为6,因为要分别处理年、月、日、时、分、秒共6个时间元素。
5. 读取和转换时间:在循环内部,首先通过I/O操作读取CMOS时钟的相应端口数据(注:这里的实际操作是错误的,因为直接使用了数据段中的硬编码值而非从硬件时钟读取)。之后,程序将读取到的BCD码(每个单元存放一个BCD数,即用4位二进制表示一个0-9的十进制数)分离成十位和个位,并将它们转换为ASCII码以便显示(通过加上30h,因为ASCII码中数字0的编码是30h + 0)。
6. 格式化输出:转换后的字符被逐一写入显示缓冲区的指定位置,同时包括了从数据段获取的格式分隔符。
7. 结束程序:循环结束后,程序通过
mov ax, 4c00h


int 21h

调用DOS中断结束程序。
注意点:实际上,程序中的时间数据(db 9,8,7,4,2,0)是静态硬编码的,并没有真正从硬件时钟读取实时时间。此外,直接操作硬件端口读取CMOS时钟的方式在这里未正确实现,正确的实现应该是在读取端口70h设置地址后,读取端口71h获取数据。因此,这段代码如果要正确显示实时时间,还需修改以实现从硬件时钟读取时间的功能。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-8 16:21:31 | 显示全部楼层
学习一下咯
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 13:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表