1

こんにちは、\ と / の 2 つのシンボルをローテーションするプログラムを作成しましたが、ネストされたループで 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

このように動作するはずです

write / delay for example 10 sec write \ delay 8 sec そして先頭にジャンプしてループ

アドバイスをありがとう

これが私の遅延手順です

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 に設定すると、遅延などが発生します。

4

2 に答える 2

1

2 つの問題があります。

まず、bxここで初期化されます

mov bx,50d  ;   this is for delay loop

しかし、それはによって上書きされます

mov bh, 0

bhのビット 15:8 ですbx

次に、Delay プロシージャで、分岐が通過する[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

したがって、そのループで監視しているメモリは、タイマー ティックのカウンター (54.9 ミリ秒ごとにカウント) を使用して BIOS によって更新された場所です。

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 に答える