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 ,' '
    inc di
    mov byte ,0x07
    pop di                  ;恢复
    jmp start_s1
;------------------------------------------------------------
o_string:                  ;子程序 显示字符串
    ;字符串以0结束,首偏移地址bx,显存地址es:di,字符属性dl
    push ax

    o_string_s mov al,
    cmp al,0
    jne o_string_con

    pop ax
    ret

    o_string_con inc bx
    mov ,al
    inc di
    mov ,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,
    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 ,ah
    inc di
    mov ,dl
    inc di
    mov ,al
    inc di
    mov ,dl
    inc di
    mov al,
    inc si
    mov ,al
    inc di
    mov ,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
```

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还没整明白呢{:1_909:}
页: [1] 2
查看完整版本: 汇编语言显示动态时钟