From 1ded3630f43d24547a21c45464098b57852f6bf3 Mon Sep 17 00:00:00 2001 From: Igor M Date: Mon, 18 Mar 2024 14:27:09 +0200 Subject: [PATCH] Add hello-name example, fix backslash offset --- examples/hello-name.S | 103 ++++++++++++++++++++++++++++++++++++++++++ src/directive.c | 3 +- 2 files changed, 104 insertions(+), 2 deletions(-) create mode 100644 examples/hello-name.S diff --git a/examples/hello-name.S b/examples/hello-name.S new file mode 100644 index 0000000..992c559 --- /dev/null +++ b/examples/hello-name.S @@ -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: " \ No newline at end of file diff --git a/src/directive.c b/src/directive.c index 913e40e..f6cd258 100644 --- a/src/directive.c +++ b/src/directive.c @@ -8,7 +8,6 @@ AsmError push_string(char *buf, char *input, size_t len) { } pos += 1; chr = input[pos]; - size_t offset = 1; switch (chr) { case '\\': chr = '\\'; @@ -38,12 +37,12 @@ AsmError push_string(char *buf, char *input, size_t len) { if (high > 15 || low > 15) { return ErrStringBadHex; } + pos += 2; chr = high << 4 | low; break; default: return ErrBadStringEscape; } - pos += offset; } buf[ndata] = chr; ndata += 1;