汇编x86延迟循环

时间:2013-03-09 14:55:44

标签: loops assembly x86 delay

嗨我制作了旋转两个符号的程序 - \和/但我不知道如何在嵌套循环中设置cx计数器有人可以给我建议或帮助我吗?

这是该部分的代码

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等等,但我不知道在哪里放推和弹出cx因为我的延迟程序正在使用cx。我只是将cx设置为100,它会延迟,等等。

2 个答案:

答案 0 :(得分:1)

我看到两个问题:

首先,bx在此初始化

mov bx,50d  ;   this is for delay loop

然后它被

覆盖了
mov bh, 0

bhbx

的第15:8位

其次,在延迟过程中,是什么修改了[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              ;

<强>更新 我发现地址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)。

答案 1 :(得分:0)

为了绘制我自己的光标,我使用定时器中断在不同的高性能CPU上变得更加稳定。

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

...

另外,我们可以等待使用轮询端口3DAh的vsinc来减少预设延迟。

德克