2017-12-05 15 views
0

誰かがこのコードの内容を説明できますか?私はこれを理解したと思ったが、明らかに私はそうではなかった。Cant get ASSEMBLY x64 nasmでループが働いています

global main 
    extern printf 
    extern scanf 

section .data 

numberFormat: db '%d', 10, 0 

section .text 

    main: 

    push rbp   
    mov r8, 2  

    loop: 

    add r8, 1 
    mov rdi, numberFormat 
    mov rsi, r8 
    mov rax, 0 
    call printf 

    cmp r8, 15 
    jl loop 

    mov rax, 0  ; normal exit 
    ret 

私の質問は、なぜこのプリントアウトのみ数3の代わりに、すべての数字の3〜15

+0

アセンブルして実行すると、出力によってコードの内容がわかります。重要なこと:Linux x86-64 printfのような可変機能の呼び出し規約と_C_ライブラリのprintfの仕組みを理解するこのコードでも 'ret'の前に' pop rbp'がありませんので、クラッシュする可能性があります –

+0

特にあなたの質問は何ですか?何が問題なの?実行時にリンクに失敗したり失敗したりしますか? –

+0

Windows用の準拠x64ネイティブアセンブリを作成することは難しいことに注意してください。これは、例外の巻き戻しに特定のアライメント規則を従わなければならないためです。 [MSDN](https://docs.microsoft.com/en-us/cpp/build/unwind-helpers-for-masm)を参照してください。 –

答えて

2

R8は揮発性レジスタ(呼び出し側に保存)があり、それはprintf関数によって上書きされているので。 RBX、RBP、R12〜R15は、関数呼び出しで保持されます。 - Michael Petch

関連する問題