2014-12-04 51 views
3

我無法找到一種方法來比較x86彙編代碼中的正數和負數。如何比較x86程序集中的有符號值和無符號值

例如:當我比較-1和1時,總是得到-1。我知道這是因爲2的補碼格式使-1在底層二進制中大於1。

但是,任何人都可以提供一個x86程序集片段來比較正數和負數,並使其在數學上正確嗎? (例如1> -1)

謝謝!

+1

一個不一定是未簽名的。有符號和無符號比較是相同的 - 這都是你如何解釋標誌。那麼,你怎麼解釋旗幟? :) – 2014-12-04 01:49:44

回答

7

你使用像無符號變體之一可能

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 
2

您不能直接比較兩個不同符號的數字。實際上大多數軟件語言都有這種流程。 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 .. )

相關問題