1

嗨,我制作的程序将旋转两个符号 - \ 和 / 但我不知道如何在嵌套循环中设置 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等等,但我不知道在哪里放置push和pop cx,因为我的延迟程序正在与 cx 合作。例如,我只是将 cx 设置为 100,它会产生延迟等等。

4

2 回答 2

1

我看到两个问题:

首先,bx在这里初始化

mov bx,50d  ;   this is for delay loop

但随后它被

mov bh, 0

bh是位 15:8bx

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

于 2013-03-09T17:47:36.000 回答
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 以减少精确延迟。

短剑

于 2013-03-28T08:08:34.233 回答