簡體   English   中英

x86-32匯編中128位無符號整數的比較

[英]Comparison of 128 bit unsigned integers in x86-32 assembly

我試圖在2 128位整數之間進行比較,我似乎無法弄明白!

具體來說,我有一大堆IPv6 IP地址(分配塊的起始和結束地址),我正在嘗試確定特定IP地址是否位於這些塊之間,因此它不是直接比較,更像是嘗試檢查是否大於起始地址和低於結束地址。

我正在使用帶有MASM32的WinAsm Studio,如果這有任何區別的話。

對IPv4地址進行此​​操作很簡單,但是,我不知道如何對128位無符號整數(4 x DWORD)進行此操作。

先感謝您。

否則,只需使用從最重要的塊開始的標量代碼進行范圍檢查。

在使用cmp和標志寄存器的CPU上,這可以通過以下方式完成:

  • 比較數字的最高部分(例如最高32位)( cmp指令)
  • 如果不是“Equal”,跳轉到“EndOfCompare”(x86: jne指令)
  • 比較數字的下一部分(例如32位)
  • 如果不是“Equal”,請跳轉到“EndOfCompare”
  • ...
  • 比較數字的下一部分(例如32位)
  • 如果不是“Equal”,請跳轉到“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)為真,則ecx將具有值0(並且由於or指令將設置零標志)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM