JMP如何在此程序中返回给调用者?

时间:2011-11-15 05:13:56

标签: assembly x86

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 个答案:

答案 0 :(得分:4)

jmp指令的作用类似goto。它将控制权转移到新的位置,并在此时继续执行;您没有从jmp返回(尽管您可以发出另一个jmp)。

在此特定示例中,$ LN2处的代码落到$ LN3,因此每次$ LN2执行时,$ LN3将执行。 $ LN3的代​​码是比较循环计数器以查看它是否已达到最大值。 cmp(“比较”)和jae(“跳过或等于”)指令执行比较,如果条件满足则退出循环(即,计数器等于或大于比长度)。换句话说,如果你的循环计数器<长度,然后jae什么也不做,直到下一条指令。但是,如果计数器> =长度,则跳转到$ LN4,退出循环。

答案 1 :(得分:1)

Errrr ......你是什么意思,怎么样?控制流程从mov DWORD PTR...指令继续到下一个指令,即mov eax, DWORD PTR

或者我误解了你的问题?