簡體   English   中英

了解匯編中的cmp

[英]Understanding cmp in assembly

我正在查看如下匯編代碼:

cmp dword [rbp-0x4 {var_c}], 0x0
jne 0x12c0

對我來說,這是:

比較something和null的值,如果沒有錯誤(即它們匹配),則跳轉到0x12c0。

那是對的嗎? 我不知道什么是[rbp-0x4 {var_c}]或為什么我們將其與null進行比較。

我確實嘗試並按照圖表來了解這些變量是什么,並且得到了以下信息:

  • 0x4 = uint8_t file_class = 0x2
  • var_c = In Set of Values {0, 1}
  • rbp似乎是從main推入的

任何幫助理解這一點將不勝感激。 我正在尋找有關在cmp語句中進行比較的說明。

不完全是,更多:

將某物的值與零進行比較,如果不相等,則跳轉。

匯編語言有沒有“空”的概念和cmp通常是相同的一個sub (減法),但沒有實際改變值。 基本上是:

將標志設置為好像我從某物減去零。

以更偽代碼的方式,您的兩條指令總計為:

if var_c <> 0 then goto label_12c0

rbp似乎是從main推入的

rbp是一個CPU寄存器(與所有CPU寄存器一樣)存儲一個值。

我不想在這里過分詳細,但是大多數編譯器使用寄存器rbp來存儲信息,該信息用於將函數的局部變量(有時是函數參數)存儲在RAM存儲器中:

通常通過從rbp寄存器中存儲的值中減去一些常數來計算存儲某個局部變量的地址(RAM存儲器中的位置)。

我不明白[rbp-0x4 {var_c}]是什么...

dword [rbp-0x4]表示:一個存儲在地址rbp-4上的32位值:該地址是通過從存儲在寄存器rbp的值減去值4得出的。

編譯器已將調試器的其他信息放入二進制文件中。 這個信息說,局部變量的地址var_c被計算rbp-4和局部變量的地址some_other_variable被計算rbp-10等等...

反匯編程序已讀取此信息,並在rbp-0x4之后打印{var_c} ,以表明變量var_c位於地址rbp-0x4 因此,32位值“ dword [rbp-0x4] ”可能是變量“ var_c ”。

0x4 = uint8_t file_class = 0x2

我不知道這是什么信息。 但價值0x4這里無關與價值0x4在拆卸線( rbp-0x4 )。

...,如果沒有錯誤(即它們匹配),則跳至0x12c0。

jne意思是: “ĴUMP如果n OTËQUAL”。

這意味着如果變量var_c 等於0,則CPU將跳轉。

請注意,在表示if()分支的已編譯代碼中,如果條件為false ,則跳轉指令通常將跳轉:

如果條件為false ,則CPU跳轉到else部分或if()部分之后的第一條指令。 如果條件為 ,則CPU 跳但執行的第一指令if()以下的部分jne (或類似的)指令。

因為如果var_c 為零,則示例會跳轉,因此源代碼很可能類似於if(var_c == 0)

暫無
暫無

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

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