【发布时间】:2015-02-04 15:10:48
【问题描述】:
我的 asm 函数出现了一些问题。代码如下:
afterModulo PROC stdcall uses edx tab:DWORD, ile:DWORD, e:DWORD, n:DWORD
LOCAL tabEnd:DWORD
mov EAX, tab
add EAX, ile
mov tabEnd, EAX
forLoop:
mov EDX, [EAX]
push EAX
push n
push e
push EDX
call powerModulo
mov EDX, EAX
pop EAX
mov [EAX], EDX
inc EAX
cmp EAX, tabEnd
jge exitLoop
jmp forLoop
exitLoop:
ret
afterModulo ENDP
我想返回存储在 EAX 中的修改表。这是我在 C# 中调用 asm 函数的方式:
[DllImport("bibliotekaASM.dll", CallingConvention = CallingConvention.StdCall)]
private static extern int[] afterModulo(int[] tab, int ile, int e, int n);
public int[] wywolajFunkcjeAfter(int[] tab, int ile, int e, int n)
{
return afterModulo(tab, ile, e, n);
}
不幸的是,我收到了这个错误:GUI.exe 中发生了“System.Runtime.InteropServices.MarshalDirectiveException”类型的未处理异常 我确定这是返回值问题(我从未在汇编程序中处理过表格)
【问题讨论】:
-
您不能只将数组从 pinvoke 模式返回到托管模式。你必须编组它。希望有人会发布一个答案来说明如何编组,但与此同时,您最好开始阅读有关 pinvoke 编组的内容。
-
如果有人可以发布答案,我将不胜感激。