2010-05-06 124 views
3

我有一些代碼從功能幫助從彙編轉換到C

subl $24, %esp 
movl 8(%ebp), %eax 
cmpl 12(%ebp), %eax 

代碼之前僅僅是「ENTER」命令,之後有一個if語句返回1,如果是EBP> EAX或0減。我假設cmpl意味着比較,但我無法分辨具體的值是什麼。誰能告訴我發生了什麼?

回答

18

是的cmpl意味着比較(與4字節參數)。假設一段代碼之後是jg <addr>

movl 8(%ebp), %eax 
cmpl 12(%ebp), %eax 
jg <addr> 

然後代碼類似於

eax = ebp[8]; 
if (eax > ebp[12]) 
    goto <addr>; 
+0

感謝幫助清除了一些東西:) – GetOffMyLawn 2010-05-06 05:49:18

+0

對於那些想做一個快速的作弊。按照以下順序:1)讀取cmpl的右操作數,2)讀取跳轉指令的第二個字母,以及3)讀取比較指令的左操作數。所以在這種情況下:if('%eax' is'[l] ess than''ebp [12]')。應該幫助你快速閱讀代碼 – bluejamesbond 2014-10-17 22:51:22

0

這是(EBP + 8)和(EBP + 12)之間的比較。根據比較結果,cmpl指令設置後續跳轉指令使用的標誌。

Mac OS X 32 bit ABI EBP + 8是第一個函數參數,EBP + 12是第二個參數。

2

你的代碼片段類似於一個由處理器和編譯器所使用的入口代碼條目代碼是編譯器在輸入函數時發出的彙編代碼。

入口代碼負責保存函數參數併爲局部變量分配空間並可選擇初始化它們。入口代碼使用指向變量存儲區域的指針。一些處理器使用EBP和ESP寄存器的組合來指向局部變量(和函數參數)的位置。

由於編譯器知道變量(和函數參數)的存儲位置,因此它將刪除變量名稱並使用數字索引。例如,行:

movl 8(%ebp), %eax 

要麼移動至第八本地變量的內容到寄存器EAX,或在8個字節從所述局部區域的開始移動的值(假設的EBP寄存器指針以局部變量區的開始)。

指令:

subl $24, %esp 

意味着編譯器保留在堆棧上24個字節。這可能是爲了保護函數調用約定中的一些信息。該功能將能夠在此之後使用該區域用於自己的使用。該保留區域可能包含功能參數。

您提供的代碼片段看起來是一個比較函數內部兩個局部變量:

void Unknown_Function(long param1, long param2, long param3) 
{ 
    unsigned int local_variable_1; 
    unsigned int local_variable_2; 
    unsigned int local_variable_3; 

    if (local_variable_2 < local_variable_3) 
    { 
    //... 
    } 
} 

嘗試拆卸上面的功能,看看它是如何接近你的代碼片段相匹配。