HPSTART: CMP EBX, 1 // if n = 1
JNE HPERMUT
MOV EDX, N
INSERT: MOV ECX, Perm[4320 + EDX * 4]
MOV Perm[EDI * 4], ECX
INC EDI
DEC EDX
TEST EDX, EDX
JNZ INSERT
RET
HPERMUT: XOR ESI, ESI // ELSE , i = 0
HLOOP: CMP ESI, EBX // i < N for (i = 0; i < n; i++)
JE ITEREND
PUSH ESI
DEC EBX
CALL HPSTART
这是我正在处理的一段代码。
EBX(最大值 6)从 6 开始。
在跨过 CALL HPSTART 行时,我希望看到下一条语句指针返回到 hpstart 并继续执行整个操作,直到 EBX 为 1 的最后一个递归调用,然后开始回溯到第一个函数调用(我没有'不包括函数的其余部分)。
相反,它立即执行了所有递归调用(EBX 被正确设置为 1,并且值被正确打印到数组中)并直接进入下一行(MOV EAX,EAX)。
那里发生了什么?编译后的代码在执行之前会计算递归调用吗?
这是在视觉工作室中使用 _asm 完成的