2012-04-18 124 views
1

我發現下面的彙編代碼,我不知道它是什麼應該做的事情(主要是因爲cmovg遵循MOVL指令):解釋彙編代碼

pushl %ebp 
movl %esp, %ebp 
movl 8(%ebp), %edx 
movl %edx, %eax 
sarl $31, %eax 
testl %edx, %edx 
movl $1, %edx 
cmovg %edx, %eax 
popl %ebp 
ret 

因此,這裏是如何我已經解釋這麼遠: 推入堆棧

一個新的指針(堆棧指針)創建在相同的位置爲基指針

獲取輸入到點(讓我們稱之爲X)

拷貝x轉換成寄存器%eax中(RES = X)

解析度= RES >> 31符號擴展

測試x

設置x = 1

如果>,RES = X

恢復指針

回報水庫

但是,我不確定這個子程序的意義是什麼。對我來說似乎沒用。如果你能指出這裏正在做什麼,我將不勝感激。

+1

你從哪裏找到它的?應該給你一個線索是什麼目的。 – 2012-04-18 11:31:19

+0

在一個文檔中連同大量的其他子程序是用來執行數學函數的。該文件沒有註釋,所以在這個意義上它是無用的。 – 2012-04-18 11:32:37

+0

我猜測這是某種數學運算。但是這對我沒有多大幫助。 – 2012-04-18 11:33:16

回答

6

此代碼返回X的符號在C:

int sign(int x) { 
    if (x>0) 
     return 1; 
    else if (x==0) 
     return 0; 
    else 
     return -1; 
} 

指令sarl $31, %eax會把-1eax如果它是消極的,或者以其他方式0。如果x爲正,那麼cmovg指令將用1代替該值。

+0

如果x = 1,你還不會得到0嗎?! – 2012-04-18 12:09:34

+0

@DanP .:否。'test%edx,%edx'指令將'x'與'0'進行比較。由於它大於0,因此'cmovg'指令會將1放入'eax'中。 – interjay 2012-04-18 12:17:35