-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmath.asm
More file actions
155 lines (132 loc) · 1.57 KB
/
math.asm
File metadata and controls
155 lines (132 loc) · 1.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
%include "macros.mac"
extern emit
header "=", equals
dpop rax
dpop rcx
cmp rax, rcx
je .eq
dpush 0
ret
.eq: dpush -1
ret
header "+", sum
dpop rax
dpop rcx
add rax, rcx
dpush rax
ret
header "-", subtract
dpop rax
dpop rcx
sub rcx, rax
dpush rcx
ret
header "*", multiply
dpop rax
dpop rcx
push rdx
mul rcx
pop rdx
dpush rax
ret
header "/", divide
dpop rcx
dpop rax
push rdx
mov rdx, 0
div rcx
pop rdx
dpush rax
ret
header "%", mod
dpop rcx
dpop rax
push rdx
mov rdx, 0
div rcx
dpush rdx
pop rdx
ret
header "<", lesser
dpop rax
dpop rcx
cmp rcx, rax
jl .t
dpush 0
ret
.t: dpush -1
ret
header ">", greater
dpop rax
dpop rcx
cmp rax, rcx
jl .t
dpush 0
ret
.t: dpush -1
ret
header "n", invert
dpop rax
not rax
dpush rax
ret
header "&", bit_and
dpop rax
dpop rcx
and rax, rcx
dpush rax
ret
header "|", bit_or
dpop rax
dpop rcx
or rax, rcx
dpush rax
ret
header "^", bit_xor
dpop rax
dpop rcx
xor rax, rcx
dpush rax
ret
header "~", logical_not
dpop rax
cmp rax, 0
je .t
mov rax, 0
dpush rax
ret
.t: mov rax, -1
dpush rax
ret
header ".", dot ;unsigned
push r12
mov r12, 1
mov ax, 0x2000
push ax
add rsp, 1
.loop: call dup
dpush 10 ;base
call mod
dpop rax
add ax, '0'
;save byte on the stack to be printed latter
sal ax, 8
push ax
add rsp, 1
dpush 10
call divide
add r12, 1
call dup
dpop rax
cmp rax, 0
jne .loop
dpop rax
;write digits saved on the stack
mov rax, 1 ;sys_write
mov rdi, 1 ;file descriptor
mov rsi, rsp ;buf
mov rdx, r12 ;len
syscall
add rsp, r12
pop r12
ret