来自C ASM的NodeJS按位运算符

时间:2014-03-31 16:59:06

标签: javascript c node.js assembly

这与我的预览question有关。

C中函数的完整ASM是here

我的问题在于:

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

当我在0x35上使用NOT按位运算符时,在javascript上返回-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('--------------------------');
}

3 个答案:

答案 0 :(得分:2)

以下指令序列:

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

BLDL中的字节视为有符号值,并基本上从BL减去DL。前两个将BL的2的补码否定作为一个字节,然后第三个将否定的BL添加到DL。除非有后续指令以某种方式处理处理器状态标志,否则我不确定它为什么不只是说SUB DL,BL

所以我认为这组指令只会转化为:

b -= a;

而不是逐字翻译每条指令。

这在一定程度上取决于整个asm计划的背景,如何处理BLDL。如果它们被一致地视为字节值,则上述应该有效。

答案 1 :(得分:0)

因为javascript总是以32位有符号整数运行。所以你必须将结果截断为8位。

(~0x35) & 0xFF // results 0xCA

答案 2 :(得分:0)

看起来你有两个问题。首先是你正在做~35,而不是0x35(第一个是十进制35,第二个是十六进制35)。

第二个是javascript中的bitwise-not将参数转换为32位有符号整数,而看起来你希望它被视为unsigned char(8位)。您可以通过获取not的结果并按位进行并使用0xFF来解决此问题。所以:

(~0x35) & 0xFF
> 202
((~0x35) & 0xFF).toString(16)
> "ca"