来自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
将BL
和DL
的字节视为有符号值并基本上从DL
减去BL
。 前两个将BL
的2的补码否定作为一个字节,然后第三个将否定的BL
加到DL
。 除非有后续指令以某种方式处理处理器状态标志,否则我不确定它为什么不只是说, SUB DL,BL
。
所以我认为这组指令只会转化为:
b -= a;
而不是字面翻译每个指令。
这在某种程度上取决于整个asm程序的上下文,如何处理BL
和DL
。 如果它们被一致地视为字节值,则上述应该起作用。
因为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"