0

sol という配列を画面に出力する関数を作りたかったのです。各文字間の距離は、互いに 3 "文字" 離れている必要があります。
しかし、コードを実行すると、配列の最初の行だけが出力されます。

これが私のDsegコードです:

line db 0
col db 0
temp db 3
indexc dw 0
sol db   'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'
S_LEN = $- sol
            db   'p', 'p', 'p', 'p', 'p', 'p', 'p', 'p'
            db   '*', '*', '*', '*', '*', '*', '*', '*'
            db   '*', '*', '*', '*', '*', '*', '*', '*'
            db   '*', '*', '*', '*', '*', '*', '*', '*'
            db   '*', '*', '*', '*', '*', '*', '*', '*'
            db   'p', 'p', 'p', 'p', 'p', 'p', 'p', 'p'
            db   'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'
S_LEN2 = $- sol

私の機能は次のとおりです。

 PutPlayers Proc    
    push ax bx cx dx si

InitiolazingVar:

    mov temp, offset sol
    mov line, 1
    mov col, 1
    mov si, 1
Again:  
    ;location 
        mov dl, col
        mov dh, line
        mov bx, 0
        mov ah, 2h
        int 10h



    ;printing the char
        mov al, ds:[temp][si]
        mov bl, 33
        mov cx, 1h
        mov bh, 0
        mov ah, 9h
        int 10h

        add col, 3h
        inc si
        cmp si, 9
        jnz Again


        add temp, S_LEN
        mov si, 1h
        mov col, 1h
        add line, 3h

        cmp line, 19h
        jnz Again

        pop si dx cx bx ax
        ret
PutPlayers endp 

それで、私を助けてもらえますか?

4

1 に答える 1

0

一見したところ、私はこの指示が好きではありません:

mov al, ds:[temp][si]

[temp] の内容と SI の内容の合計に等しいアドレスからバイトを読み取ることを期待していると思います。

しかし、そうではありません。この命令は、実際には address_of_temp+si を使用します。[temp] の内容は使用しません。

ここでは、ポインターとして si のみを使用し、ループ終了に関する他の比較を検討することをお勧めします。

于 2013-07-14T17:04:23.333 に答える