【问题标题】:Returning table in assembler在汇编程序中返回表
【发布时间】: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 编组的内容。
  • 如果有人可以发布答案,我将不胜感激。

标签: c# assembly


【解决方案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

【讨论】:

  • 非常感谢,我没注意到。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多