![](/img/trans.png)
[英]gcc with intel x86-32 bit assembly : accessing C function arguments
[英]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上,這可以通過以下方式完成:
cmp
指令) 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)
為真,則ecx
將具有值0(並且由於or
指令將設置零標志)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.