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 ++汇编程序输出生成的。
谢谢。
答案 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
。
或者我误解了你的问题?