时间是一个数字,你需要将它转换为字符串才能显示它。有很多程序要做到这一点,接下来我发布一个(程序“元”是次要的,但有必要):
;------------------------------------------
;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
这不是完美的延迟程序,它会有些工作,但偶尔会等待错误的时间。从这个问题还不清楚,你想要显示什么,除'int 1Ah'之外还有其他服务来获取当前设置的DOS日期/时间,但是如果你想创建类似stopwatch的东西,那么['int 1Ah'](http ://stanislavs.org/helppc/int_1a-0.html)是可以的,它可以让你以54ms的准确度(即十分之一秒,而不是百分之一)进行测量。但是你必须创建一个更复杂的逻辑来处理所有可能的返回状态。 – Ped7g
thestrok3s,如果有任何答案是有用的,你可以点击其复选标记✔接受它。 –