这与我的预览question有关。
C中函数的完整ASM是here
我的问题在于:

00408091  |>  F6D3          ||NOT BL
00408093  |.  FEC3          ||INC BL
00408095  |.  02D3          ||ADD DL,BL

在javascript上,当我在0x35上使用非位运算符时,它将返回-36,而不是预期的0xCA。为什么?
  // cmp al, dl
  if (b <= a) {
    a -= b;
  } else {
    // problem lies here
    console.log(~b);
    a += b;
    a++;
  }

我的nodejs代码目前是:
for (var i = 0; i < hashed.length; i++) {
  var a = hashed[i];
  var b = seqX[i];
  var c = seqX[i+1];

  var stepIn = i+1;
  var stepOver = stepIn-1;

  // cmp BL, DL -- 0x63, 0x4e -- 0xf9, 0xc5 -- 0x75. 0x7a
  for (var j = internalRounds - 1; j > 0; j--, stepIn--, stepOver--) {
    if (seqX[(i*2)+1] <= a) {
      a -= seqX[(i*2)+1];
    } else {
      a += seqX[(i*2)+1];
      a++
    }
    // xor dl, bl -- 0x1c, 0xc0
    a ^= seqY[stepIn];
  }

  // cmp al, dl
  if (b <= a) {
    a -= b;
  } else {
    // problem lies here
    console.log(~b);
    a += b;
    a++;
  }

  // xor al, dl --- 0xd4, 0xb8
  a ^= seqY[i];

  // xor al, cl
  a ^= 0x6e;

  console.log(a.toString(16)); // I expect this to be 2.
  console.log('--------------------------');
}

最佳答案

以下说明顺序:

00408091  |>  F6D3          ||NOT BL
00408093  |.  FEC3          ||INC BL
00408095  |.  02D3          ||ADD DL,BL

BLDL中的字节作为有符号值,并从BL中减去DL。前两个将2的补码否定BL作为一个字节,然后第三个将否定的BL添加到DL。除非有后续指令以某种方式处理处理器状态标志,否则我不确定它为什么不直接说,SUB DL,BL
所以我认为这一组指令可以转化为:
b -= a;

而不是逐字翻译每一条指令。
这在一定程度上取决于整个asm程序的上下文,如何处理BLDL。如果它们被一致地视为字节值,那么上面的方法应该可以工作。

关于javascript - 来自C ASM的NodeJS按位运算符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22767680/

10-11 11:17