吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2875|回复: 11
收起左侧

[其他转载] 汇编语言显示动态时钟

[复制链接]
HJ07 发表于 2022-3-4 12:52
之前学了《x86汇编语言》(李忠),现在来复习一下。
练习访问CMOS RAM获取,动态显示时钟。涉及端口访问和很多具体规范,比如BCD码和ASCII码的转换。显示更新间隔不是每秒,而是不断更新,导致CPU占用较高。

运行图

运行图


    ; clock.asm
    ; Coco07
    ; 硬盘主引导扇区程序 动态时钟显示
    ; 2022.3.4

SECTION main vstart=0x7c00
    jmp start
;----------data
    stack times 32 dw 0
    string_hello db 'Hello! Welcome to Coco07 World.',0
 start:                     ;主程序
;----------code
    ;-初始化-
    mov ax,stack
    mov ss,ax
    xor ax,ax
    mov sp,ax

    mov ax,0xb800
    mov es,ax
    xor ax,ax
    mov di,ax
    ;-显示字符串-
    mov dl,0x07             ;黑底白字
    mov bx,string_hello
    call o_string
    ;-显示时间-
    mov dl,0x04             ;黑底红字
    mov ax,12*160+27*2      ;日期/时间从12行27列开始显示
    mov di,ax

    start_s1 push di        ;备份
    call o_date_time
    mov byte [es:di],' '
    inc di
    mov byte [es:di],0x07
    pop di                  ;恢复
    jmp start_s1
;------------------------------------------------------------
 o_string:                  ;子程序 显示字符串
    ;字符串以0结束,首偏移地址bx,显存地址es:di,字符属性dl
    push ax

    o_string_s mov al,[bx]
    cmp al,0
    jne o_string_con

    pop ax
    ret

    o_string_con inc bx
    mov [es:di],al
    inc di
    mov [es:di],dl
    inc di
    jmp o_string_s
;------------------------------------------------------------
 o_date_time:               ;子程序 获取/显示日期和时间(CMOS RAM)
    ;显示格式:年/月/日-周 时:分:秒,显存地址es:di,字符属性dl
;----------code
    push ax
    push cx
    push si
    ;-获取-
    xor ax,ax
    mov si,ax
    mov cx,7
    o_dt_s1 mov al,[o_dt_w1+si]
    or al,0x80
    out 0x70,al
    in al,0x71
    call bcd_to_ascii
    push ax
    inc si
    loop o_dt_s1
    ;-显示-
    xor ax,ax
    mov si,ax
    mov cx,7
    o_dt_s2 pop ax
    mov [es:di],ah
    inc di
    mov [es:di],dl
    inc di
    mov [es:di],al
    inc di
    mov [es:di],dl
    inc di
    mov al,[o_dt_w2+si]
    inc si
    mov [es:di],al
    inc di
    mov [es:di],dl
    inc di
    loop o_dt_s2

    pop si
    pop cx
    pop ax
    ret
;----------data
    o_dt_w1 db 0,2,4,6,7,8,9
    o_dt_w2 db '//- :: '    ;分隔
;------------------------------------------------------------
 bcd_to_ascii:              ;子程序 BCD转ASCII
    ;BCD码al,转换为ASCII码ah和al
    push cx

    mov ah,al               ;拆分成两个数字
    and al,0b00001111       ;低4位
    add al,'0'
    shr ah,4
    and ah,0b00001111       ;高4位
    add ah,'0'

    pop cx
    ret
;------------------------------------------------------------
    times 510-($-$$) db 0
    db 0x55,0xaa

免费评分

参与人数 5吾爱币 +10 热心值 +4 收起 理由
tohyueyun + 1 谢谢@Thanks!
yiic + 1 谢谢@Thanks!
sniper9527 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
michiless + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

tohyueyun 发表于 2022-5-23 22:31
x86汇编语言。大学时期,折腾脑袋的一本学科。但是获益良多。
之前,跟同学一起完成了,trigonometry 计算机。SIN TAN COS 转换
Fxmles 发表于 2022-3-4 13:06
losingstars 发表于 2022-3-4 13:11
52soft 发表于 2022-3-4 13:37
牛逼的楼主
Raohz520 发表于 2022-3-4 13:42
汇编动态时钟,狠人啊!
明月相照 发表于 2022-3-4 15:41
Hello! Welcome to Coco07 World
想起第一个学习汇编时第一个  Hello World
xuson 发表于 2022-3-4 15:53
汇编大神,拜膜。一直想学,但无从入手
gaotg 发表于 2022-3-4 15:55
怀念中学学的QBASIC
wapj小新手 发表于 2022-3-4 16:14
一直没学懂汇编,一直弄不明白是什么实现的
a2504278 发表于 2022-3-6 12:48
汇编的都是大佬,我C还没整明白呢
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 07:08

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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