c/c++语言开发共享来自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" 

      以上就是c/c++开发分享来自C ASM的NodeJS按位运算符相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/522554.html

      (0)
      上一篇 2020年12月10日
      下一篇 2020年12月10日

      精彩推荐