我正在尝试在2 128位整数之间进行比较,但我似乎无法弄清楚!
具体来说,我有一堆IPv6 IP地址(分配块的起始地址和结束地址),并且我试图确定在这些块之间是否有特定的IP地址,所以这不是直接比较,更像是尝试检查是否大于开始地址而小于结束地址。
如果这有任何区别,我正在将WinAsm Studio与MASM32一起使用。
对IPv4地址进行此操作很简单,但是,我不知道如何对128位无符号整数(4 x DWORD)进行此操作。
谢谢。
答案 0 :(得分:2)
否则,只需使用从最高有效块开始的标量代码即可进行范围检查。
在使用cmp
和标志寄存器的CPU上,这是通过以下方式完成的:
cmp
指令)的最高部分(例如最高32位)jne
指令)a<b
,a=b
或a>b
)的信息,就像您执行了一个简单的cmp
指令来比较两个小数字一样数字。不幸的是,这个简单的变体仅适用于无符号数字。
顺便说一句,通常一个块在IP地址空间中是“对齐的”,因此您只需要检查屏蔽掉低位并比较高位是否相等。
可以在32位CPU上通过以下方式检查(A AND MASK) = (B AND MASK)
:
mov ecx, part 1 of A
xor ecx, part 1 of B
and ecx, part 1 of MASK
mov eax, part 2 of A
xor eax, part 2 of B
and eax, part 2 of MASK
or ecx, eax
mov eax, part 3 of A
xor eax, part 3 of B
and eax, part 3 of MASK
or ecx, eax
...
对于128位数字,您需要4个“部分”。
“第1部分”是数字的高位还是低位无关紧要。
如果(A AND MASK) = (B AND MASK)
为true,则ecx
的值为0(并且由于or
指令而设置了零标志)。