diff options
Diffstat (limited to 'apps/factorial2.subx')
-rw-r--r-- | apps/factorial2.subx | 100 |
1 files changed, 51 insertions, 49 deletions
diff --git a/apps/factorial2.subx b/apps/factorial2.subx index 0eaaf049..7d303227 100644 --- a/apps/factorial2.subx +++ b/apps/factorial2.subx @@ -15,58 +15,11 @@ # Expected output: # ........ # Every '.' indicates a passing test. Failing tests get a 'F'. +# +# Compare apps/factorial.subx == code -Entry: # run tests if necessary, compute `factorial(5)` if not - # . prologue - 89/<- %ebp 4/r32/esp - - # initialize heap - # . Heap = new-segment(Heap-size) - # . . push args - 68/push Heap/imm32 - ff 6/subop/push *Heap-size - # . . call - e8/call new-segment/disp32 - # . . discard args - 81 0/subop/add %esp 8/imm32 - - # - if argc > 1 and argv[1] == "test", then return run_tests() - # if (argc <= 1) goto run-main - 81 7/subop/compare *ebp 1/imm32 - 7e/jump-if-<= $run-main/disp8 - # if (!kernel-string-equal?(argv[1], "test")) goto run-main - # . eax = kernel-string-equal?(argv[1], "test") - # . . push args - 68/push "test"/imm32 - ff 6/subop/push *(ebp+8) - # . . call - e8/call kernel-string-equal?/disp32 - # . . discard args - 81 0/subop/add %esp 8/imm32 - # . if (eax == false) goto run-main - 3d/compare-eax-and 0/imm32/false - 74/jump-if-= $run-main/disp8 - # run-tests() - e8/call run-tests/disp32 - # syscall(exit, *Num-test-failures) - 8b/-> *Num-test-failures 3/r32/ebx - eb/jump $main:end/disp8 -$run-main: - # - otherwise return factorial(5) - # eax = factorial(5) - # . . push args - 68/push 5/imm32 - # . . call - e8/call factorial/disp32 - # . . discard args - 81 0/subop/add %esp 4/imm32 - # syscall(exit, eax) - 89/<- %ebx 0/r32/eax -$main:end: - e8/call syscall_exit/disp32 - factorial: # n: int -> int/eax # . prologue 55/push-ebp @@ -115,3 +68,52 @@ test-factorial: 81 0/subop/add %esp 0xc/imm32 # end c3/return + +Entry: # run tests if necessary, compute `factorial(5)` if not + # . prologue + 89/<- %ebp 4/r32/esp + + # initialize heap + # . Heap = new-segment(Heap-size) + # . . push args + 68/push Heap/imm32 + ff 6/subop/push *Heap-size + # . . call + e8/call new-segment/disp32 + # . . discard args + 81 0/subop/add %esp 8/imm32 + + # - if argc > 1 and argv[1] == "test", then return run_tests() + # if (argc <= 1) goto run-main + 81 7/subop/compare *ebp 1/imm32 + 7e/jump-if-<= $run-main/disp8 + # if (!kernel-string-equal?(argv[1], "test")) goto run-main + # . eax = kernel-string-equal?(argv[1], "test") + # . . push args + 68/push "test"/imm32 + ff 6/subop/push *(ebp+8) + # . . call + e8/call kernel-string-equal?/disp32 + # . . discard args + 81 0/subop/add %esp 8/imm32 + # . if (eax == false) goto run-main + 3d/compare-eax-and 0/imm32/false + 74/jump-if-= $run-main/disp8 + # run-tests() + e8/call run-tests/disp32 + # syscall(exit, *Num-test-failures) + 8b/-> *Num-test-failures 3/r32/ebx + eb/jump $main:end/disp8 +$run-main: + # - otherwise return factorial(5) + # ebx = factorial(5) + # . . push args + 68/push 5/imm32 + # . . call + e8/call factorial/disp32 + # . . discard args + 81 0/subop/add %esp 4/imm32 + # + 89/<- %ebx 0/r32/eax +$main:end: + e8/call syscall_exit/disp32 |