2011-11-15 80 views
0

部分的for循環JMP如何在此程序中返回給調用者?

; ....... 

    jmp SHORT [email protected]    ; enter the loop body 

[email protected]:         ; incrementation 
    mov eax, DWORD PTR _p$2534[ebp]   
    add eax, 4 
    mov DWORD PTR _p$2534[ebp], eax 

[email protected]: 
    mov eax, DWORD PTR _p$2534[ebp]   ; check conditions 
    cmp eax, DWORD PTR _length$[ebp] 
    jae SHORT [email protected]    ; when loop condition fails... 

; 6 : { 
; 7 :  *p = 0; 

    mov eax, DWORD PTR _p$2534[ebp]   ; loop body 
    mov DWORD PTR [eax], 0 

; 8 : } 

    jmp SHORT [email protected] 

[email protected]: 

; ........ 

當$ LN2完成,它是如何返回到$ LN3? 這是由Visual Studio 2010 C++彙編程序輸出生成的。

謝謝。

+0

如果你低估了這個線程,最好說明你的理由,而不是隻是downvote和離開。我討厭downvote而沒有給出理由。對某些人來說這似乎微不足道,但有時人們會忘記一些東西。這就是爲什麼存在stackoverflow。有時候我看到很好的工程師在這裏發佈問題,我可以通過查看錯誤來回答他們,但他們不能。那是因爲我是一個局外人,我清楚地看待這個問題。所以請不要沒有理由地倒退。這顯然是無知的。如何提高我的問題質量?通過給我反饋。 – CppLearner

回答

4

A jmp指令的行爲如同goto聲明。它將控制轉移到一個新的位置,並在那一點繼續執行;你不會從jmp返回(儘管你可以發出另一個jmp)。

在這個特定的例子中,$ LN2中的代碼跌落到$ LN3,所以每次$ LN2執行時,$ LN3都會執行。 $ LN3處的代碼正在比較循環計數器以查看它是否已達到最大值。 cmp(「比較」)和jae(「跳轉高於或等於」)指令執行比較,如果條件滿足(即計數器等於或大於長度),則退出循環。換句話說,如果你的循環計數器長度爲<,那麼jae什麼都不做,並且直到下一條指令。但是,如果counter> = length,則跳轉到退出循環的$ LN4。

+0

非常感謝。它有助於。 :) – CppLearner

1

Errrr ...你是什麼意思,怎麼樣?控制流程從mov DWORD PTR...指令繼續到下一個指令,即mov eax, DWORD PTR

還是我誤解了你的問題?

+0

謝謝。我認爲cbranch明白了。我主要對jmp指令感興趣。我可能迷惑了自己。謝謝。 – CppLearner

相關問題