Initial commit
This commit is contained in:
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
/target
|
||||||
7
Cargo.lock
generated
Normal file
7
Cargo.lock
generated
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
# This file is automatically @generated by Cargo.
|
||||||
|
# It is not intended for manual editing.
|
||||||
|
version = 3
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "lang-lucia"
|
||||||
|
version = "0.1.0"
|
||||||
8
Cargo.toml
Normal file
8
Cargo.toml
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
[package]
|
||||||
|
name = "lang-lucia"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
21
Makefile
Normal file
21
Makefile
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
objects = test.o extra.o
|
||||||
|
|
||||||
|
all: $(objects)
|
||||||
|
gcc -g -m32 -no-pie -o a.out $^
|
||||||
|
|
||||||
|
.PRECIOUS: %.S
|
||||||
|
|
||||||
|
%.S: %.src
|
||||||
|
cat $< | ./target/debug/lang-lucia -q > $@
|
||||||
|
|
||||||
|
%.o: %.S
|
||||||
|
nasm -Ox -g -F dwarf -felf -o $@ $<
|
||||||
|
|
||||||
|
%.o: %.c
|
||||||
|
gcc -m32 -g -c -o $@ $<
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f test.o test.S
|
||||||
|
|
||||||
|
compiler:
|
||||||
|
cargo build
|
||||||
12
ack.src
Normal file
12
ack.src
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
fn ack(m i32 n i32)
|
||||||
|
endvar
|
||||||
|
if m then
|
||||||
|
if n then
|
||||||
|
m 1- : m n 1- call ack call ack ret;
|
||||||
|
else
|
||||||
|
m 1- 1 call ack ret;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
n 1+ ret
|
||||||
|
end
|
||||||
|
endfn
|
||||||
43
ex.src
Normal file
43
ex.src
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
extern printfd;
|
||||||
|
extern puts;
|
||||||
|
|
||||||
|
fn ack(m i32 n i32) endvar
|
||||||
|
if m 0 eq then
|
||||||
|
n 1+ ret;
|
||||||
|
elif n 0 eq then
|
||||||
|
(m 1- 1)ack ret;
|
||||||
|
else
|
||||||
|
(m 1- (m n 1-)ack)ack ret;
|
||||||
|
end
|
||||||
|
endfn
|
||||||
|
|
||||||
|
fn foo(ptr pi32) endvar
|
||||||
|
ptr* ptr* 1+:=
|
||||||
|
endfn
|
||||||
|
|
||||||
|
fn main(argc i32 argv ppi8)
|
||||||
|
x y u32;
|
||||||
|
ptr ppi8;
|
||||||
|
endvar
|
||||||
|
|
||||||
|
0 y=:;
|
||||||
|
loop
|
||||||
|
y 4 eq breakif;
|
||||||
|
0 x=:;
|
||||||
|
loop
|
||||||
|
x 4 eq breakif;
|
||||||
|
((y x)ack)printfd;
|
||||||
|
(x&)foo
|
||||||
|
end
|
||||||
|
y 1 + y=:;
|
||||||
|
end
|
||||||
|
|
||||||
|
x argc :=;
|
||||||
|
ptr argv :=;
|
||||||
|
loop
|
||||||
|
x 0 eq ptr* 0 eq or breakif;
|
||||||
|
(ptr*)puts;
|
||||||
|
x 1 - x=:;
|
||||||
|
ptr 4+ ptr=:;
|
||||||
|
end
|
||||||
|
endfn
|
||||||
1464
src/main.rs
Normal file
1464
src/main.rs
Normal file
File diff suppressed because it is too large
Load Diff
160
test.S
Normal file
160
test.S
Normal file
@@ -0,0 +1,160 @@
|
|||||||
|
extern printfd
|
||||||
|
extern puts
|
||||||
|
global ack
|
||||||
|
ack:
|
||||||
|
push ebp
|
||||||
|
push edi
|
||||||
|
push esi
|
||||||
|
push ebx
|
||||||
|
mov ebp, esp
|
||||||
|
mov ebx, [ebp + 20]
|
||||||
|
cmp ebx, 0
|
||||||
|
sete bl
|
||||||
|
test bl, bl
|
||||||
|
jz .le0
|
||||||
|
mov ebx, [ebp + 24]
|
||||||
|
add ebx, 1
|
||||||
|
mov eax, ebx
|
||||||
|
mov esp, ebp
|
||||||
|
pop ebx
|
||||||
|
pop esi
|
||||||
|
pop edi
|
||||||
|
pop ebp
|
||||||
|
ret
|
||||||
|
jmp .lE0
|
||||||
|
.le0:
|
||||||
|
mov ebx, [ebp + 24]
|
||||||
|
cmp ebx, 0
|
||||||
|
sete bl
|
||||||
|
test bl, bl
|
||||||
|
jz .l0e0
|
||||||
|
mov ebx, [ebp + 20]
|
||||||
|
sub ebx, 1
|
||||||
|
push 1
|
||||||
|
push ebx
|
||||||
|
call ack
|
||||||
|
add esp, 8
|
||||||
|
mov esp, ebp
|
||||||
|
pop ebx
|
||||||
|
pop esi
|
||||||
|
pop edi
|
||||||
|
pop ebp
|
||||||
|
ret
|
||||||
|
jmp .lE0
|
||||||
|
.l0e0:
|
||||||
|
mov ebx, [ebp + 20]
|
||||||
|
sub ebx, 1
|
||||||
|
mov eax, [ebp + 24]
|
||||||
|
sub eax, 1
|
||||||
|
push eax
|
||||||
|
push dword [ebp + 20]
|
||||||
|
call ack
|
||||||
|
add esp, 8
|
||||||
|
push eax
|
||||||
|
push ebx
|
||||||
|
call ack
|
||||||
|
add esp, 8
|
||||||
|
mov esp, ebp
|
||||||
|
pop ebx
|
||||||
|
pop esi
|
||||||
|
pop edi
|
||||||
|
pop ebp
|
||||||
|
ret
|
||||||
|
.lE0:
|
||||||
|
mov esp, ebp
|
||||||
|
pop ebx
|
||||||
|
pop esi
|
||||||
|
pop edi
|
||||||
|
pop ebp
|
||||||
|
ret
|
||||||
|
global foo
|
||||||
|
foo:
|
||||||
|
push ebp
|
||||||
|
push edi
|
||||||
|
push esi
|
||||||
|
push ebx
|
||||||
|
mov ebp, esp
|
||||||
|
mov ebx, dword [ebp + 20]
|
||||||
|
mov eax, dword [ebp + 20]
|
||||||
|
mov eax, [eax]
|
||||||
|
add eax, 1
|
||||||
|
mov dword [ebx], eax
|
||||||
|
mov esp, ebp
|
||||||
|
pop ebx
|
||||||
|
pop esi
|
||||||
|
pop edi
|
||||||
|
pop ebp
|
||||||
|
ret
|
||||||
|
global main
|
||||||
|
main:
|
||||||
|
push ebp
|
||||||
|
push edi
|
||||||
|
push esi
|
||||||
|
push ebx
|
||||||
|
mov ebp, esp
|
||||||
|
sub esp, 12
|
||||||
|
mov dword [ebp - 4], 0
|
||||||
|
.l0:
|
||||||
|
mov ebx, [ebp - 4]
|
||||||
|
cmp ebx, 4
|
||||||
|
sete bl
|
||||||
|
test bl, bl
|
||||||
|
jnz .le0
|
||||||
|
mov dword [ebp - 8], 0
|
||||||
|
.l1:
|
||||||
|
mov ebx, [ebp - 8]
|
||||||
|
cmp ebx, 4
|
||||||
|
sete bl
|
||||||
|
test bl, bl
|
||||||
|
jnz .le1
|
||||||
|
push dword [ebp - 8]
|
||||||
|
push dword [ebp - 4]
|
||||||
|
call ack
|
||||||
|
add esp, 8
|
||||||
|
push eax
|
||||||
|
call printfd
|
||||||
|
add esp, 4
|
||||||
|
lea ebx, dword [ebp - 8]
|
||||||
|
push ebx
|
||||||
|
call foo
|
||||||
|
add esp, 4
|
||||||
|
jmp .l1
|
||||||
|
.le1:
|
||||||
|
mov ebx, [ebp - 4]
|
||||||
|
add ebx, 1
|
||||||
|
mov dword [ebp - 4], ebx
|
||||||
|
jmp .l0
|
||||||
|
.le0:
|
||||||
|
mov ebx, [ebp + 20]
|
||||||
|
mov dword [ebp - 8], ebx
|
||||||
|
mov ebx, [ebp + 24]
|
||||||
|
mov dword [ebp - 12], ebx
|
||||||
|
.l2:
|
||||||
|
mov ebx, [ebp - 8]
|
||||||
|
cmp ebx, 0
|
||||||
|
sete bl
|
||||||
|
mov eax, dword [ebp - 12]
|
||||||
|
mov eax, [eax]
|
||||||
|
cmp eax, 0
|
||||||
|
sete al
|
||||||
|
or bl, al
|
||||||
|
test bl, bl
|
||||||
|
jnz .le2
|
||||||
|
mov ebx, dword [ebp - 12]
|
||||||
|
push dword [ebx]
|
||||||
|
call puts
|
||||||
|
add esp, 4
|
||||||
|
mov ebx, [ebp - 8]
|
||||||
|
sub ebx, 1
|
||||||
|
mov dword [ebp - 8], ebx
|
||||||
|
mov ebx, [ebp - 12]
|
||||||
|
add ebx, 4
|
||||||
|
mov dword [ebp - 12], ebx
|
||||||
|
jmp .l2
|
||||||
|
.le2:
|
||||||
|
mov esp, ebp
|
||||||
|
pop ebx
|
||||||
|
pop esi
|
||||||
|
pop edi
|
||||||
|
pop ebp
|
||||||
|
ret
|
||||||
43
test.src
Normal file
43
test.src
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
extern printfd;
|
||||||
|
extern puts;
|
||||||
|
|
||||||
|
fn ack(m i32 n i32) endvar
|
||||||
|
if m 0 eq then
|
||||||
|
n 1+ ret;
|
||||||
|
elif n 0 eq then
|
||||||
|
(m 1- 1)ack ret;
|
||||||
|
else
|
||||||
|
(m 1- (m n 1-)ack)ack ret;
|
||||||
|
end
|
||||||
|
endfn
|
||||||
|
|
||||||
|
fn foo(ptr pi32) endvar
|
||||||
|
ptr* ptr* 1+:=
|
||||||
|
endfn
|
||||||
|
|
||||||
|
fn main(argc i32 argv ppi8)
|
||||||
|
x y u32;
|
||||||
|
ptr ppi8;
|
||||||
|
endvar
|
||||||
|
|
||||||
|
0 y=:;
|
||||||
|
loop
|
||||||
|
y 4 eq breakif;
|
||||||
|
0 x=:;
|
||||||
|
loop
|
||||||
|
x 4 eq breakif;
|
||||||
|
((y x)ack)printfd;
|
||||||
|
(x&)foo
|
||||||
|
end
|
||||||
|
y 1 + y=:;
|
||||||
|
end
|
||||||
|
|
||||||
|
x argc :=;
|
||||||
|
ptr argv :=;
|
||||||
|
loop
|
||||||
|
x 0 eq ptr* 0 eq or breakif;
|
||||||
|
(ptr*)puts;
|
||||||
|
x 1 - x=:;
|
||||||
|
ptr 4+ ptr=:;
|
||||||
|
end
|
||||||
|
endfn
|
||||||
Reference in New Issue
Block a user