https://github.com/akkartik/mu/blob/master/apps/factorial2.subx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 == code
17
18 Entry:
19
20 89/<- %ebp 4/r32/esp
21
22
23
24
25 68/push Heap/imm32
26 68/push Heap-size/imm32
27
28 e8/call new-segment/disp32
29
30 81 0/subop/add %esp 8/imm32
31
32
33
34 81 7/subop/compare *ebp 1/imm32
35 7e/jump-if-lesser-or-equal $run-main/disp8
36
37
38
39 68/push "test"/imm32
40 ff 6/subop/push *(ebp+8)
41
42 e8/call kernel-string-equal?/disp32
43
44 81 0/subop/add %esp 8/imm32
45
46 3d/compare-eax-and 0/imm32
47 74/jump-if-equal $run-main/disp8
48
49 e8/call run-tests/disp32
50
51 8b/-> *Num-test-failures 3/r32/ebx
52 eb/jump $main:end/disp8
53 $run-main:
54
55
56
57 68/push 5/imm32
58
59 e8/call factorial/disp32
60
61 81 0/subop/add %esp 4/imm32
62
63 89/<- %ebx 0/r32/eax
64 $main:end:
65 b8/copy-to-eax 1/imm32/exit
66 cd/syscall 0x80/imm8
67
68 factorial:
69
70 55/push-ebp
71 89/<- %ebp 4/r32/esp
72 53/push-ebx
73
74 b8/copy-to-eax 1/imm32
75 81 7/subop/compare *(ebp+8) 1/imm32
76 7e/jump-if-<= $factorial:end/disp8
77
78 8b/-> *(ebp+8) 3/r32/ebx
79 4b/decrement-ebx
80
81
82 53/push-ebx
83
84 e8/call factorial/disp32
85
86 81 0/subop/add %esp 4/imm32
87
88 f7 4/subop/multiply-into-eax *(ebp+8)
89
90 $factorial:end:
91
92 5b/pop-to-ebx
93 89/<- %esp 5/r32/ebp
94 5d/pop-to-ebp
95 c3/return
96
97 test-factorial:
98
99
100 68/push 5/imm32
101
102 e8/call factorial/disp32
103
104 81 0/subop/add %esp 4/imm32
105
106
107 68/push "F - test-factorial"/imm32
108 68/push 0x78/imm32/expected-120
109 50/push-eax
110
111 e8/call check-ints-equal/disp32
112
113 81 0/subop/add %esp 0xc/imm32
114
115 c3/return