2017-01-27 6 views
1

ユーザー名をとり、 "Hello [userName]"を印刷するアセンブリx86を使用して単純な挨拶プログラムを作成しようとしました 挨拶メッセージを印刷するときにユーザー名の最初の文字が2倍になります例:アセンブリx86、挨拶プログラム

入力:

Black Knight 

出力:

Hello BBlack Knight 

、ここでは私のコード

です
global _start 

section .data 
    msg1  db "Hello " 
    user_input times 20 db 0 


section .bss 

section .text 

_start : 

; read 
mov eax , 3 
mov ebx , 0 
mov ecx , user_input 
mov edx , 20 
int 0x80 

; write 
mov eax , 4 
mov ebx , 1 
mov ecx , msg1 
mov edx , 7 
int 0x80 

mov eax , 4 
mov ebx , 1 
mov ecx , user_input 
mov edx , 20 
int 0x80 

; exit 
mov eax , 1 
mov ebx , 0 
int 0x80 
+0

user_inputバッファがmsg1をメモリに直接(上記と同様に)続けている場合、1回の呼び出しで大きな文字列として出力することもできます。 ecx = msg1、edx = 6 + 20。 (生徒のための素晴らしい例のように見えるが、アセンブリでは変数はないが、連続したバイトからなるコンピュータメモリであり、コードは高水準言語から知られている "構造的"意味をすべて与える責任がある。メモリアドレスの、それ以上のもの)。あなたが定義したメモリレイアウトによって、メモリ内のmsg1に追加するユーザ入力を作成しました。これは書き込み中に悪用される可能性があります。 – Ped7g

答えて

2

これは、このコードで起こっている:

; write 
mov eax , 4 
mov ebx , 1 
mov ecx , msg1 
mov edx , 7 
int 0x80 

あなたはここでは、実際には、6

をそれがあるときに印刷する文字列の長さが7バイトであることを書き込み命令を言っています

なぜ倍増したB?メモリ内に入力された名前は、の直後にの後に、msg1に続いて表示されます。

6文字(ハロー+スペース)のみを印刷するか、msgの末尾にヌルターミネーターを追加することで解決できます。

+0

OMG、これで動作します、ありがとう –

関連する問題