diff options
author | Alexis Hovorka <[email protected]> | 2024-08-17 19:32:33 -0600 |
---|---|---|
committer | Alexis Hovorka <[email protected]> | 2024-08-17 19:32:33 -0600 |
commit | 3712c0af48b9cc68fe52729cb7aa24006e35cb5d (patch) | |
tree | 14ebf05a0335624d56b171c7f17450d0baa339bb /static/20240817-aarch64-bootstrapping-1/hex.s | |
parent | d2a685e50d20101a42b7d9d08d1b90bb92defcd3 (diff) |
[post] AArch64 Bootstrapping 1
Diffstat (limited to 'static/20240817-aarch64-bootstrapping-1/hex.s')
-rw-r--r-- | static/20240817-aarch64-bootstrapping-1/hex.s | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/static/20240817-aarch64-bootstrapping-1/hex.s b/static/20240817-aarch64-bootstrapping-1/hex.s new file mode 100644 index 0000000..b120014 --- /dev/null +++ b/static/20240817-aarch64-bootstrapping-1/hex.s @@ -0,0 +1,95 @@ +.section .data +buf: + .byte 0 // input/output character buffer + +.section .text +.global _start +_start: + mov x19, #0 // value + mov x20, #0 // count + +loop: + mov x8, #63 // read + mov x0, #0 // stdin + adr x1, buf + mov x2, #1 + svc 0 + + cmp x0, #0 // count of bytes read; 0 means EOF + b.ne 1f + +exit: + mov x8, #93 // exit + mov x0, #0 // error code (no error) + svc 0 + +1: + adr x1, buf + ldurb w9, [x1] + + cmp w9, #92 // backslash; start of comment + b.ne 2f + +comment: + mov x8, #63 // read + mov x0, #0 // stdin + adr x1, buf + mov x2, #1 + svc 0 + + cmp x0, #0 + b.eq exit + + adr x1, buf + ldurb w9, [x1] + cmp w9, '\n' + b.ne comment + b loop + +2: + cmp w9, '0' + b.lt 3f + cmp w9, '9' + b.gt 3f + + sub w9, w9, '0' + b 4f + +3: + cmp w9, 'a' + b.lt 5f + cmp w9, 'f' + b.gt 5f + + sub w9, w9, ('a' - 10) + b 4f + +4: + lsl x19, x19, #4 + add x19, x19, w9, uxtb + add x20, x20, #1 + b loop + +5: + cmp w9, ' ' + b.ne loop + + tst x20, #1 + cinc x20, x20, ne + lsr x20, x20, #1 + +6: + cmp x20, #0 + b.eq loop + + mov x8, #64 // write + mov x0, #1 // stdout + adr x1, buf + sturb w19, [x1] + mov x2, #1 + svc 0 + + lsr x19, x19, #8 + + sub x20, x20, #1 + b 6b |