Как JMP возвращает вызывающему в этой программе? - PullRequest
0 голосов
/ 15 ноября 2011

Часть цикла for

    ; .......

    jmp SHORT $LN3@clearArray                ; enter the loop body

$LN2@clearArray:                                 ; incrementation
    mov eax, DWORD PTR _p$2534[ebp]          
    add eax, 4
    mov DWORD PTR _p$2534[ebp], eax

$LN3@clearArray:
    mov eax, DWORD PTR _p$2534[ebp]          ; check conditions
    cmp eax, DWORD PTR _length$[ebp]
    jae SHORT $LN4@clearArray                ; 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 $LN2@clearArray

$LN4@clearArray:

; ........

Когда $ LN2 завершен, как он возвращается к $ LN3?Это генерируется выводом ассемблера Visual Studio 2010 C ++.

Спасибо.

Ответы [ 2 ]

4 голосов
/ 15 ноября 2011
Инструкция

A jmp действует как инструкция goto. Он передает управление на новое место, и выполнение продолжается в этой точке; вы не вернетесь с jmp (хотя вы можете выпустить еще jmp).

В этом конкретном примере код в $ LN2 падает до $ LN3, поэтому каждый раз, когда выполняется $ LN2, будет выполняться $ LN3. Код в $ LN3 сравнивает счетчик цикла, чтобы увидеть, достигло ли оно максимального значения. Инструкции cmp («сравнить») и jae («выше или равно») выполняют сравнение, а затем выходят из цикла, если условие выполнено (то есть счетчик равен или превышает длину). Другими словами, если ваш счетчик цикла <длина, то <code>jae ничего не делает и переходит к следующей инструкции. Однако, если counter> = length, вы переходите к $ LN4, который выходит из цикла.

1 голос
/ 15 ноября 2011

Errrr ... Что вы имеете в виду, как? Поток управления просто продолжается от инструкции mov DWORD PTR... к следующей, то есть mov eax, DWORD PTR.

Или я неправильно понял ваш вопрос?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...