2017-04-24 3 views
2

emu8086を使用して画面上の文字をバウンスするにはいくつかの助けが必要でした。 画面のサイズは(80x25文字)です。私はそれを斜めに動かすことができましたが、それは戻っていません。代わりに、それはちょうど境界(つまり24行)に達した後にx軸上にまっすぐに行きます。アセンブリで文字をバウンスする方法

enter code here 
Data_seg segment 'data' 
char db 'A' 
char2 db ' ' 
x1 db (1) 
y1 db (1) 
Data_seg ends 

Code_seg segment 'code' 
assume CS:Code_seg,DS:Data_seg 

main PROC far 
    mov ax,Data_seg 
    mov ds,ax 


    mov cx,40 
    loop1: 
    ;gotoxy 
    mov ah,02 
    mov dl,x1 
    mov dh,y1 
    mov bh,0 
    int 10H 

    ;print a 
    mov al,char 
    mov dl,al 
    mov ah,02H 
    int 21H 

    ;gotoxy 
    mov ah,02 
    mov dl,x1 
    mov dh,y1 
    mov bh,0 
    int 10H  

    ;print " "  
    mov dl,char2 
    mov ah,02H 
    int 21H  

    inc x1  
    inc y1 

    ;if(x1<2)||(x1>79) 
    mov al,x1 
    cmp al,2 
    jl ifPart 
    mov al,x1 
    cmp al,79 
    jge ifPart  


    ;if(y1<2)||(y1>79) 
    y11:  
    mov al,y1 
    cmp al,2  
    jl ifPart2 

    mov al,y1 
    cmp al,24 
    jge ifPart2 ;jge for boundry(24) 

    jmp endif    
       ifPart: 
         dec x1 
         jmp y11 

       ifPart2: 
        dec y1 

       endif: 


    loop loop1 



    Code_seg ends 
end main 

答えて

3

コードにバウンドアルゴリズム/ロジックを記述する必要があります。あなたのロジックは常に[+ 1、+ 1]を行い、行24に到達した後、追加の[0、-1]を開始します(したがって、合計変化は(+ 1、+ 0)です)。 79列に達すると追加の[-1,0]が行われるため、合計変化は(+ 0、+ 0)になります。

つまり、あなたのコードはそこに書いたことを行いますが、コードに問題はありません。

あなたのロジックを修正するには、アルゴリズムを最初の単純な言語(英語ではSOを尋ねるときに役立ちます)に書き出し、アセンブリ手順に似ているまで簡単な手順にして、いくつかの指示で各コメントを実装します。

開始のために、あなたは "移動" のベクトルを持ちたい、と[X1、Y1]、代わりのにそれを追加することがあります。

inc x1 
    inc y1 

(すなわち、mov al,[moveX] add [x1],al ...と同様にyのため)。

境界に達すると、移動ベクトルのその部分を無効にするので、+ 1から-1に戻り、戻ってきます。開始位置が "内側"であれば、更新後の境界を確認することはOKです(0 || 79トリガフリップ)。開始位置も境界上にある場合は、更新を試み、無効な位置を検出する必要があります。 80)、ベクトルを反転し、無効な更新をキャンセルし、有効な更新を行います。

+0

キャラクターは、ベクトルを動かすことで、今、バウンスしています。それは、あなたが24行目の一番左の列にある文字を表示してからバウンスします。 –

+0

修正済み: "cmp al、24"を "cmp al、23"に変更して、問題(コメントに記載)を修正できました。プログラムは今、完璧に働いています。あなたの助けにたくさん感謝しています。 –

+1

@MUHAMMADAHMEDVOHRA約24/23 .. DOS出力割り込みの使用に問題はありません。最後の行が使用されたときに画面が「スクロール」しますか? VRAMに直接書き込むことを検討してください(グラフィックカード内部を再構成しない限り、デフォルトでB800:0000からテキストモードが開始されます)。これにより、VRAMコンテンツを完全に制御できるようになります。可能なすべての色/点滅の組み合わせを使用してください。最後の行ではスクロールしません(VRAMコンテンツを移動するか、ビデオメモリの開始を変更することによって、手動でコードをスクロールする必要があります)。 – Ped7g