2017-06-05 96 views
1

我必须显示在屏幕上传递的时间,我一直在网上查找,发现如何设置时间延迟,但我不知道如何显示它在屏幕上 这里是我得到的,现在(我不知道这是否是做的方式)在组装屏幕上显示计时器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 
+1

这不是完美的延迟程序,它会有些工作,但偶尔会等待错误的时间。从这个问题还不清楚,你想要显示什么,除'int 1Ah'之外还有其他服务来获取当前设置的DOS日期/时间,但是如果你想创建类似stopwatch的东西,那么['int 1Ah'](http ://stanislavs.org/helppc/int_1a-0.html)是可以的,它可以让你以54ms的准确度(即十分之一秒,而不是百分之一)进行测量。但是你必须创建一个更复杂的逻辑来处理所有可能的返回状态。 – Ped7g

+0

thestrok3s,如果有任何答案是有用的,你可以点击其复选标记✔接受它。 –

回答

1

时间是一个数字,你需要将它转换为字符串才能显示它。有很多程序要做到这一点,接下来我发布一个(程序“元”是次要的,但有必要):

;------------------------------------------ 
;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 
0

有可能使用此几种方法:

  • 使用DOS INT 21H显示文字(也许功能9?)。

  • 使用BIOS int 10h显示字符。

  • 终于还是在B800直接写屏:0000

个人而言,我会使用的BIOS方法。