2013-03-09 4 views
1

Привет, я сделал программу, которая будет вращать два символа - \ и /, но я не знаю, как установить cx counter в вложенных циклах, может кто-нибудь дать мне совет или помочь мне?Сборка x86 Задержка цикла

здесь код той части

program: 
     mov ah, 0fh ; function - get video mode 
     int 10h 
     push ax  ; save number of columns 
     push bx  ; save page number 
     mov ah, 0  ; function - set video mode 
     int 10h 

     mov al, 0003h  ;set video mode 
     int 10h 

     mov cx,10d ; Outer loop counter how many symbols rotate 

     mov bx,50d ; this is for delay loop 
     OuterLoop: 
     push cx 

     mov ah,02h 
     mov bh, 0  ;cursor set 
     mov dh, 2 
     mov dl, 10 
     int 10h 

     mov AH,0Ah 
     mov al,"/" symbol/
     mov bh,0 
     mov cx,1 
     int 10h 

     mov cx,bx 
     call Delay  ;delay loop 
     sub bx,15d 

     mov ah,02h 
     mov bh, 0 
     mov dh, 2   cursor set 
     mov dl, 10 
     int 10h 

     mov AH,0Ah 
     mov al,"\"    ;symbol \ 
     mov bh,0 
     mov cx,1 
     int 10h 


     mov cx,bx 
     call Delay ; another delay 
     sub bx,10 


     pop cx  ; Restore current CX 
     loop OuterLoop 

     jmp START  ; and after end it should jump to start where is menu with choices 

он должен работать, как эта задержка

записи/ , например, 10 сек записи \ задержка 8 сек и перейти к началу и петли

это м у задержка процедура

Delay PROC NEAR     ; 

    push ds      ; 
    push si      ; 
    push ax      ; 
    xor  ax, ax     ;AX = 0 
    mov  ds, ax     ;DS = 0 
    mov  si, 046Ch    ; 
t1:  mov  ax, [si]    ; 
t2:  cmp  ax, [si]    ; 
    je  t2      ; 
    loop t1      ; 
    pop  ax      ; 
    pop  si      ; 
    pop  ds      ; 
    ret        ; 

Delay ENDP       ; 

я все еще работаю над этим приложением, но он не работает все мне нужно, это шаги, которые будут сделаны

программа: начало цикла \ задержки задержки в 100 раз / задержка задержки 80 раз петля и после каждого цикла, чтобы уменьшить задержку, как это 100 раз 80,60,40 и так далее, но я не знаю, куда положить push и pop cx, потому что моя процедура задержки работает с cx. я просто устанавливаю cx, например, до 100, и это задерживает и так далее.

+0

Насколько точна ваша задержка? Требуется ли программе Задержка такой же суммы в режиме настенных часов на процессорах с разными тактовыми частотами процессора (ГГц)? – amdn

+0

Нет, я не хочу точной задержки, как 5 секунд 4 и так далее, просто задержка. я хочу записать/задержать, например, 10 секунд, а затем \ и задержать 8 секунд, и зациклировать это и уменьшить количество секунд, когда я выложу процедуру задержки, если вы хотите –

+0

Конечно, продолжайте и отправляйте свою процедуру задержки. – amdn

ответ

1

Я вижу две проблемы:

во-первых, bx инициализируется здесь

mov bx,50d ; this is for delay loop 

, но затем он получает перезаписан

mov bh, 0 

bh является бит 15: 8 из bx

Во-вторых, в процедуре «Задержка» , что изменяет местоположение на [si], так что ветка je t2 падает? Как можно заметить, что это бесконечный цикл:

xor  ax, ax     ;AX = 0 
mov  ds, ax     ;DS = 0 
mov  si, 046Ch    ; 
t1:  mov  ax, [si]  ; 
t2:  cmp  ax, [si]  ; 
     je  t2    ; 
     loop t1    ; 

Update: Я обнаружил, что адрес 0x46c является адрес BIOS, который содержит информацию о времени.

http://www.osdata.com/system/physical/lowmem.htm

Так память вы смотрите в этом цикле является место актуализация BIOS со счетчиком тиков таймера (отсчетов каждые 54,9 миллисекунд), см

http://code.google.com/p/xtideuniversalbios/source/browse/trunk/Assembly_Library/Src/Time/TimerTicks.asm?spec=svn131&r=131

Поэтому для ответа ваш вопрос, прежде чем вызывать свою Delay процедуру, вы должны загрузить CX с подсчетом тиков BIOS, которые вы хотите задержать (время в миллисекундах разделено на 54,9).

+0

Я обнаружил, что процедура задержки в Интернете я не знаю, как это работает, я просто знаю, что он работает, и все это, и он задерживает программу, когда я устанавливаю cx, и мне нужно переписать символы в одной позиции курсора так \ переписывают/сначала я хотел использовать backspace, но он не работал, поэтому мой друг помог мне с этими инструкциями с установленным курсором и так далее, поэтому я не знаю, как их заменить, и не используйте этот push –

+0

теперь я узнал, как переписывать символы без использования push. я буду использовать int 21h, и я создал новую петлю задержки –

+0

mov bh, 0 не переписывает значение 50h, перемещенное в bx. Это избыточно или излишне, но не вредно. 50h хранится в битах 7-0 из bx. OTOH, нет гарантии, что int 10h сохранит переданные значения параметров. –

0

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

Cursor_Speed = 7 
;-------------DATA-------------------------------------- 
      CURFLAG DB 0, 0, 0, 0 
      ALTVEC DD 0 
;-------------CODE-------------------------------------- 
      cli 
      xor  ax, ax 
      mov  es, ax 
      mov  ebx, DWORD PTR es:[8*4] ; Get the old Vector (Offset/Segment) 
      mov  DWORD PTR[ALTVEC], ebx ; save it 
      mov  cs:DWORD PTR[OLDVEC], ebx 
      mov  es:[8*4], OFFSET NEWVEC ; Set the new IRQ-Vector 
      mov  es:[(8*4)+2], cs 

      mov  al, 36h     ; Set 18,2 Hertz(Standard) 
      out  43h, al 
      xor  al, al 
      out  40h, al   ; low 
      out  40h, al   ; high 
      sti 
;--------------------------------------------------- 
      ...... 
;--------------------------------------------------- 
NEWVEC: inc  BYTE PTR[CURFLAG+1] 
      cmp  BYTE PTR[CURFLAG+1], Cursor_Speed 
      jb short NOHIT 
      mov  BYTE PTR[CURFLAG+1], 0 
      xor  BYTE PTR[CURFLAG], 1 

NOHIT: DB 0EAh       ; jmp far 
OLDVEC DD 0 
;--------------------------------------------------- 

....

Alternativly мы можем ждать от vsinc с опроса порта 3DAh для стать немного меньшей задержки precice.

Dirk

Смежные вопросы