Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winapi 如何在MASM64中将参数传递给过程?_Winapi_Assembly_64 Bit_Parameter Passing_Masm - Fatal编程技术网

Winapi 如何在MASM64中将参数传递给过程?

Winapi 如何在MASM64中将参数传递给过程?,winapi,assembly,64-bit,parameter-passing,masm,Winapi,Assembly,64 Bit,Parameter Passing,Masm,我正在学习用MASM64组装x64。我已经读到,前4个参数通过寄存器传递给过程:RCX、RDX、R9和R8。如果有更多的参数,我们通过堆栈传递它们 但有些事情令人困惑 此代码不起作用的原因: 子rsp,40小时 推0 推送文件\u属性\u正常 总是按“创建”按钮 异或r8,r8 异或r9,r9 mov rdx,通用读或通用写 mov rcx,偏移量szSavePath 调用CreateFileA 加上rsp,40小时 但这个代码是有效的: 子rsp,40小时 mov qword ptr[rsp

我正在学习用MASM64组装x64。我已经读到,前4个参数通过寄存器传递给过程:
RCX
RDX
R9
R8
。如果有更多的参数,我们通过堆栈传递它们

但有些事情令人困惑

此代码不起作用的原因:

子rsp,40小时
推0
推送文件\u属性\u正常
总是按“创建”按钮
异或r8,r8
异或r9,r9
mov rdx,通用读或通用写
mov rcx,偏移量szSavePath
调用CreateFileA
加上rsp,40小时
但这个代码是有效的:

子rsp,40小时
mov qword ptr[rsp+30h],0
mov qword ptr[rsp+28h],文件属性正常
mov qword ptr[rsp+20h],始终创建
异或r8,r8
异或r9,r9
mov rdx,通用读或通用写
mov rcx,偏移量szSavePath
调用CreateFileA
加上rsp,40小时
请帮我解释一下。
你好,大卫

子rsp,40小时
推0
推送文件\u属性\u正常
总是按“创建”按钮
在这里,您将在堆栈的保留空间下方放置3条信息

子rsp,40小时
mov qword ptr[rsp+30h],0
mov qword ptr[rsp+28h],文件属性正常
mov qword ptr[rsp+20h],始终创建
但是这里您将把这些数据放在堆栈上的保留空间中

然后发生的情况是,在第一个代码段中,由于您仅使用
add rsp,40h
释放保留的数量,因此您最终得到了一个不平衡的堆栈


相同的代码,但使用推送:

push 0
推送文件\u属性\u正常
总是按“创建”按钮
副rsp,20小时
异或r8,r8
异或r9,r9
mov rdx,通用读或通用写
mov rcx,偏移量szSavePath
调用CreateFileA
加上rsp,20小时+18小时

第5个参数必须在[rsp+20h]内,第6个参数必须在[rsp+28h]内,依此类推。此外,在呼叫之前,rsp必须是多个10hThanks!但是有没有正确的方法来使用
push
?如何使用
push
修复代码?