2015-11-08 28 views
-4

我明白這段代碼是幹什麼的,直到它離開循環並執行指令cmpl $ 0x632,-0x4(%ebp)。 應該是什麼我的輸入,使得SETE%人將1個 PS:語法是AT & T,它假定第一個操作數源和第二個操作數是目標程序集x86代碼,0x632代表什麼?

08048862 <phase3>: 
8048862: 55      push %ebp 
8048863: 89 e5     mov %esp,%ebp 
8048865: 83 ec 10    sub $0x10,%esp 
8048868: c7 45 fc 00 00 00 00 movl $0x0,-0x4(%ebp) 
804886f: 83 45 fc 01    addl $0x1,-0x4(%ebp) 
8048873: 8b 45 fc    mov -0x4(%ebp),%eax 
8048876: 3b 45 08    cmp 0x8(%ebp),%eax 
8048879: 7e f4     jle 804886f <phase3+0xd> 
804887b: 81 7d fc 32 06 00 00 cmpl $0x632,-0x4(%ebp) 
8048882: 0f 94 c0    sete %al 
8048885: 0f b6 c0    movzbl %al,%eax 
8048888: c9      leave 
8048889: c3      ret  
+0

謝謝,我正要編輯它大聲笑 –

+2

0x632是Halt and Catch Fire值。如果一臺計算機在內存中看到它,它會導致計算設備的災難性故障。你應該立即離開你的家。對於任何人來說,破壞性的力量都會讓人無法忍受。這不奇怪,它出現在一個炸彈實驗室;) –

回答

0

sete al(對不起,使用Intel語法)將al設置爲1,必須設置零標誌。這意味着[ebp - 4]必須等於0x632

您必須從這裏開始工作並重新解釋前面的說明。

+0

該函數接受2個參數,第1 [ebp - 4]它被設置爲0,在jle之前它將[edp - 4]與第2個參數進行比較。我的問題是應該爲這些參數輸入什麼,所以當它離開循環時,[ebp-4]等於0x632。而且我怎樣才能在'char'中表示0x632,十進制數爲1586? –

+0

@KevinSilva即使你聲稱你瞭解代碼,你顯然不知道。對於初學者來說,它只接受一個參數,「ebp-4」是一個局部變量。 – Jester

+0

好的,但不是分配4字節的函數嗎?爲什麼它只有1個參數? –

1

這個功能要麼是跛腳,要麼是複雜的,我無法把握。它在[ebp-4]處以0開始本地,然後不斷遞增,直到它的值大於[ebp + 8]中參數的值。一旦完成循環,如果[ebp-4]處的本地值等於0x632(1586),它將返回true。在我看來,整個循環都可以避免,並且參數at [ebp + 8]可以改爲與0x632進行比較。

無論如何,在你的問題「應該是我的輸入」,通過「輸入」我假定你的意思是[ebp + 8]的參數。那麼,我會假定所有的區別在於你是否在[ebp + 8]參數中傳遞等於,小於或大於0x632的東西。

+1

是的,這是跛腳。它適用於剛學習裝配的學生。你得到了這個部分錯誤:_returns如果本地在[ebp-4]小於或等於0x632_,則返回true。它必須與**相等,因爲'sete'測試的是否相等。而對於地方來說,這個論點必須是一個具體的價值。 – Jester

+0

@Jester你是對的,等於它。 –

0

謝謝你的所有意見,他們是有幫助的。 它只需要1個參數,它是1585,所以當它得到的循環局部變量將是1586,這是十進制的0x632