Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.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
从masm 64调用C函数_C_Assembly_X86 64_Masm - Fatal编程技术网

从masm 64调用C函数

从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

我的汇编代码有问题(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 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个。