小编Rol*_*olf的帖子

两个补码的长整数

我想用英特尔I64汇编程序做一些长整数数学运算(128位),需要创建一个2的补码.让我们说我的正面价值在于RDX:RAX.

2的补码是通过"翻转位并加1"来完成的.所以最天真的实现是(4条指令和14个字节的代码):

  NOT RAX
  NOT RDX
  ADD RAX,1   ; Can't use INC, it doesn't set Carry
  ADC RDX,0
Run Code Online (Sandbox Code Playgroud)

当我在RAX而不是NOT上使用NEG指令时,它对我来说是"+1"但是Carry是错误的,当RAX为零时NEG RAX清除了Carry,但是我需要携带JUST IN THIS CASE.所以下一个最好的方法可能是(4条指令和11个字节的代码):

  NOT RDX
  NEG RAX
  CMC
  ADC RDX,0                  ; fixed, thanks lurker
Run Code Online (Sandbox Code Playgroud)

还有4条说明.但是不是加+1,我可以减去-1,因为SBB将Carry-Bit加到减数上,当Carry清零时我会加+1.所以我的下一个最好的尝试是这个,有3个指令和10个字节的代码:

   NOT RDX
   NEG RAX
   SBB RDX,-1
Run Code Online (Sandbox Code Playgroud)

从我冗长的文字中可以看出,这一点并不明显.是否有一种更好,更易理解的方法来在汇编程序中进行级联2的补码?

assembly x86-64 micro-optimization twos-complement

8
推荐指数
1
解决办法
781
查看次数

如何将托管结构转换为 C++/native

我试图理解 C#/C++ 互操作的这种“它只是工作”的魔力,但目前它只是一个噩梦。

我正在玩 Mandelbrot 计算,并希望将计算核心卸载到本机 C++ 和 SSE2。这是工作,与 P/Invoke。现在我想更改为 IJW,以便更安全,因为我想了解它。但我接触 C++ 的表面已经是几十年前的事了。

我有一个struct Complex { double real; double imag; }保存 Mandelbrot 循环的起始值,我想调用这样的函数:

Compute(int vectorSize, Complex[] points, double maxValue, int maxLoops, int[] result)

现在我使用 VS Express 2013 创建了一个 CLR 类库并将其放入头文件中:

public value struct Complex
{
    double real;
    double imag;
};

public ref class Computations
{
public:
    static void Basic(int vectorSize, array<Complex,1>^ points, double maxRadius, int maxLoops, array<int,1>^ result);
};

class NativeComputations
{
public:
    static void Basic(int vectorSize, Complex* …
Run Code Online (Sandbox Code Playgroud)

c# interop unmanaged c++-cli

2
推荐指数
1
解决办法
776
查看次数