这与我的预览question有关。
C中函数的完整ASM是here。
我的问题在于:
00408091 |> F6D3 ||NOT BL
00408093 |. FEC3 ||INC BL
00408095 |. 02D3 ||ADD DL,BL
当我在0x35
上使用NOT按位运算符时,在javascript上返回-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 < hashed.length; i++) {
var a = hashed[i];
var b = seqX[i];
var c = seqX[i+1];
var stepIn = i+1;
var stepOver = stepIn-1;
// cmp BL, DL -- 0x63, 0x4e -- 0xf9, 0xc5 -- 0x75. 0x7a
for (var j = internalRounds - 1; j > 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('--------------------------');
}
答案 0 :(得分:2)
以下指令序列:
00408091 |> F6D3 ||NOT BL
00408093 |. FEC3 ||INC BL
00408095 |. 02D3 ||ADD DL,BL
将BL
和DL
中的字节视为有符号值,并基本上从BL
减去DL
。前两个将BL
的2的补码否定作为一个字节,然后第三个将否定的BL
添加到DL
。除非有后续指令以某种方式处理处理器状态标志,否则我不确定它为什么不只是说SUB DL,BL
。
所以我认为这组指令只会转化为:
b -= a;
而不是逐字翻译每条指令。
这在一定程度上取决于整个asm计划的背景,如何处理BL
和DL
。如果它们被一致地视为字节值,则上述应该有效。
答案 1 :(得分:0)
因为javascript总是以32位有符号整数运行。所以你必须将结果截断为8位。
(~0x35) & 0xFF // results 0xCA
答案 2 :(得分:0)
看起来你有两个问题。首先是你正在做~35
,而不是0x35
(第一个是十进制35,第二个是十六进制35)。
第二个是javascript中的bitwise-not将参数转换为32位有符号整数,而看起来你希望它被视为unsigned char(8位)。您可以通过获取not的结果并按位进行并使用0xFF
来解决此问题。所以:
(~0x35) & 0xFF
> 202
((~0x35) & 0xFF).toString(16)
> "ca"