2015-04-01 74 views
1

我的程序集代碼有問題(在win8 64的Visual 2013中是64位的masm)。當我調用C函數(printf)時,它會從ntdll.dll中拋出異常。我做錯了什麼?我如何在64位masm上讀寫控制檯的數據?我在哪裏可以找到masm 64位的好教程?從masm調用C函數64

extrn printf : proc 
.data 
format byte "Arg1: %d", 10, 0 

.code 
printData proc 

mov rbx, 100 
push rbx 

lea rax, format; format address 
push rax 

call printf; throw unhandled exception ntdll.dll - Access violation reading location 0xFFFFFFFFFFFFFFFF. 
add rsp, 16 ;2* 64bit value 

ret 
printData endp 
end 

P.S我從C++代碼調用printData。

+5

64位使用不同的[調用約定](https://msdn.microsoft.com/en-us/library/ms235286.aspx)。 – Jester 2015-04-01 12:29:58

+0

嘗試在C中編寫一個小的示例程序,然後讓編譯器生成彙編代碼,以便您可以看到調用序列。對於Visual Studio,右鍵單擊項目名稱,然後單擊屬性,C/C++,輸出文件並將組合輸出設置爲on。 – rcgldr 2015-04-01 16:35:53

回答

2

64位調用約定(https://msdn.microsoft.com/en-us/library/ms235286.aspx)要求您從RCX開始傳遞參數,如果需要則傳遞參數RDX,R8和R9。在這種情況下,您可能只需要RCX來存儲格式的地址,而RDX是要打印的整數值。

+1

這裏另一個重要的位是調用者*必須*爲每個上述寄存器保留足夠的空間 - 即使該函數的參數少於4個。 – Bukes 2015-04-01 20:34:32

+0

好,趕快,謝謝。 – 2015-04-02 15:06:44