从masm 64调用C函数
我的汇编代码有问题(win8 64上的Visual 2013中的64位masm)。当我调用C函数(printf)时,它会从ntdll.dll引发异常。我做错了什么?如何在64位masm中从控制台读写数据?在哪里可以找到masm 64位的好教程从masm 64调用C函数,c,assembly,x86-64,masm,C,Assembly,X86 64,Masm,我的汇编代码有问题(win8 64上的Visual 2013中的64位masm)。当我调用C函数(printf)时,它会从ntdll.dll引发异常。我做错了什么?如何在64位masm中从控制台读写数据?在哪里可以找到masm 64位的好教程 extrn printf : proc .data format byte "Arg1: %d", 10, 0 .code printData proc mov rbx, 100 push rbx lea rax, format; format ad
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++代码调用PrtDATA。
要求您通过RCX中的参数,如果需要,则依次输入RDX、R8和R9。在这种情况下,您可能只需要RCX存储格式的地址,RDX存储要打印的整数值。
64位使用不同的格式。请尝试用C编写一个小示例程序,然后让编译器生成汇编代码,以便您可以看到调用序列。对于VisualStudio,右键单击项目名称,然后单击属性、C/C++、输出文件并将程序集输出设置为ON。这里的另一个重要的方面是,调用方必须为每个上述寄存器保留足够的堆栈空间,即使函数的参数小于4个。