2016-07-09 3 views
-1
.text 
.global main 
// code for main 
main: 
    push %r13 
    push %r14 
    push %r15 
    pushq $2 
    call show 
    pop %r15 
    pop %r14 
    pop %r13 
    mov $0,%rax 
    ret 
// code for show 
show: 
    popq x 
    pushq x 
    popq gen 
    lea genfmt_(%rip),%rdi 
    movq gen(%rip),%rsi 
    .extern printf 
    call printf 
    ret 
.data 
gen: .quad 0 
genfmt_: .byte '%','u',10,0 
x: .quad 0 

タイトルがかなり要約されています。私はなぜこれがセグメンテーションフォールトエラーを生成しているのか分かりません。私が理解したところで、スタックポインタは、r15、r14、r13を押すと整列します。次に、print fを呼び出す前に整列を保ちます。私はアセンブリには新しく、どんな助けもありがとう!セグメンテーションフォルト基本アセンブリ

+1

どの命令が重複していますか?デバッガで実行して参照してください。 ([x86タグwiki](http://stackoverflow.com/tags/x86/info)を参照してください。 –

答えて

1
show: 
    popq x 

は明らかなバグです。関数へのエントリ時にスタック上の最初のものはリターンアドレスです。返信先住所が狂っているので、retにアクセスしようとすると問題が発生します。

また、64ビットコード用の標準の呼び出し規約/ ABIでは、argsがレジスタに渡されるため、わかりやすいargsをprintfに渡すことはありません。 (あなたは自分のasm関数の間でargsを渡すことができますが、好きなようにCから呼び出すことはできません)

呼び出し規約については、タグwikiを参照してください。また、デバッガを使用して、より良い質問をすることができます(どの命令がsegfaultを生成したか、どのアドレスにアクセスしようとしたかを示すことによって)。

+0

ありがとう、私の最大の問題は、復帰アドレスがエントリに渡されたことを知らなかったことです。 –