汇编语言显示动态时钟
之前学了《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
```
x86汇编语言。大学时期,折腾脑袋的一本学科。但是获益良多。
之前,跟同学一起完成了,trigonometry 计算机。SIN TAN COS 转换 汇编大佬,膜拜 一直没学懂汇编。 牛逼的楼主 汇编动态时钟,狠人啊! Hello! Welcome to Coco07 World
想起第一个学习汇编时第一个Hello World 汇编大神,拜膜。一直想学,但无从入手 怀念中学学的QBASIC 一直没学懂汇编,一直弄不明白是什么实现的 汇编的都是大佬,我C还没整明白呢{:1_909:}
页:
[1]
2