2016-11-07 4 views
2

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

私は自分自身を試してみましたが、同時にキャラクターを上下に動かすことができました。キャラクターが画面の下限に当たったら、それを上向きと前向きに移動したいが、それをどうやって行うかわからない。

Iは最初のループの各反復の終わり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'にジャンプしません。 誰でもこの問題を解決する手助けはできますか?

私が助けたい主なものは、 'label1'をチェックして 'label2'にジャンプする必要があります。

PS。初心者だけのアセンブリ言語ですので、解決策を提案したら、簡単に理解してください。 これまで私が試したことがあります。

+1

どのバージョンを使用していますか? –

+0

アセンブリのバージョンがどういう意味かわかりません。あなたは精緻化できますか? – Yousaf

+0

アーキテクチャに応じて、さまざまなバージョンのアセンブリ言語があります。 nasmのより一般的なアセンブラの1つ。 –

答えて

1

2つの問題:

  • あなたは、画面の下部に達しましたが、あなたは、画面をクリアしたときにDHが失われたかどうかを知るために23DHを比較します。 BLを比較してください。
  • ブロックのコメントを解除して、カーソルを配置します。ここで

あなたのコードは固定されている:あなたは、アセンブリの

.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 
+1

スプリット秒、ほんの数秒前に答えます:-) – nopasara

+1

問題が解決しました。ご協力ありがとうございました。 – Yousaf

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 
+0

問題が解決しました。ご協力ありがとうございました – Yousaf

関連する問題