-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlib.asm
278 lines (241 loc) · 3.96 KB
/
lib.asm
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
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
%define pc r12;rax ;указывает на следующую forth-команду ;указыаает на ячейку памяти, в кторой лежит следующий XT
%define w r13 ;rax ;в начале выполнения невстраиваемых слов указывает на первый адрес сразу после залоговка
%define rstack r14;rax; rsp стека адресов возврата
section .data
here: dq user_mem
state: db 0
%define link 0
%macro native 3
section .data
w_%2:
%%link: dq link
ww_%2: db %1, 0
db %3
xt_%2:
dq %2_impl
section .text
%2_impl:
%define link %%link
%endmacro
%macro native 2
native %1, %2, 1
%endmacro
%macro colon 3
section .data
w_%2:
%%link: dq link
db %1, 0
db %3
xt_%2:
dq docol
%define link %%link
%endmacro
%macro colon 2
colon %1, %2, 1
%endmacro
colon '>', greater
dq xt_swap
dq xt_less
dq xt_exit
native 'S' , stack
push rbx
mov rbx, rsp
.loop:
add rbx, 8
cmp rbx, [srsp]
jge .quit
mov rdi, [rbx]
call print_int
call print_newline
jmp .loop
.quit:
pop rbx
jmp next
native '+' , plus
pop rax
add [rsp], rax
jmp next
native '-' , minus
pop rax
sub [rsp], rax
jmp next
native '*' , asterisk
pop rax
pop rdx
mul rdx
push rax
jmp next
native '/' , slash
pop rcx
pop rax
xor rdx, rdx
div rcx
push rax
jmp next
native '=' , es
pop rax
pop rdx
cmp rax, rdx
je .equal
push 0
jmp next
.equal:
push 1
jmp next
native '<' , less
pop rax
pop rdx
cmp rdx, rax
jl .less
push 0
jmp next
.less:
push 1
jmp next
native 'and' , and
pop rax
pop rdx
and rax, rdx
push rax
jmp next
native 'not' , not
pop rax
not rax
push rax
jmp next
native 'rot' , rot
pop rax ;c
pop rdx ;b
pop rcx ;a
push rdx
push rax
push rcx
jmp next
native 'swap' , swap
pop rax
pop rdx
push rax
push rdx
jmp next
native 'dup' , dup
pop rax
push rax
push rax
jmp next
native 'drop' , drop
pop rax
jmp next
native '.' , dot
pop rdi
call print_int
call print_newline
jmp next
native 'key' , key
call read_char
push rax
jmp next
native 'emit' , emit
pop rdi
call print_char
call print_newline
jmp next
native 'number' , number
call read_word
mov rdi, rax
call parse_int
push rax
jmp next
native 'mem' , mem
push user_mem
jmp next
native '!' , em
pop rax
pop rdi
mov [rax], rdi
jmp next
native '@' , at
pop rax
push qword [rax]
jmp next
read_word_ptr:
mov [word_ptr],rdi
push rbx
xor rbx, rbx
.loop1:
call read_char
cmp rax, 0x20
je .loop1
cmp rax, 0x09
je .loop1
cmp rax, 0x0A
je .loop1
cmp rax, 0x00
je .quit
.loop2:
mov rdx, [word_ptr]
mov byte [rdx+rbx], al
inc rbx
call read_char
cmp rax, 0x20
je .quit
cmp rax, 0x9
je .quit
cmp rax, 0xA
je .quit
cmp rax, 0x0
je .quit
jmp .loop2
.quit:
mov rdx, [word_ptr]
mov byte [rdx+rbx], 0x0
mov rdx, rbx
pop rbx
xor rax, rax
ret
native ':' , colon
mov rdi, [here]
mov rax, [last_word]
mov qword [rdi], rax
mov qword [last_word], rdi
add rdi, 8
call read_word_ptr
mov rdi, [here]
add rdi, rdx
add rdi, 8
inc rdi
mov byte [rdi], 0
inc rdi
mov qword [rdi], docol
add rdi, 8
mov [here], rdi
mov byte [state], 1
jmp next
native ';' , semicolon, 0
mov rdi, [here]
mov qword [rdi], xt_exit
add qword [here], 8
mov byte [state], 0
jmp next
native 'q' , quit
mov rax, 60
xor rdi, rdi
syscall
native 'lit' , lit
mov w, pc
add pc, 8
mov w, [w]
add pc, w
jmp next
native 'branch' , branch, 2
mov w, pc
add pc, 8
mov w, [w]
sal w, 3
add pc, w
jmp next
native '0branch', branch0, 2
pop rax
test rax, rax
jz branch_impl
add pc, 8
jmp next