2017-08-29 22 views
0

私はx64アセンブラを学ぼうとしています。私は「こんにちは世界」を書いて、printfの次のコードを使用して呼び出そうとしました:x64アセンブラでprintfを呼び出すときに "mov rcx、rax"が必要なのはなぜですか?

EXTERN printf: PROC 

PUBLIC hello_world_asm 

.data 
hello_msg db "Hello world", 0 


.code 
hello_world_asm PROC 
push rbp ; save frame pointer 
mov rbp, rsp ; fix stack pointer 
sub rsp, 8 * (4 + 2) ; shadow space (32bytes) 

lea rax, offset hello_msg 
mov rcx, rax ; <---- QUESTION ABOUT THIS LINE 
call printf 

; epilog. restore stack pointer 
mov rsp, rbp 
pop rbp 
ret 
hello_world_asm ENDP 


END 

をアクセス違反になってしまった私は、「MOVのRCX、RAX」なしにprintf関数と呼ばれる開始時に。すべての不満を抱いて、私はprintfの呼び出しをC++で書いて、逆アセンブラを調べました。そこに私はすべてを固定した行 "mov rcx、rax"を見たが、なぜ私はRCXにRAXを動かす必要があるか???明らかに私は何か基本的なものを逃している。

ありがとうございました!

P.S.良いx64アセンブラのチュートリアルへの参照は歓迎以上のものです:-) 1つを見つけることができませんでした。

+0

'rax'は揮発性です。 'printf'は' rcx'を使って文字列を読み込みます。私の理解では、あなたが間違っている呼び出し規約です。かなり良い説明[here](http://masm32.com/board/index.php?topic=3101.0) –

+1

x64のprintfの最初のパラメータはraxではなく、rcxになるからです。 –

+0

ドキュメントやチュートリアルへのリンクについては、[x86タグwiki](https://stackoverflow.com/tags/x86/info)を参照してください。 Windowsを使用しているので、おそらくhttps://software.intel.com/en-us/articles/introduction-to-x64-assemblyが良いでしょう。 –

答えて

関連する問題