x86-32汇编中128位无符号整数的比较

时间:2019-07-11 08:21:17

标签: assembly x86 comparison

我正在尝试在2 128位整数之间进行比较,但我似乎无法弄清楚!

具体来说,我有一堆IPv6 IP地址(分配块的起始地址和结束地址),并且我试图确定在这些块之间是否有特定的IP地址,所以这不是直接比较,更像是尝试检查是否大于开始地址而小于结束地址。

如果这有任何区别,我正在将WinAsm Studio与MASM32一起使用。

对IPv4地址进行此​​操作很简单,但是,我不知道如何对128位无符号整数(4 x DWORD)进行此操作。

谢谢。

1 个答案:

答案 0 :(得分:2)

  

否则,只需使用从最高有效块开始的标量代码即可进行范围检查。

在使用cmp和标志寄存器的CPU上,这是通过以下方式完成的:

  • 比较数字(cmp指令)的最高部分(例如最高32位)
  • 如果不是“等于”,则跳转到“ EndOfCompare”(x86:jne指令)
  • 比较数字的下一部分(例如32位)
  • 如果不是“等于”,则跳转到“ EndOfCompare”
  • ...
  • 比较数字的下一部分(例如32位)
  • 如果不是“等于”,则跳转到“ EndOfCompare”
  • 比较数字的最低部分(例如最低的32位)
  • “ EndOfCompare”:
    此时,标志寄存器包含有关两个大数字的顺序(a<ba=ba>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指令而设置了零标志)。