[英]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.