簡體   English   中英

cmp je/jg 它們如何在裝配中工作

[英]cmp je/jg how they work in assembly

我想了解 cmp 和 je/jg 在匯編中是如何工作的。 我在谷歌上看到了幾個例子,但我仍然有點困惑。 下面我展示了我試圖轉換為 C 語言的一部分匯編代碼和相應的 C 代碼。 它是否以正確的方式實施,還是我對 cmp 的工作方式有錯誤的理解?

cmp    $0x3,%eax
je     A
cmp    $0x3,%eax
jg     B
cmp    $0x1,%eax
je     C


 int func(int x){


  if(x == 3)
    goto A;

  if (x >3)
    goto B;


  if(x == 1)
     goto C;

    A:
    ......

    B:
    ......

    C:
    ......

您正確理解了 cmp 和 je/jg 的工作原理,但是您的 C 代碼中有錯誤。 這一行:

if (*x == 1)

應該

if (x == 1)

是 x86 控制流指令的一個很好的總結。

此外,沒有理由對相同的值重復 cmp 指令。 執行后,您可以通過多種方式測試結果,而無需重復比較。 所以你的匯編代碼應該是這樣的:

cmp    $0x3,%eax
je     A
jg     B
cmp    $0x1,%eax
je     C

是的,這是正確的,除了在您的 C 代碼中,您在第三個示例中使用*x而在其他示例中使用x ,這是沒有意義的。 在您的匯編代碼中沒有對應的代碼。

在 C 中,變量類型(有符號/無符號)是在聲明變量時定義的,例如。 int xunsigned int x ,但在匯編中,用於比較的有符號和無符號變量(無論是在內存中還是在寄存器中)之間的區別是通過不同的條件跳轉來實現的:

對於有符號變量:

jg  ; jump if greater
jl  ; jump if less
jge ; jump if greater or equal, "jnl" is synonymous
jle ; jump if less or equal, "jng" is synonymous

對於無符號變量:

ja  ; jump if above
jb  ; jump if below
jae ; jump if above or equal, "jnb" is synonymous
jbe ; jump if below or equal, "jna" is synonymous

英特爾 x86 JUMP 快速參考列出了x86程序集中可用的所有條件跳轉,以及它們的條件(標志值)和它們的短跳轉和長跳轉的操作碼。

您可能已經知道,處理器會在所謂的標志寄存器中跟蹤上次操作期間發生的事情。 例如,如果操作發生溢出或結果為零等,則有一個標志。 cmp 助記符告訴處理器將兩個寄存器/寄存器和內存內容相減,並更改正確的標志。 之后,您可以使用已完成的跳躍進行跳躍。 處理器檢查標志以查看它是否相等(檢查零標志),或者它是否更小/更大(無符號溢出標志和溢出標志和有符號數字標志標志)。

暫無
暫無

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

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