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 で行われます