Я пишу функцию задержки в сборке 8086. Для этого я использую системное время. Сначала я перезапускаю время, а затем зацикливаю до тех пор, пока системное время не станет равным или больше времени, которое я хотел ожидать.Сборка 8086: странное поведение системного времени
Это не должно быть очень сложно. Так что это моя процедура задержки:
delay_using_time PROC NEAR
push bp
mov bp, sp
push ax
push bx
push cx
push dx
; Set system time (CH = Hour, CL = minute, DH = second, DL = 1/100 sec)
mov ah, 2Dh
xor cx, cx ; Now CH = 0 = CL
xor dx, dx ; DX = 0 = DH = DL
int 21h
; We check that the reset did not failed
CMP al, 0 ; Als al = 255 dan is het setten van de system time mislukt
JNE exit_delay
mov bl, [bp+4][0] ; We put the argument in BL --> wait time
; Debug --> Prints always 0 (so reset was succesfull)
mov dl, dh
xor dh, dh
push dx
call tprint
; Loop untill DL = wait time, but the problem is DL is immediately bigger
compareTime:
mov ah, 2Ch
int 21h ; #sec in DH, #1/100 sec in DL
; For debug --> I print the number of seconds passed since we reset the time
mov dl, dh
xor dh, dh
push dx
call tprint
; If #seconds < wait time (argument) --> loop again until #seconds >= wait time
CMP dl, bl
JL compareTime
JMP exit_delay
exit_delay:
pop dx
pop cx
pop bx
pop ax
mov sp, bp
pop bp
ret 2
delay_using_time ENDP
Но моя процедура задержки не работает. Поэтому я помещаю в него дисплеи, чтобы узнать, откуда эта проблема.
Сначала я показываю секунды после сброса системного времени. Он отображает 0, поэтому системное время было сброшено правильно. После этого в цикле я показываю количество секунд, прошедших с момента сброса системного времени. Я бы ожидал, что что-то вроде этого 1,1, ..., 1, 2, 2, ..., 2, 3 будет отображаться, когда я передам аргумент 3 (так что я хочу отложить на 3 секунды). (каждый номер отображается много раз, потому что он циклический, и он повторяется много раз в секунду).
Но Когда я проверяю свою процедуру, я вижу цикл выполняется только один раз, когда я вызываю задержку! Таким образом, он отображает непосредственно, например, «54» вместо 1, 2, 3, ..., 54 (что можно было бы ожидать).
Может кто-нибудь сказать мне, почему он так себя ведет? Я действительно не понимаю, я сначала сбросил системное время и отобразил его, чтобы убедиться, что он был сброшен, а затем в цикле я показываю количество секунд. Таким образом, число секунд скачка сразу с 0 (когда я его сбросил), например, 54.
Спасибо за помощь!
Почему вы устанавливаете время с ah = 2d, во-первых? Также я не уверен, что любой вызов gettime уничтожает любые регистры. Более того, вы уничтожаете dl с mov dl, dh. – bestsss
@bestsss Я впервые установил время до полуночи (час, минуты, секунды и сотни до нуля), потому что я передаю в качестве аргумента моей функции время, которое ему приходится задерживать/спать. Поэтому, как только я сброшу время до полуночи, после этого все, что мне нужно сделать, это проверить время и сравнить секунды (время, прошедшее с момента его сброса) с аргументом, переданным процедуре. Если время прошло, то аргумент I снова зациклился. Так что я зацикливаюсь, пока не пройдет время> = аргумент. И дайте время поставить свой результат в регистры CX и DX: CH = час CL = минут DH = второй DL = 1/100 секунд.Set time info: http://bit.ly/1Bp9gTu – HyperZ
@bestsss Я уничтожаю dl с mov dl, dh, потому что хочу передать количество секунд (dh) в процедуру, которая будет отображать аргумент (это число, переданное через стек). Поэтому, если я нажму DX на стек, отображаемое число будет неправильным, потому что DX = (DH DL). Итак, чтобы правильно отобразить количество секунд (dh), я копирую DH в DL. Затем очистите DH (xor dh, dh), чтобы при отображении содержимого DX он фактически отобразил DL (поскольку DH является нулевым и, следовательно, не изменит значение DL). Извините за двойной комментарий, но он должен был долго вписываться в один комментарий. – HyperZ