我使用Python CType调用64位NASM dll。下面的示例是一个精简版本,它使用malloc简单地分配80个字节的内存,然后返回。
根据昨天在How to use malloc and free in 64-bit NASM?发表的帖子的回复,我想我可以从rsp中减去40个字节,调用malloc,并从malloc返回时添加rsp,32。我认为malloc会在返回时从堆栈中弹出8字节的返回地址,然后我将其他32个字节添加到rsp并从DLL返回。但是,在进入malloc时,堆栈帧不是16字节对齐的,所以这就是我认为问题所在。
我得到的错误是“访问冲突写入0x0000000000000000”,所以显然我写入了一些不属于我的调用函数的内存。
我还没有找到任何关于在这种情况下我应该做什么到16字节对齐的信息。
这是NASM代码:
[BITS 64]
export CallTest_fn
extern malloc
section .data align=16
temp_var: dq 1534.76
counter: dq 0
sizeof_array: dq 80
array_pointer: dq 0
section .text
;__________
CallTest_fn:
push rdi
push rbp
; Allocate memory buffer
mov rcx,qword[sizeof_array]
xor rax,rax
sub rsp,40
call malloc
add rsp,32
pop rbp
pop rdi
ret
.data部分中的变量和开始和结束时的push-pop序列供以后使用,但我将它们保留在这里。
这是Python ctypes代码:
hDLL = ctypes.WinDLL(r"C:/NASM_Test_Projects/Test_Malloc_Return/Test_Malloc_Return.dll")
CallTest = hDLL.CallTest_fn
CallTest.restype = ctypes.c_int64
ret_ptr = CallTest() #call the dll
非常感谢您对此的任何帮助。