2017-08-29 65 views
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彙編程序教程的引用不止是歡迎:-)找不到一個。

+0

'rax'是易變的。 'printf'使用'rcx'來加載字符串,所以在我的理解中,這只是您錯誤的調用約定。很好的解釋[here](http://masm32.com/board/index.php?topic=3101.0) –

+1

因爲x64 printf的第一個參數在rcx中,而不是rax。 –

+0

有關文檔和教程的鏈接,請參見[x86標記wiki](https://stackoverflow.com/tags/x86/info)。由於您使用的是Windows,因此https://software.intel.com/zh-cn/articles/introduction-to-x64-assembly可能是一個不錯的選擇。 –

回答

相關問題