在 MASM 8086 程序集的屏幕上显示计时器
Display Timer on Screen in Assembly MASM 8086
我必须在屏幕上显示流逝的时间,我一直在网上寻找并找到如何设置时间延迟但我不知道如何在屏幕上显示它
这是我现在得到的(我什至不知道这是不是这样做的方法)
delay proc
mov ah, 00
int 1Ah
mov bx, dx
jmp_delay:
int 1Ah
sub dx, bx
cmp dl, delaytime
jl jmp_delay
ret
delay endp
可以使用几种方法:
使用 DOS int 21h 显示文本(也许是函数 9?)。
使用BIOS int 10h显示字符
或者最后在B800:0000
处直接写入屏幕
我个人会使用 BIOS 方法。
时间是一个数字,您需要将其转换为字符串才能显示。有很多程序可以做到这一点,接下来我 post 一个(程序 "dollars" 是次要的但必要的):
;------------------------------------------
;CONVERT A NUMBER IN STRING.
;ALGORITHM : EXTRACT DIGITS ONE BY ONE, STORE
;THEM IN STACK, THEN EXTRACT THEM IN REVERSE
;ORDER TO CONSTRUCT STRING (STR).
;PARAMETERS : AX = NUMBER TO CONVERT.
; SI = POINTING WHERE TO STORE STRING.
proc number2string
;FILL BUF WITH DOLLARS.
push si
call dollars
pop si
mov bx, 10 ;DIGITS ARE EXTRACTED DIVIDING BY 10.
mov cx, 0 ;COUNTER FOR EXTRACTED DIGITS.
cycle1:
mov dx, 0 ;NECESSARY TO DIVIDE BY BX.
div bx ;DX:AX / 10 = AX:QUOTIENT DX:REMAINDER.
push dx ;PRESERVE DIGIT EXTRACTED FOR LATER.
inc cx ;INCREASE COUNTER FOR EVERY DIGIT EXTRACTED.
cmp ax, 0 ;IF NUMBER IS
jne cycle1 ;NOT ZERO, LOOP.
;NOW RETRIEVE PUSHED DIGITS.
cycle2:
pop dx
add dl, 48 ;CONVERT DIGIT TO CHARACTER.
mov [ si ], dl
inc si
loop cycle2
ret
endp
;------------------------------------------
;FILLS VARIABLE WITH '$'.
;USED BEFORE CONVERT NUMBERS TO STRING, BECAUSE
;THE STRING WILL BE DISPLAYED.
;PARAMETER : SI = POINTING TO STRING TO FILL.
proc dollars
mov cx, 6
six_dollars:
mov bl, '$'
mov [ si ], bl
inc si
loop six_dollars
ret
endp
前面的程序可以显示时间,下一个例子显示如何使用它们,它也只显示秒(我相信你会自己显示分钟和小时),注意有两个重要的您必须在数据段中创建的变量:
seconds db ? ;◄■■ IMPORTANT VARIABLES IN DATA SEGMENT.
buf db 6 dup (?)
display_time:
;▼ GET SYSTEM TIME.
mov ah, 2ch
int 21h ;◄■■ SECONDS RETURN IN DH.
;▼ TIMER (1 SECOND).
cmp dh, seconds
je display_time ;◄■■ REPEAT UNTIL 1 SECOND PASSED.
mov seconds, dh
;▼ CONVERT SECONDS TO STRING.
xor ax, ax ;◄■■ NUMBER TO CONVERT TO STRING.
mov al, dh ;◄■■ SECONDS IN AX.
lea si, buf ;◄■■ VARIABLE WHERE STRING WILL BE STORED.
call number2string ;◄■■ CALL PROCEDURE THAT CONVERTS NUMBER TO STRING.
;▼ MOVE CURSOR TO 0,0.
mov dl, 0 ;◄■■ X.
mov dh, 0 ;◄■■ Y.
mov ah, 2
mov bh, 0
int 10h
;▼ DISPLAY STRING.
mov ah, 9
lea dx, buf
int 21h
jmp display_time
我必须在屏幕上显示流逝的时间,我一直在网上寻找并找到如何设置时间延迟但我不知道如何在屏幕上显示它 这是我现在得到的(我什至不知道这是不是这样做的方法)
delay proc
mov ah, 00
int 1Ah
mov bx, dx
jmp_delay:
int 1Ah
sub dx, bx
cmp dl, delaytime
jl jmp_delay
ret
delay endp
可以使用几种方法:
使用 DOS int 21h 显示文本(也许是函数 9?)。
使用BIOS int 10h显示字符
或者最后在B800:0000
处直接写入屏幕
我个人会使用 BIOS 方法。
时间是一个数字,您需要将其转换为字符串才能显示。有很多程序可以做到这一点,接下来我 post 一个(程序 "dollars" 是次要的但必要的):
;------------------------------------------
;CONVERT A NUMBER IN STRING.
;ALGORITHM : EXTRACT DIGITS ONE BY ONE, STORE
;THEM IN STACK, THEN EXTRACT THEM IN REVERSE
;ORDER TO CONSTRUCT STRING (STR).
;PARAMETERS : AX = NUMBER TO CONVERT.
; SI = POINTING WHERE TO STORE STRING.
proc number2string
;FILL BUF WITH DOLLARS.
push si
call dollars
pop si
mov bx, 10 ;DIGITS ARE EXTRACTED DIVIDING BY 10.
mov cx, 0 ;COUNTER FOR EXTRACTED DIGITS.
cycle1:
mov dx, 0 ;NECESSARY TO DIVIDE BY BX.
div bx ;DX:AX / 10 = AX:QUOTIENT DX:REMAINDER.
push dx ;PRESERVE DIGIT EXTRACTED FOR LATER.
inc cx ;INCREASE COUNTER FOR EVERY DIGIT EXTRACTED.
cmp ax, 0 ;IF NUMBER IS
jne cycle1 ;NOT ZERO, LOOP.
;NOW RETRIEVE PUSHED DIGITS.
cycle2:
pop dx
add dl, 48 ;CONVERT DIGIT TO CHARACTER.
mov [ si ], dl
inc si
loop cycle2
ret
endp
;------------------------------------------
;FILLS VARIABLE WITH '$'.
;USED BEFORE CONVERT NUMBERS TO STRING, BECAUSE
;THE STRING WILL BE DISPLAYED.
;PARAMETER : SI = POINTING TO STRING TO FILL.
proc dollars
mov cx, 6
six_dollars:
mov bl, '$'
mov [ si ], bl
inc si
loop six_dollars
ret
endp
前面的程序可以显示时间,下一个例子显示如何使用它们,它也只显示秒(我相信你会自己显示分钟和小时),注意有两个重要的您必须在数据段中创建的变量:
seconds db ? ;◄■■ IMPORTANT VARIABLES IN DATA SEGMENT.
buf db 6 dup (?)
display_time:
;▼ GET SYSTEM TIME.
mov ah, 2ch
int 21h ;◄■■ SECONDS RETURN IN DH.
;▼ TIMER (1 SECOND).
cmp dh, seconds
je display_time ;◄■■ REPEAT UNTIL 1 SECOND PASSED.
mov seconds, dh
;▼ CONVERT SECONDS TO STRING.
xor ax, ax ;◄■■ NUMBER TO CONVERT TO STRING.
mov al, dh ;◄■■ SECONDS IN AX.
lea si, buf ;◄■■ VARIABLE WHERE STRING WILL BE STORED.
call number2string ;◄■■ CALL PROCEDURE THAT CONVERTS NUMBER TO STRING.
;▼ MOVE CURSOR TO 0,0.
mov dl, 0 ;◄■■ X.
mov dh, 0 ;◄■■ Y.
mov ah, 2
mov bh, 0
int 10h
;▼ DISPLAY STRING.
mov ah, 9
lea dx, buf
int 21h
jmp display_time