Javascript C ASM中的NodeJS位运算符
这与我的预览有关 C中函数的完整ASM是 我的问题在于:Javascript C ASM中的NodeJS位运算符,javascript,c,node.js,assembly,Javascript,C,Node.js,Assembly,这与我的预览有关 C中函数的完整ASM是 我的问题在于: 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; }
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++;
}
//cmp al,dl
如果(b0;j--,步进--,步过--){
如果(seqX[(i*2)+1],这是因为javascript总是使用32位有符号整数进行操作。所以必须将结果截断为8位
(~0x35) & 0xFF // results 0xCA
看起来您有两个问题。第一个问题是您正在执行~35
,而不是0x35
(第一个是十进制35,第二个是十六进制35)
第二个是javascript中的按位not将参数强制转换为32位有符号整数,而您似乎希望它被视为无符号字符(8位)。您可以通过获取not的结果并使用0xFF
执行按位and来解决此问题。因此:
(~0x35) & 0xFF
> 202
((~0x35) & 0xFF).toString(16)
> "ca"
以下说明顺序:
00408091 |> F6D3 ||NOT BL
00408093 |. FEC3 ||INC BL
00408095 |. 02D3 ||ADD DL,BL
将BL
和DL
中的字节视为有符号值,本质上是从DL
中减去BL
。前两个将BL
的2的补码否定作为一个字节,然后第三个将被否定的BL
添加到DL
。除非后续有处理特定的指令对于处理器状态标志,我不知道为什么它不只是说,subdl,BL
因此,我认为这组说明可以转化为:
b -= a;
而不是逐字翻译每一条指令
这在某种程度上取决于整个asm程序的上下文,以及如何处理BL
和DL
。如果它们一致地被视为字节值T,则上述操作应该有效
b -= a;