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