2017-09-09 54 views
2

我正在學習與MASM64的x64程序集。我已經讀過,前4個參數通過寄存器傳遞給過程:RCX,RDX,R9R8。如果有更多的參數,我們通過堆棧傳遞它們。如何將參數傳遞給MASM64中的過程?

但有一些令人困惑。

爲什麼這個代碼不工作:

sub rsp, 40h 
push 0 
push FILE_ATTRIBUTE_NORMAL 
push CREATE_ALWAYS 
xor r8, r8 
xor r9, r9 
mov rdx, GENERIC_READ or GENERIC_WRITE 
mov rcx, offset szSavePath 
call CreateFileA 
add rsp, 40h 

但此代碼的工作:

sub rsp, 40h 
mov qword ptr [rsp+30h], 0 
mov qword ptr [rsp+28h], FILE_ATTRIBUTE_NORMAL 
mov qword ptr [rsp+20h], CREATE_ALWAYS 
xor r8, r8 
xor r9, r9 
mov rdx, GENERIC_READ or GENERIC_WRITE 
mov rcx, offset szSavePath 
call CreateFileA 
add rsp, 40h 

請通過解釋這幫助我。
的問候,大衛

+1

5個參數必須* [RSP + 20H] *,6個在* [RSP + 28H] *等。也* *之前致電* rsp *必須是多個10h – RbMm

回答

2
sub rsp, 40h 
push 0 
push FILE_ATTRIBUTE_NORMAL 
push CREATE_ALWAYS 

在這裏,我們把3個信息以下預留空間堆棧。

sub rsp, 40h 
mov qword ptr [rsp+30h], 0 
mov qword ptr [rsp+28h], FILE_ATTRIBUTE_NORMAL 
mov qword ptr [rsp+20h], CREATE_ALWAYS 

但在這裏你把這些數據預留空間堆棧。

然後會發生什麼情況是,您最終將在第一個片段中產生不平衡堆棧,因爲您只使用add rsp, 40h釋放保留數量。


相同的代碼但使用推:

push 0 
push FILE_ATTRIBUTE_NORMAL 
push CREATE_ALWAYS 
sub rsp, 20h 
xor r8, r8 
xor r9, r9 
mov rdx, GENERIC_READ or GENERIC_WRITE 
mov rcx, offset szSavePath 
call CreateFileA 
add rsp, 20h + 18h 
+0

謝謝!但是有沒有正確的方法來使用'push'?如何使用'push'修復代碼? – Dave

相關問題