2011-12-29 23 views
2

文字列を受け取り、文字列を表示するアセンブリコードがあります。アセンブリコードで文字列を表示する

私の問題は、ユーザーからの入力を保存するためにbuffを使用しているので、名前がどのくらい正確に格納されているのか分かりません。

私は

buff label byte 
maxchar db 50 
readchar db 0 
name1 db 48 dup(0) 

はこれとは何かを持っていることを知っています。しかし、私は仕事を理解することができません。

.model small 
.stack 
.data 
    buff label byte 
    maxchar db 50 
    readchar db 0 
    name1 db 48 dup(0) 
    m1 db 10,13,"enter name: $" 
    m2 db 10,13,"your name is: $" 
.code 
    mov ax, @data 
    mov ds, ax 
    lea dx, m1 
    mov ah, 09 
    int 21h 
    lea dx, buff 
    mov ah, 10 
    int 21h 


    mov ah,0 
    mov al, readchar 
    add ax, 2 
    mov si, al 
    mov buff[si],24H ;ascii code for $ to terminate string 
    lea dx, m2 
    mov ah, 9 
    int 21h 
    lea dx, name1 
    mov ah, 09 
    int 21h 

    mov ah, 4ch 
    int 21h 
end 

助けてください!

ありがとうございました。

答えて

3

入力は、バッファされた入力を実行するDOS関数0x0a(またはコード内の10進数10)を使用して読み取られます。 DS:DXパラメータポイントプログラムにおける標識位置buff(または同等maxchar)であり、以下のフォーマットを有するバッファ、全コード、DSでそう

offset meaning 
------ ------------- 
    0  Number of bytes available for the input data (starting at offset 2) 
    1  A location for DOS to put the number of characters read into the buffer 
    2  A buffer of bytes that can hold the number of characters specified in 
      offset 0 

buffにDX点れます50文字までをname1にバッファに格納できることを示します。バッファには48バイトしかないので、コードに潜在的な問題があるように見えますが、データ構造には50バイトがあることが示されています。したがって、入力がm1の最初の2バイトを上書きする可能性があります。アセンブリプログラム、特に古いものは、スペースを節約するためのあらゆる種類のトリックを実行することで知られています。 m1はDOS関数0x0aを呼び出した後で使用されないので、これは意図的だった可能性があります(もしそうなら、なぜm1が利用できなくなったのかわかりません)。私はそれが意図的ではないと思うだろうし、そのバグは目立つものには決して現れなかった。

+0

また、おそらく 'mov si、ax'ではなく、' mov si、al'であるべきです。 'movsx'と' movzx'だけが8ビットのレジスタ値を16ビットのレジスタに移動することができます、 'mov'はできません。 –

+0

ありがとうたくさん:)私の疑問を解決した! –

関連する問題