From 6e1eeeebfb453fa7c871869c19375ce60fbd7413 Mon Sep 17 00:00:00 2001 From: Kartik Agaram Date: Sat, 27 Jul 2019 16:01:55 -0700 Subject: 5485 - promote SubX to top-level --- html/subx/apps/factorial.subx.html | 182 ------------------------------------- 1 file changed, 182 deletions(-) delete mode 100644 html/subx/apps/factorial.subx.html (limited to 'html/subx/apps/factorial.subx.html') diff --git a/html/subx/apps/factorial.subx.html b/html/subx/apps/factorial.subx.html deleted file mode 100644 index ee50c85a..00000000 --- a/html/subx/apps/factorial.subx.html +++ /dev/null @@ -1,182 +0,0 @@ - - - - -Mu - subx/apps/factorial.subx - - - - - - - - - - -https://github.com/akkartik/mu/blob/master/subx/apps/factorial.subx -
-  1 ## compute the factorial of 5, and return the result in the exit code
-  2 #
-  3 # To run (from the subx directory):
-  4 #   $ ./subx translate apps/factorial.subx -o apps/factorial
-  5 #   $ ./subx run apps/factorial
-  6 # Expected result:
-  7 #   $ echo $?
-  8 #   120
-  9 #
- 10 # You can also run the automated test suite:
- 11 #   $ ./subx run apps/factorial test
- 12 # Expected output:
- 13 #   ........
- 14 # Every '.' indicates a passing test. Failing tests get a 'F'.
- 15 
- 16 == code
- 17 #   instruction                     effective address                                                   register    displacement    immediate
- 18 # . op          subop               mod             rm32          base        index         scale       r32
- 19 # . 1-3 bytes   3 bits              2 bits          3 bits        3 bits      3 bits        2 bits      2 bits      0/1/2/4 bytes   0/1/2/4 bytes
- 20 
- 21 Entry:  # run tests if necessary, compute `factorial(5)` if not
- 22     # initialize heap
- 23     # . Heap = new-segment(64KB)
- 24     # . . push args
- 25     68/push  Heap/imm32
- 26     68/push  0x10000/imm32/64KB
- 27     # . . call
- 28     e8/call  new-segment/disp32
- 29     # . . discard args
- 30     81          0/subop/add         3/mod/direct    4/rm32/ESP    .           .             .           .           .               8/imm32           # add to ESP
- 31 
- 32     # . prolog
- 33     89/copy                         3/mod/direct    5/rm32/EBP    .           .             .           4/r32/ESP   .               .                 # copy ESP to EBP
- 34     # - if argc > 1 and argv[1] == "test", then return run_tests()
- 35     # . argc > 1
- 36     81          7/subop/compare     1/mod/*+disp8   5/rm32/EBP    .           .             .           .           0/disp8         1/imm32           # compare *EBP
- 37     7e/jump-if-lesser-or-equal  $run-main/disp8
- 38     # . argv[1] == "test"
- 39     # . . push args
- 40     68/push  "test"/imm32
- 41     ff          6/subop/push        1/mod/*+disp8   5/rm32/EBP    .           .             .           .           8/disp8         .                 # push *(EBP+8)
- 42     # . . call
- 43     e8/call  kernel-string-equal?/disp32
- 44     # . . discard args
- 45     81          0/subop/add         3/mod/direct    4/rm32/ESP    .           .             .           .           .               8/imm32           # add to ESP
- 46     # . check result
- 47     3d/compare-EAX-and  1/imm32
- 48     75/jump-if-not-equal  $run-main/disp8
- 49     # . run-tests()
- 50     e8/call  run-tests/disp32
- 51     8b/copy                         0/mod/indirect  5/rm32/.disp32            .             .           0/r32/EAX   Num-test-failures/disp32          # copy *Num-test-failures to EAX
- 52     eb/jump  $main:end/disp8  # where EAX will get copied to EBX
- 53 $run-main:
- 54     # - otherwise return factorial(5)
- 55     # . . push args
- 56     68/push  5/imm32
- 57     # . . call
- 58     e8/call  factorial/disp32
- 59     # . . discard args
- 60     81          0/subop/add         3/mod/direct    4/rm32/ESP    .           .             .           .           .               4/imm32           # add to ESP
- 61 $main:end:
- 62     # syscall(exit, EAX)
- 63     89/copy                         3/mod/direct    3/rm32/EBX    .           .             .           0/r32/EAX   .               .                 # copy EAX to EBX
- 64     b8/copy-to-EAX  1/imm32/exit
- 65     cd/syscall  0x80/imm8
- 66 
- 67 factorial:  # n : int -> int/EAX
- 68     # . prolog
- 69     55/push-EBP
- 70     89/copy                         3/mod/direct    5/rm32/EBP    .           .             .           4/r32/ESP   .               .                 # copy ESP to EBP
- 71     53/push-EBX
- 72     # EAX = 1 (base case)
- 73     b8/copy-to-EAX  1/imm32
- 74     # if (n <= 1) return
- 75     81          7/subop/compare     1/mod/*+disp8   5/rm32/EBP    .           .             .           .           8/disp8         1/imm32           # compare *(EBP+8)
- 76     7e/jump-if-<=  $factorial:end/disp8
- 77     # EBX = n-1
- 78     8b/copy                         1/mod/*+disp8   5/rm32/EBP    .           .                         3/r32/EBX   8/disp8         .                 # copy *(EBP+8) to EBX
- 79     81          5/subop/subtract    3/mod/direct    3/rm32/EBX    .           .             .           .           .               1/imm32           # subtract from EBX
- 80     # EAX = factorial(n-1)
- 81     # . . push args
- 82     53/push-EBX
- 83     # . . call
- 84     e8/call  factorial/disp32
- 85     # . . discard args
- 86     81          0/subop/add         3/mod/direct    4/rm32/ESP    .           .             .           .           .               4/imm32           # add to ESP
- 87     # return n * factorial(n-1)
- 88     f7          4/subop/multiply    1/mod/*+disp8   5/rm32/EBP    .           .                                     8/disp8         .                 # multiply *(EBP+8) into EAX
- 89     # TODO: check for overflow
- 90 $factorial:end:
- 91     # . epilog
- 92     5b/pop-to-EBX
- 93     89/copy                         3/mod/direct    4/rm32/ESP    .           .             .           5/r32/EBP   .               .                 # copy EBP to ESP
- 94     5d/pop-to-EBP
- 95     c3/return
- 96 
- 97 test-factorial:
- 98     # factorial(5)
- 99     # . . push args
-100     68/push  5/imm32
-101     # . . call
-102     e8/call  factorial/disp32
-103     # . . discard args
-104     81          0/subop/add         3/mod/direct    4/rm32/ESP    .           .             .           .           .               4/imm32           # add to ESP
-105     # check-ints-equal(EAX, 120, msg)
-106     # . . push args
-107     68/push  "F - test-factorial"/imm32
-108     68/push  0x78/imm32/expected-120
-109     50/push-EAX
-110     # . . call
-111     e8/call  check-ints-equal/disp32
-112     # . . discard args
-113     81          0/subop/add         3/mod/direct    4/rm32/ESP    .           .             .           .           .               0xc/imm32         # add to ESP
-114     # end
-115     c3/return
-116 
-117 # . . vim:nowrap:textwidth=0
-
- - - -- cgit 1.4.1-2-gfad0