2

アセンブリ言語で、スクリーン セーバーのように画面上のテキストまたは文字を移動するプログラムを作成しようとしています。つまり、最初は下方向だけでなく前方にも移動する必要があります。画面の下限に達すると、前方および上方に移動し始め、その逆も同様です。

私は自分で試してみましたが、キャラクターを前方と下方に同時に動かすことができました。キャラクターが画面の下限に達したときに、上方向と前方向に移動したいのですが、その方法がわかりません。

emu8086アセンブラを使用しています

.model small
.data
st1 db "O",13,10,'$'
.code
main proc
    mov AX,@data
    mov DS,AX 

    mov BL,0
    label1:
    mov AH,2H
    mov BH,0            ;goto-XY
    mov DH,BL
    mov DL,BL
    INT 10H

    mov AH,9H
    mov DX,offset st1      ;print
    INT 21H

    mov AH, 6H 
    mov AL, 0    
    mov BH, 7         ;clear screen 
    mov CX, 0
    mov DL, 79
    mov DH, 24
    int 10H

    ADD BL,1

    cmp DH,23           ;conditional jump
    jz label2
    loop label1 

    label2:

   ; mov AH,2H
   ; mov BH,0            ;goto-XY
   ; mov DH,BL
   ; mov DL,BL
   ; INT 10H

    mov AH,9H
    mov DX,offset st1      ;print
    INT 21H

    mov AH, 6H 
    mov AL, 0    
    mov BH, 7         ;clear screen 
    mov CX, 0
    mov DL, 79
    mov DH, 24
    int 10H

    SUB BL,1
    loop label2

    mov AH,4CH
    INT 21H
end main 

最初のループの各反復の終わりに、画面の y 軸の下限が 23 であるため、「DH」= 23 かどうかを確認しています。画面の下限に達した場合は、「label2」にジャンプする必要がありますが、 「cmp」ステートメントを正しく使用していないため、「label2」にジャンプしません。誰でもこの問題を解決できますか?

私が助けてほしい主なことは、「label2」にジャンプするために「label1」でチェックインする必要がある条件です。

PS。アセンブリ言語の初心者なので、解決策を提案する場合は、シンプルで理解しやすいものにしてください。これが私がこれまでに試したことです。

4

2 に答える 2

1

2 つの問題:

  • 画面の下部に達したかどうかを知るために比較DHしますが、画面をクリアしたときに失われました。比較する必要があります。23DHBL
  • ブロックのコメントを外して、カーソルを配置します。

これが修正されたコードです:

.model small
.data
st1 db "O",13,10,'$'
.code
main proc
    mov AX,@data
    mov DS,AX 

    mov BL,0
    label1:
    mov AH,2H
    mov BH,0            ;goto-XY
    mov DH,BL
    mov DL,BL
    INT 10H

    mov AH,9H
    mov DX,offset st1      ;print
    INT 21H

    mov AH, 6H 
    mov AL, 0    
    mov BH, 7         ;clear screen 
    mov CX, 0
    mov DL, 79
    mov DH, 24
    int 10H

    ADD BL,1

    cmp BL,23         ;◄■■■ COMPARE BL, NOT DH, BECAUSE
    jz label2         ;     YOU LOST DH WHEN CLEARED SCREEN.
    loop label1 

    label2:

    mov AH,2H           ;◄■■■ UNCOMMENT THIS BLOCK !!!
    mov BH,0            ;goto-XY
    mov DH,BL
    mov DL,BL
    INT 10H

    mov AH,9H
    mov DX,offset st1      ;print
    INT 21H

    mov AH, 6H 
    mov AL, 0    
    mov BH, 7         ;clear screen 
    mov CX, 0
    mov DL, 79
    mov DH, 24
    int 10H

    SUB BL,1
    cmp BL,1         ;◄■■■ PERSONAL CHANGE : DETECT WHEN
    jz label1        ;     CURSOR REACHES THE TOP ☻
    loop label2

    mov AH,4CH
    INT 21H
end main 
于 2016-11-07T16:08:47.540 に答える
1
mov DL, 79
mov DH, 24     <-- here Dh = 24
int 10H

ADD BL,1

cmp DH,23      <- so here condition never true
jz label2
于 2016-11-07T16:09:19.693 に答える