【发布时间】: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);
}
}
}
【问题讨论】:
-
你不应该在代码部分定义你的变量。宁可使用数据,甚至更好的是,使用局部变量。当你需要它们时。在这种情况下,
i和result未被使用,您甚至不需要x。 -
我知道我还没有使用它们。我只想一步一步地重写它。我一直在计算 x 变量。
-
您在函数的代码流中声明了它们。这意味着 cpu 将尝试将它们作为指令执行。不用说,这很糟糕。