我的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);
}
不幸的是,我收到了这个错误:未处理的类型' System.Runtime.InteropServices.MarshalDirectiveException'发生在GUI.exe 中 我确定它的返回值问题(我从未在汇编程序中使用过表格)
答案 0 :(得分:1)
只关注装配:
您的第一次阅读已经过了表格的末尾!使用
mov EAX, tab
add EAX, ile
mov tabEnd, EAX
mov EAX, tab
forLoop:
由于它是DWORDS表,您需要将地址改为4而不是1。
mov [EAX], EDX
add EAX, 4
cmp EAX, tabEnd