我想用英特尔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的补码?
我试图理解 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)