【发布时间】:2018-01-27 23:22:55
【问题描述】:
我正在测试一个从 ctypes 调用的非常简单的 NASM dll(64 位)。我传递了一个 int_64,并且该函数预计会返回一个不同的 int_64。
我每次都得到同样的错误:
OSError: exception: access violation writing 0x000000000000092A
十六进制值转换为我返回的值(在本例中为 2346)。如果我更改该值,十六进制值将更改为该值,因此问题在于我在 rax 中返回的值。如果我分配 mov rax,2346,我会得到同样的错误。
我反复测试过这个,尝试不同的东西,也做了很多研究,但是这个看似简单的问题仍然没有解决。
这是 Python 代码:
def lcm_ctypes():
input_value = ctypes.c_int64(235)
hDLL = ctypes.WinDLL(r"C:/NASM_Test_Projects/While_Loop_01/While_loops-01.dll")
CallTest = hDLL.lcm
CallTest.argtypes = [ctypes.c_int64]
CallTest.restype = ctypes.c_int64
retvar = CallTest (input_value)
这是 NASM 代码:
[BITS 64]
export lcm
section .data
return_val: dq 2346
section .text
finit
lcm:
push rdi
push rbp
mov rax,qword[return_val]
pop rbp
pop rdi
感谢您提供任何有助于解决此问题的信息。
【问题讨论】:
-
可能是因为你的函数丢失了
ret? -
顺便说一句
finit什么都不做。它在函数之外,并且您没有使用 x87 FPU 相关指令。它可以被消除。 -
我还建议您找到有关调试 python 和 DLL 的教程。有许多使用 Visual Studio 的此类教程(即使是免费版本也足够了)。您可以在函数入口点设置断点并让它停在那里。这使您可以逐步查看说明以了解失败的原因。
-
我建议在尝试使其与 ctypes 一起使用之前,通过从 C 调用该函数来使其工作。问题不是
ctypes问题。
标签: python assembly dll nasm x86-64