https://github.com/akkartik/mu/blob/master/apps/factorial.subx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 == code
17
18
19
20
21 Entry:
22
23
24
25 68/push Heap/imm32
26 68/push 0x10000/imm32/64KB
27
28 e8/call new-segment/disp32
29
30 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
31
32
33 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . .
34
35
36 81 7/subop/compare 1/mod/*+disp8 5/rm32/EBP . . . . 0/disp8 1/imm32
37 7e/jump-if-lesser-or-equal $run-main/disp8
38
39
40 68/push "test"/imm32
41 ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 8/disp8 .
42
43 e8/call kernel-string-equal?/disp32
44
45 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
46
47 3d/compare-EAX-and 1/imm32
48 75/jump-if-not-equal $run-main/disp8
49
50 e8/call run-tests/disp32
51 8b/copy 0/mod/indirect 5/rm32/.disp32 . . 0/r32/EAX Num-test-failures/disp32
52 eb/jump $main:end/disp8
53 $run-main:
54
55
56 68/push 5/imm32
57
58 e8/call factorial/disp32
59
60 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
61 $main:end:
62
63 89/copy 3/mod/direct 3/rm32/EBX . . . 0/r32/EAX . .
64 b8/copy-to-EAX 1/imm32/exit
65 cd/syscall 0x80/imm8
66
67 factorial:
68
69 55/push-EBP
70 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . .
71 53/push-EBX
72
73 b8/copy-to-EAX 1/imm32
74
75 81 7/subop/compare 1/mod/*+disp8 5/rm32/EBP . . . . 8/disp8 1/imm32
76 7e/jump-if-<= $factorial:end/disp8
77
78 8b/copy 1/mod/*+disp8 5/rm32/EBP . . 3/r32/EBX 8/disp8 .
79 81 5/subop/subtract 3/mod/direct 3/rm32/EBX . . . . . 1/imm32
80
81
82 53/push-EBX
83
84 e8/call factorial/disp32
85
86 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
87
88 f7 4/subop/multiply 1/mod/*+disp8 5/rm32/EBP . . 8/disp8 .
89
90 $factorial:end:
91
92 5b/pop-to-EBX
93 89/copy 3/mod/direct 4/rm32/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 3/mod/direct 4/rm32/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 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
114
115 c3/return
116
117