2016-11-17 9 views
-1

あなたが書いた文字列を返すプログラムを書いています。しかし、それは常に最初の文字なしでそれを印刷します。また、最初のスペースを超えて何も戻さない。NASM - printfは最初の文字を出力しません

例:

IN: test 
OUT: est 

コード:

extern printf, scanf, exit 
global main 

section .text 
main: 
    push rbp 
          ;input of string 
    mov rdi, format 
    mov rsi, string 
    mov rax, 0 
    call scanf 

          ;output of string 
    mov rdi, format_out 
    mov rsi, qword [string] 
    mov rax, 0 
    call printf 
_exit:      ;end of program 
    pop rbp 
    call exit 

section .data 
    format  db "%s", 0 
    string  db 0 
    format_out db "You wrote: %s", 0 

私はに文全体を印刷し、私は「string dbstring db 0を変更した場合、それはエラーを示しているが、プログラムが正しく動作することに気づきました残念なことに、私はその情報をどうしたらよいかわからない。答えをありがとう。

+0

「string」は、ユーザーが入力した文字列を格納する変数です。ユーザーが入力する文字数は何文字ですか?変数 'string'のサイズは? –

+0

私は分かりません。 20を最大文字数としましょう。今私は何をしますか? – Zumalo

+3

次に、文字列に2バイト以上を割り当てる必要があります。最大値は –

答えて

2

printf("%s", ...)あなたは文字列の内容の最初の8バイトを渡しています。 mov rsi, [string]の代わりにmov-immediateを取得するには、mov rsi, stringを使用します(これは読み込みです)。

(または静的アドレスは、デフォルトのコードモデルで32ビットに収まるように保証されているので、2コードバイト、mov esi, stringを保存する。)


コメントで指摘したように、あなたの静的バッファが小さすぎます。書式文字列にはサイズ制限がないため、長い入力行がオーバーフローするリスクを避けるために、無限のサイズのバッファが必要です。

しかし、1024Bのバッファが十分安全であるとふりましょう。それ以上の場合は、%1023sを使用してください。これで十分です。 1024Bの実行可能ファイルを実行可能ファイルに入れることは望ましくありません。それは愚かであろう。だから、代わりにBSSに1024Bを確保する必要があります。データ、およびgood reason not to上のラベル名の後に:を省略する理由はありません

section .rodata 
    format:  db "%1023s", 0   # actually set a size limit, leaving room for the \0 
    format_out: db "You wrote: %s", 0 

section .bss 
    string:  resb 1024    # RESERVE 1024 bytes. Only works in .bss 

関連する問題