大甲鱼11
发表于 2020-8-22 15:55:05
{:5_90:}
yuesezhenmei
发表于 2020-9-3 18:32:58
DING
663725461
发表于 2021-6-21 16:33:50
反正看一下
学习学习
samsara419
发表于 2021-12-25 14:58:49
谢谢lz
snrjtg1
发表于 2022-3-20 19:11:31
完全不懂
hjmwfbwy
发表于 2022-4-5 20:45:01
康康
zzxhh628
发表于 2022-4-10 14:39:45
感谢分享!
金熙川
发表于 2022-4-14 10:53:17
5
辉zi
发表于 2023-4-18 14:35:14
{:10_279:}
qazedc12345
发表于 2023-7-3 14:36:51
学习一下
黑色传说
发表于 2024-5-30 23:57:53
支持鱼C,顶一下
高山我梦
发表于 2024-5-31 16:37:31
666
qq363909123
发表于 2024-6-16 14:09:53
支持一下!
intrant
发表于 2024-6-21 09:36:12
正要学这个方法
wationg
发表于 2024-6-27 16:26:57
学习
行客
发表于 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获取数据。因此,这段代码如果要正确显示实时时间,还需修改以实现从硬件时钟读取时间的功能。
惊鸿一丿
发表于 2024-8-8 16:21:31
学习一下咯