, поскольку разные процессоры работают на разных скоростях, вы должны использовать немного другую процедуру. Процессор сохраняет таймер в ячейке памяти 40: 6ch, как написано в книге Рэндалла Хайда "Язык ассемблера:
Сейчас мы просто воспользуемся тем, что этот чип таймера заставляет ЦП увеличивать 32-битную ячейку памяти (40: 6 каналов) примерно в 18,2 раза в секунду.Посмотрев на эту переменную, мы можем определить скорость ЦП и соответствующим образом настроить значение счетчика для пустого цикла.
Основная идея следующего кода - наблюдать переменную таймера BIOS, пока она не изменится.Как только он изменится, начните считать количество итераций в некотором цикле, пока переменная таймера BIOS снова не изменится.Отметив количество итераций, если вы выполняете аналогичный цикл одинаковое количество раз, для его выполнения потребуется около 1 / 18,2 секунды.
Это процедура задержки Пола Р.
Тогда вы могли бы сделать процедуру, подобную той, которую вы уже используете, но которая требует задержки по оси (я предполагаю, что вы работаете только с 16-битным регистром, верно?).Попробуйте использовать ах вместо bl, чтобы вы могли вычесть, скажем, 0400h из топора перед вызовом этой процедуры:
<code>
mov ax, ffffh ; probably you'll need to tune this value</p>
<p>a: ; your printing code<br>
sub ax, 0400h ; and this one too
push ax ; it needs to be saved because
call delay ; delay resets it
pop ax<br>
; ... ...<br>
j?? a
main endp<br>
proc delay
push bx ; save bx's contents
mov bl, al ; and a copy of al
l1: dec al ; loop until al > 0<br>
; here you can add some delaying instructions, like scanning
; quite long strings with repne scasb<br>
jnz l1
mov al, bl ; restore al's original value
dec ah ; decrease ah
jnz l1 ; and loop until > 0
pop bx
ret
delay endp
Если я понял вашу проблему, это должно сработатьхорошо ..