在汇编程序中返回表

时间:2015-02-04 15:10:49

标签: c# assembly

我的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 中 我确定它的返回值问题(我从未在汇编程序中使用过表格)

1 个答案:

答案 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