diff options
Diffstat (limited to 'apps/factorial4.subx')
-rw-r--r-- | apps/factorial4.subx | 88 |
1 files changed, 0 insertions, 88 deletions
diff --git a/apps/factorial4.subx b/apps/factorial4.subx deleted file mode 100644 index a22c7246..00000000 --- a/apps/factorial4.subx +++ /dev/null @@ -1,88 +0,0 @@ -## compute the factorial of 5, and return the result in the exit code -# -# Uses syntax sugar for: -# rm32 operands -# function calls -# control flow -# -# To run: -# $ ./translate_subx init.linux [01]*.subx apps/factorial.subx -o apps/factorial -# $ ./bootstrap run apps/factorial -# Expected result: -# $ echo $? -# 120 -# -# You can also run the automated test suite: -# $ ./bootstrap run apps/factorial test -# Expected output: -# ........ -# Every '.' indicates a passing test. Failing tests get a 'F'. -# -# Compare apps/factorial3.subx - -== code - -factorial: # n: int -> _/eax: int - # . prologue - 55/push-ebp - 89/<- %ebp 4/r32/esp - # save registers - 51/push-ecx - # if (n <= 1) return 1 - 81 7/subop/compare *(ebp+8) 1/imm32 - { - 7f/jump-if-> break/disp8 - b8/copy-to-eax 1/imm32 - eb/jump $factorial:end/disp8 - } - # n > 1; return n * factorial(n-1) - 8b/-> *(ebp+8) 1/r32/ecx - 49/decrement-ecx - (factorial %ecx) # => eax - f7 4/subop/multiply-into-eax *(ebp+8) - # TODO: check for overflow -$factorial:end: - # restore registers - 59/pop-to-ecx - # . epilogue - 89/<- %esp 5/r32/ebp - 5d/pop-to-ebp - c3/return - -test-factorial: - (factorial 5) - (check-ints-equal %eax 0x78 "F - test-factorial") - c3/return - -Entry: # run tests if necessary, compute `factorial(5)` if not - # . prologue - 89/<- %ebp 4/r32/esp - - # initialize heap (needed by tests elsewhere) - (new-segment *Heap-size Heap) - - # if (argc <= 1) return factorial(5) - { - # if (argc > 1) break - 81 7/subop/compare *ebp 1/imm32 - 7f/jump-if-> break/disp8 - # ebx = factorial(5) - (factorial 5) # => eax - 89/<- %ebx 0/r32/eax - eb/jump $main:end/disp8 - } - # otherwise if first arg is "test", then return run_tests() - { - # if (!kernel-string-equal?(argv[1], "test")) break - (kernel-string-equal? *(ebp+8) "test") # => eax - 3d/compare-eax-and 0/imm32/false - 74/jump-if-= break/disp8 - # - (run-tests) - # exit(*Num-test-failures) - 8b/-> *Num-test-failures 3/r32/ebx - eb/jump $main:end/disp8 - } - bb/copy-to-ebx 0/imm32 -$main:end: - e8/call syscall_exit/disp32 |