我無法找到一種方法來比較x86彙編代碼中的正數和負數。如何比較x86程序集中的有符號值和無符號值
例如:當我比較-1和1時,總是得到-1。我知道這是因爲2的補碼格式使-1在底層二進制中大於1。
但是,任何人都可以提供一個x86程序集片段來比較正數和負數,並使其在數學上正確嗎? (例如1> -1)
謝謝!
我無法找到一種方法來比較x86彙編代碼中的正數和負數。如何比較x86程序集中的有符號值和無符號值
例如:當我比較-1和1時,總是得到-1。我知道這是因爲2的補碼格式使-1在底層二進制中大於1。
但是,任何人都可以提供一個x86程序集片段來比較正數和負數,並使其在數學上正確嗎? (例如1> -1)
謝謝!
你使用像無符號變體之一可能:
cmp eax, ebx
jb lesser
有等價物相互覈對符號數,如:
cmp eax, ebx
jl lesser
This link提供了良好的追蹤跳躍變化,包括他們的簽名和他們檢查的標誌,部分複製在這裏以進行自我控制:
Instruction Jump if ... Signed? Flags
----------- ----------- -------- -----
JO overflow OF=1
JNO not overflow OF=0
JS sign SF=1
JNS not sign SF=0
JE/JZ equal
zero ZF=1
JNE/JNZ not-equal
not-zero ZF=0
JB/JNAE/JC below
not-above-or-equal
carry unsigned CF=1
JNB/JAE/JNC not-below
above-or-equal
no-carry unsigned CF=0
JBE/JNA below-or-equal
not-above unsigned CF=1 or ZF=1
JA/JNBE above
not-below-or-equal unsigned CF=0 and ZF=0
JL/JNGE less
not-greater-or-equal signed SF<>OF
JGE/JNL greater-or-equal
not-less signed SF=OF
JLE/JNG less-or-equal
not-greater signed ZF=1 or SF<>OF
JG/JNLE greater
not-less-or-equal signed ZF=0 and SF=OF
JP/JPE parity
parity-even PF=1
JNP/JPO not-parity
parity-odd PF=0
JCXZ/JECXZ CX register is zero
ECX register is zero
您不能直接比較兩個不同符號的數字。實際上大多數軟件語言都有這種流程。 C和C++特別提到,在他們的文檔中並且在大多數情況下,當您在同一個表達式中使用帶符號和無符號整數時會生成警告,從而導致未知符號。
唯一的辦法是首先檢查簽名的數字是否定的,如果是的話就知道它比較小。然後你可以將這兩個數字作爲無符號整數進行比較。
; is eax < ebx (eax signed, ebx unsigned)
cmp eax, $0
jl less
cmp eax, ebx
jc less
旁註:顯然可以比較簽訂了兩個數字,如果它們的大小小於處理器所支持的最大尺寸。在這種情況下,您可以適當擴展已簽名和未簽名的位,然後您可以比較兩個值是否已簽名。
假設你想比較兩個字節A1和B1,那麼你可以有這樣的事情:
movsx ax, al
xor bh, bh ; or movzx bx, bl
cmp ax, bx
jl less
(注意,我不保證JL是正確的,它可能是JLE或JNL .. )
一個不一定是未簽名的。有符號和無符號比較是相同的 - 這都是你如何解釋標誌。那麼,你怎麼解釋旗幟? :) – 2014-12-04 01:49:44