Add hello-name example, fix backslash offset

This commit is contained in:
Igor M 2024-03-18 14:27:09 +02:00
parent 68cb60e342
commit 1ded3630f4
2 changed files with 104 additions and 2 deletions

103
examples/hello-name.S Normal file
View file

@ -0,0 +1,103 @@
jmp entry
puts:
; Write string to console
; r2: [IN] *const u8 String pointer
; r3: [IN] usize String length
li8 r1, 0x1 ; Write syscall
brc r2, r3, 2 ; Copy parameters
li8 r2, 0x1 ; STDOUT
eca
jal r0, r31, 0
gets:
; Read string until end of buffer or LF
; r2: [IN] *mut u8 Buffer
; r3: [IN] usize Buffer length
; Register allocations:
; r33: *mut u8 Buffer end
; r34: u8 Immediate char
; r35: u8 Const [0x0A = LF]
li8 r35, 0x0A
add64 r33, r2, r3
; Setup syscall
li8 r2, 0x1 ; Stdin
cp r3, r2
li8 r4, 0x1 ; Read one char
jeq r3, r33, end
loop:
li8 r1, 0x1 ; Read syscall
eca
addi64 r3, r3, 1
ld r34, r3, 0, 1
jeq r34, r35, end
jne r3, r33, loop
end:
; Set copied amount
sub64 r1, r33, r3
addi64 r1, r1, -1
jal r0, r31, 0
alloc_pages:
; Allocate pages
; r1: [OUT] *mut u8 Pointer to page
; r2: [IN] u16 Page count
muli16 r3, r2, 4096 ; page count
li8 r1, 0x9 ; mmap syscall
li8 r2, 0x0 ; no address set, kernel chosen
li8 r4, 0x2 ; PROT_WRITE
li8 r5, 0x20 ; MAP_ANONYMOUS
li64 r6, -1 ; Doesn't map file
li8 r7, 0x0 ; Doesn't map file
eca
jal r0, r31, 0
entry:
; Program entrypoint
; Register allocations:
; r32: *mut u8 Buffer
; r36: usize Read buffer length
; Allocate one page (4096 KiB)
li8 r2, 1
jal r31, r0, alloc_pages
cp r32, r1
; Print message
lra16 r2, r0, enter_your_name
li8 r3, 17
jal r31, r0, puts
; Read name
cp r2, r32
li16 r3, 4096
jal r31, r0, gets
cp r36, r1
; Print your name is
lra16 r2, r0, your_name_is
li8 r3, 15
jal r31, r0, puts
; And now print the name
cp r2, r32
cp r3, r36
jal r31, r0, puts
tx
enter_your_name:
.db "Enter your name: "
your_name_is:
.db "\nYour name is: "

View file

@ -8,7 +8,6 @@ AsmError push_string(char *buf, char *input, size_t len) {
} }
pos += 1; pos += 1;
chr = input[pos]; chr = input[pos];
size_t offset = 1;
switch (chr) { switch (chr) {
case '\\': case '\\':
chr = '\\'; chr = '\\';
@ -38,12 +37,12 @@ AsmError push_string(char *buf, char *input, size_t len) {
if (high > 15 || low > 15) { if (high > 15 || low > 15) {
return ErrStringBadHex; return ErrStringBadHex;
} }
pos += 2;
chr = high << 4 | low; chr = high << 4 | low;
break; break;
default: default:
return ErrBadStringEscape; return ErrBadStringEscape;
} }
pos += offset;
} }
buf[ndata] = chr; buf[ndata] = chr;
ndata += 1; ndata += 1;