来自C ASM的NodeJS按位运算符

这与我的预览问题有关 。

C中函数的完整ASM就在这里 。

我的问题在于:

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

在javascript上,当我在0x35上使用NOT位运算符时,它返回-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  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的字节视为有符号值并基本上从DL减去BL 。 前两个将BL的2的补码否定作为一个字节,然后第三个将否定的BL加到DL 。 除非有后续指令以某种方式处理处理器状态标志,否则我不确定它为什么不只是说, SUB DL,BL

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

 b -= a; 

而不是字面翻译每个指令。

这在某种程度上取决于整个asm程序的上下文,如何处理BLDL 。 如果它们被一致地视为字节值,则上述应该起作用。

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

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

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

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

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