0
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 完成的

4

0 回答 0