这与我的预览question有关。
C中函数的完整ASM是here。
我的问题在于:
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++;
}
我的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('--------------------------');
}
最佳答案
以下说明顺序:
00408091 |> F6D3 ||NOT BL
00408093 |. FEC3 ||INC BL
00408095 |. 02D3 ||ADD DL,BL
将
BL
和DL
中的字节作为有符号值,并从BL
中减去DL
。前两个将2的补码否定BL
作为一个字节,然后第三个将否定的BL
添加到DL
。除非有后续指令以某种方式处理处理器状态标志,否则我不确定它为什么不直接说,SUB DL,BL
。所以我认为这一组指令可以转化为:
b -= a;
而不是逐字翻译每一条指令。
这在一定程度上取决于整个asm程序的上下文,如何处理
BL
和DL
。如果它们被一致地视为字节值,那么上面的方法应该可以工作。关于javascript - 来自C ASM的NodeJS按位运算符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22767680/