Как я могу сделать уменьшающую задержку? - PullRequest
0 голосов
/ 26 ноября 2010

Я хочу создать подпрограмму в сборке с уменьшением задержки, например:

  • в первый раз будет задержка в 1 сек
  • в следующий раз 700мс
  • до 0 секунд

Ответы [ 3 ]

0 голосов
/ 28 ноября 2010

так как теперь я использую что-то вроде этого:

  • mov al, 0Ah
  • mov bl, 0Ah
  • старт:
  • dec al
  • cmp al, 00h
  • Jne Start

  • мов, 0Ah

  • dec bl
  • cmp bl, 00h
  • Jne Start

  • HLT

но это устойчивый цикл, я хочу, чтобы он уменьшался при каждом выполнении, я знаю, что должен взаимодействовать с внешним регистром / памятью.

0 голосов
/ 28 ноября 2010

, поскольку разные процессоры работают на разных скоростях, вы должны использовать немного другую процедуру. Процессор сохраняет таймер в ячейке памяти 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

Если я понял вашу проблему, это должно сработатьхорошо ..

0 голосов
/ 26 ноября 2010

Напишите подпрограмму задержки, которая принимает значение задержки в качестве параметра.Затем в цикле, который вызывает подпрограмму задержки, вы можете позаботиться об уменьшении значения задержки.В C это может выглядеть примерно так:

void delay(int t)
{
    // ... code here to generate delay of t ms ...
} 

// ...

for (delay_time = 1000; delay_time >= 0; delay_time -= 300) // delay = 1000, 700, 400, 100 ms
{
    // ... do stuff ...

    if (delay > 0) delay(delay_time);
}

Теперь все, что вам нужно сделать, это взять эту общую структуру и перевести ее в asm для любого процессора, который вы используете.

...