簡體   English   中英

我試着理解 [c 代碼 -> 匯編] 代碼

[英]I try to understand [c code -> assembly] code

我試着理解 [c 代碼 -> 匯編] 代碼

void node::Check( data & _data1, vector<data2*>& _data2)
{

-> push ebp
-> mov ebp,esp 
-> push ebx

if (TryToCheck(_data1.a, _data1.b))

-> mov ebx,dword ptr [_data1]
  1. 我不確定這行是做什么的 這行是什么意思,

     push esi mov esi,ecx
  2. 據我所知, ecx是一個計數值。 為什么要在esi保存ecx的值?

     mov eax,dword ptr [esi+50h]
  3. 這意味着什么值, 50h

     mov eax,dword ptr [eax+4] lea edx,[ebx+40h] lea ecx,[esi+50h] push edx lea edx,[ebx+50h] push edx call eax test al,al je node::Check+7Fh
push ebp
mov ebp,esp 

這將保存調用者的堆棧幀指針 ( push ebp ) 並設置您的堆棧幀指針 ( mov ebp,esp )。

push ebx 

這將ebx保存在堆棧上。 稍后,在返回之前的某個地方,您將看到一個pop ebx

mov ebx,dword ptr [_data1]

這會將位置_data1的內容移動到ebx寄存器中。 調試器會顯示一個符號名稱; 如果你仔細觀察,你會看到move ebx,dword ptr [ebp+12] 這里調用者的參數是使用ebp的堆棧幀指針訪問的。

push esi
mov esi,ecx

這會保存esi ,然后將ecx的值移動到esi

mov eax,dword ptr [esi+50h]

這會將esi+50h處的內存位置的值移動到eax

有時您不必太擔心編譯器生成的匯編程序。 它可能不是最佳的,或者可能優化得你無法識別你的原始陳述。

暫無
暫無

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

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