私は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つを見つけることができませんでした。
'rax'は揮発性です。 'printf'は' rcx'を使って文字列を読み込みます。私の理解では、あなたが間違っている呼び出し規約です。かなり良い説明[here](http://masm32.com/board/index.php?topic=3101.0) –
x64のprintfの最初のパラメータはraxではなく、rcxになるからです。 –
ドキュメントやチュートリアルへのリンクについては、[x86タグwiki](https://stackoverflow.com/tags/x86/info)を参照してください。 Windowsを使用しているので、おそらくhttps://software.intel.com/en-us/articles/introduction-to-x64-assemblyが良いでしょう。 –