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