【问题标题】:MASM function errorMASM 函数错误
【发布时间】:2015-01-15 13:54:06
【问题描述】:

我刚刚完成了我的 C# 部分代码,现在是汇编程序的时候了。这是我想用 MASM 重写的方法:

private long powerModulo(long a, long b, long m)             
    {

        long i, result = 1, x = a % m;

        for (i = 1; i <= b; i <<= 1)
        {
            x %= m;
            if ((b & i) != 0)
            {
                result *= x;
                result %= m;
            }
            x *= x;
        }

        return result;
    }

我对此有点陌生(我的意思是汇编程序),我一开始就有问题。 我首先创建变量并计算 x 变量。这是我的代码:

Modulo PROC stdcall a:dword, b:dword, m:dword

 i DD 0
 result DD 1
 x DD 0

 MOV EAX, a
 MOV ECX, m
 CDQ 
 IDIV ECX
 MOV x, EDX
 MOV EAX, x
 ret 

Modulo  ENDP

我收到了 AccessViolationEcxeption 错误。有人知道出了什么问题吗?

这里是我调用 asm 函数的地方:

namespace GUI
{
  unsafe class FunkcjeAsemblera
  {
    [DllImport("bibliotekaASM.dll", CallingConvention = CallingConvention.StdCall)]
    private static extern long Modulo(long a, long b, long m); 


    public long callModulo(long a, long b, long m)
    {
        return Modulo(a, b, m);

    }
  }
}

【问题讨论】:

  • 你不应该在代码部分定义你的变量。宁可使用数据,甚至更好的是,使用局部变量。当你需要它们时。在这种情况下,iresult 未被使用,您甚至不需要 x
  • 我知道我还没有使用它们。我只想一步一步地重写它。我一直在计算 x 变量。
  • 您在函数的代码流中声明了它们。这意味着 cpu 将尝试将它们作为指令执行。不用说,这很糟糕。

标签: c# assembly x86 masm


【解决方案1】:

1) 您必须使用LOCAL 显式声明局部变量(注意:它们不会被初始化),

2) 您正在处理 LONG 这是一个 64 位值。参数以QWORD 的形式推送到堆栈中。返回值通过 EDX:EAX 传递。

我相应地纠正了你的例子:

Modulo PROC STDCALL a:QWORD, b:QWORD, m:QWORD
LOCAL i:DWORD, result:DWORD, x:DWORD

    MOV EAX, DWORD PTR a
    MOV EDX, DWORD PTR a + 4
    MOV ECX, DWORD PTR m
    IDIV ECX
    MOV x, EDX
    MOV EAX, x
    CDQ             ; EAX = EDX:EAX (signed)
    RET

Modulo  ENDP

【讨论】:

  • MOV EAX, DWORD PTR a MOV EDX, DWORD PTR a + 4 我不明白这行,你能解释一下,它是如何工作的吗?
  • @kobasek: EAX 获得 QWORD a 的“低” DWORD,EDX 获得 a 的“高” DWORD。之后,QWORD a 在寄存器 EDX:EAX 中。 IDIV ECX 表示:“EDX:EAX / ECX = EAX 余数 EDX”。
  • 感谢您的回答。那么 m 变量呢?它也是一个长类型。
  • @kobasek:是的!你找到了!长/长除法在 32 位汇编器中很复杂。所以我简单地假设 m
  • 有什么建议可以用最简单的方式进行管理吗?
猜你喜欢
  • 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
相关资源
最近更新 更多