0

キーボードから読み取った文字列の印刷に問題があります。文字列が最大長の場合は機能しますが、たとえば3文字しか入力しないと、空白の黒いスペースが表示されます。これはコードです:

assume cs:code,ds:data

data segment
    sir db 12 dup (?),'$'
    mesaj db "Who`s your daddy?",13,10,"$"
data ends

code segment
start:
    mov ax,data
    mov ds,ax
    mov dx,offset mesaj
    mov ah,09h
    int 21h
    mov bx,offset sir
    mov sir[0],11
    mov dx,bx
    mov ah,0ah
    int 21h
    mov dx,offset sir
    mov ah,09h
    int 21h
    mov ah,01h
    int 21h
    mov ax,4c00h
    int 21h
code ends

end start
4

1 に答える 1

0

sir db 12 dup (?), '$'toを変更しsir db 12 dup('$'),'$'、他の誰かがコメントで提案したように to を変更すると、コードが機能するはずですmov dx, offset sirmov dx, offset sir + 2

ただし、結果をはっきりと見たい場合は、改行文字をいくつか印刷する必要があります。

これは、0ahルーチン (文字列入力) が次の理由によるものです。

  1. 0dhEnter キーを押したときに取得するキャリッジ リターン ( ) を含め、端末への入力をエコーし​​ます0ahが、カーソルを次の行に移動するライン フィード (

  2. キャリッジリターンを含むすべての入力を指定されたメモリ位置に配置しますが、改行はありません。

これは、入力ルーチンが実行された直後に、カーソルが、入力を行った行の先頭にあることを意味します。この行には、まだエコーされた入力が含まれています。そのため、他の操作を行う前に、改行文字を出力して次の行に移動します。

次に文字列を出力すると、末尾の改行が拾われてカーソルが行頭に戻るのですが、やはり改行がありません。後で (あなたのプログラムやシステム上の他のプログラムによって) 書き込まれたものは、印刷したものを上書きする可能性が非常に高いです。もう一度、次の行に最初に移動するように改行を印刷します。

改行の印刷は、次のように簡単にする必要があります。

data segment
....
    lf db 10, '$'
....

code segment
....
    mov dx, offset lf
    mov ah, 9
    int 21h
....

    mov dx, offset lf
    mov ah, 9
    int 21h
....
于 2014-11-08T01:12:00.080 に答える