0
我在學習x64彙編器。我寫的「Hello World」,並試圖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
在我打電話的printf沒有「MOV RCX,RAX」開始,結束了訪問衝突。讓我感到沮喪的是,我剛剛用C++寫了一個printf調用,並在反彙編器中查看。在那裏,我看到了「mov rcx,rax」這一行,它固定了一切,但爲什麼我需要將RAX移動到RCX嗎?顯然我錯過了一些基本的東西。
感謝您的幫助!
p.s.對良好的x64彙編程序教程的引用不止是歡迎:-)找不到一個。
'rax'是易變的。 'printf'使用'rcx'來加載字符串,所以在我的理解中,這只是您錯誤的調用約定。很好的解釋[here](http://masm32.com/board/index.php?topic=3101.0) –
因爲x64 printf的第一個參數在rcx中,而不是rax。 –
有關文檔和教程的鏈接,請參見[x86標記wiki](https://stackoverflow.com/tags/x86/info)。由於您使用的是Windows,因此https://software.intel.com/zh-cn/articles/introduction-to-x64-assembly可能是一個不錯的選擇。 –