Javascript C ASM中的NodeJS位运算符

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; }

这与我的预览有关

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;
  } 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;