added a buffer of 64 bytes for some easily accesible persistent storage accesable via p@ and p!
This commit is contained in:
2
main.py
2
main.py
@@ -1793,6 +1793,8 @@ class Assembler:
|
|||||||
"align 16",
|
"align 16",
|
||||||
"print_buf: resb PRINT_BUF_BYTES",
|
"print_buf: resb PRINT_BUF_BYTES",
|
||||||
"print_buf_end:",
|
"print_buf_end:",
|
||||||
|
"align 16",
|
||||||
|
"persistent: resb 64",
|
||||||
]
|
]
|
||||||
|
|
||||||
def write_asm(self, emission: Emission, path: Path) -> None:
|
def write_asm(self, emission: Emission, path: Path) -> None:
|
||||||
|
|||||||
9
p.sl
Normal file
9
p.sl
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
import stdlib/stdlib.sl
|
||||||
|
import stdlib/io.sl
|
||||||
|
|
||||||
|
: main
|
||||||
|
12345 0 p! # store 12345 at offset 0
|
||||||
|
0 p@ puti cr # read and print value at offset 0
|
||||||
|
67890 8 p! # store 67890 at offset 8
|
||||||
|
8 p@ puti cr # read and print value at offset 8
|
||||||
|
;
|
||||||
@@ -1,3 +1,30 @@
|
|||||||
|
# Reserve 64 bytes in .bss
|
||||||
|
# persistent: resb 64
|
||||||
|
|
||||||
|
# : 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
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
||||||
# : strlen ( addr -- len )
|
# : strlen ( addr -- len )
|
||||||
# for null terminated strings
|
# for null terminated strings
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user