2016-05-01 16 views
2

NASMを使用すると、指定されたインデックスの文字列内の文字を変更し、その新しい形式で文字列を出力する必要があります。ここに私のコードの簡易版は、次のとおりです。NASMを使用して1バイトの値を変更するにはどうすればよいですか?

;test_code.asm 

     global main 
     extern printf 
output_str: db "----------" 
index: dq 7 
main: 
    push rbp 
    mov rdi, output_str 
    mov rax, index 
    mov byte[rdi + rax], 'x' 
    xor rax, rax 
    call printf 
    pop rbp 
    ret 

私は、使用してコンパイルします。

nasm -felf64 test_code.asm && gcc test_code.o -lm 

とワンセグ障害を取得します。誰かがここの欠陥を指摘してくれるだろうか?私はそれを自分で見つけることができない。

答えて

5
  • あなたの文字列は、デフォルトで読み込まれ、実行可能、の.textセクションにあります。スタックにバッファを割り当て、その文字列をコピーしてそこで変更するか、またはsectionディレクティブを使用して.dataセクション(読み書き可能)に文字列を配置します。この最後のケースでは、文字の置換は永続的であることに注意してください。つまり、プログラムの後半でも文字列は変更されたままです。
  • printfでその文字列を印刷する場合は、NULで終了する必要があります。 ,0db行の末尾に追加します。 mov rax, indexが間違っていることを
  • からindexは、あなたが上に書いたQWORDのアドレスで、あなたが実際にraxにそこに書いたデータムをコピーする一方で、おそらくmov rax, [index]が必要です。

だから、あなたの助けのための

;test_code.asm 

    global main 
    extern printf 

section .data 
output_str: 
    db "----------",0 

section .text 
index: 
    dq 7 

main: 
    push rbp 
    mov rdi, output_str 
    mov rax, [index] 
    mov byte[rdi + rax], 'x' 
    xor rax, rax 
    call printf 
    pop rbp 
    ret 
+0

おかげのようなもの。私は最終的に苦労の一日の後に物事を働かせることができました! –

関連する問題