diff --git a/alloc.sl b/alloc.sl new file mode 100644 index 0000000..69e7128 --- /dev/null +++ b/alloc.sl @@ -0,0 +1,36 @@ +import stdlib/stdlib.sl +import stdlib/io.sl + +: alloc + 0 # addr hint (NULL) + swap # size + 3 # prot (PROT_READ | PROT_WRITE) + 34 # flags (MAP_PRIVATE | MAP_ANON) + -1 # fd + 0 # offset + mmap +; + +: free + munmap drop +; + +: test-mem-alloc + 4096 alloc dup 1337 swap ! # allocate 4096 bytes, store 1337 at start + dup @ puti cr # print value at start + 4096 free # free the memory +; + +struct: Point + field x 8 + field y 8 +;struct + +: main2 + 32 alloc # allocate 32 bytes (enough for a Point struct) + dup 111 swap Point.x! + dup 222 swap Point.y! + dup Point.x@ puti cr + Point.y@ puti cr + 32 free # free the memory +; \ No newline at end of file diff --git a/main.py b/main.py index fb492c0..56ad0fc 100644 --- a/main.py +++ b/main.py @@ -324,7 +324,6 @@ IntrinsicEmitter = Callable[["FunctionEmitter"], None] class Word: name: str immediate: bool = False - stack_effect: str = "( -- )" definition: Optional[Union[Definition, AsmDefinition]] = None macro: Optional[MacroHandler] = None intrinsic: Optional[IntrinsicEmitter] = None @@ -1511,8 +1510,6 @@ class _CTHandleTable: class Assembler: def __init__(self, dictionary: Dictionary) -> None: self.dictionary = dictionary - self.stack_bytes = 65536 - self.io_buffer_bytes = 128 self._string_literals: Dict[str, Tuple[str, int]] = {} self._float_literals: Dict[float, str] = {} self._data_section: Optional[List[str]] = None diff --git a/mem.sl b/mem.sl index 69e7128..7f58d6f 100644 --- a/mem.sl +++ b/mem.sl @@ -1,36 +1,8 @@ import stdlib/stdlib.sl import stdlib/io.sl +import stdlib/debug.sl -: alloc - 0 # addr hint (NULL) - swap # size - 3 # prot (PROT_READ | PROT_WRITE) - 34 # flags (MAP_PRIVATE | MAP_ANON) - -1 # fd - 0 # offset - mmap +: main + mem dup 5 swap ! + @ puti cr ; - -: free - munmap drop -; - -: test-mem-alloc - 4096 alloc dup 1337 swap ! # allocate 4096 bytes, store 1337 at start - dup @ puti cr # print value at start - 4096 free # free the memory -; - -struct: Point - field x 8 - field y 8 -;struct - -: main2 - 32 alloc # allocate 32 bytes (enough for a Point struct) - dup 111 swap Point.x! - dup 222 swap Point.y! - dup Point.x@ puti cr - Point.y@ puti cr - 32 free # free the memory -; \ No newline at end of file diff --git a/stdlib/stdlib.sl b/stdlib/stdlib.sl index bdff6a2..3772235 100644 --- a/stdlib/stdlib.sl +++ b/stdlib/stdlib.sl @@ -1,27 +1,11 @@ # Reserve 64 bytes in .bss # persistent: resb 64 +# push the addr of it -# : p@ ( offset -- n ) -:asm p@ { - mov rax, [r12] ; offset - lea rbx, [rel persistent] - add rax, rbx ; address = persistent + offset - mov rax, [rax] ; load value - mov [r12], rax ; store on stack - ret -} -; - -# : p! ( value offset -- ) -:asm p! { - mov rbx, [r12] ; offset - add r12, 8 - mov rax, [r12] ; value - lea rcx, [rel persistent] - add rcx, rbx ; address = persistent + offset - mov [rcx], rax ; store value - add r12, 8 ; pop value - ret +:asm mem { + lea rax, [rel persistent] + sub r12, 8 + mov [r12], rax } ;