From 53b66c29ee7efc80f07ab09dfcf8c9955ce66d23 Mon Sep 17 00:00:00 2001 From: lohhiiccc <96543753+lohhiiccc@users.noreply.github.com> Date: Mon, 1 Jun 2026 00:39:28 +0200 Subject: [PATCH] fix: Colleen_asm --- gen_src.py | 25 +++++++++++++++ src/Colleen.s | 86 ++++++++++++++++++++++++++++----------------------- 2 files changed, 73 insertions(+), 38 deletions(-) create mode 100644 gen_src.py diff --git a/gen_src.py b/gen_src.py new file mode 100644 index 0000000..b0a8e25 --- /dev/null +++ b/gen_src.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python3 +import sys +import re + + +def encode(data: bytes) -> str: + parts = [] + for b in data: + parts.append(str(b)) + return ', '.join(parts) + + +def main(): + path = sys.argv[1] if len(sys.argv) > 1 else 'src/Colleen.s' + + with open(path, 'rb') as f: + content = f.read() + + template = re.sub(rb'^src: db .*$', b'src: db ~', content, flags=re.MULTILINE) + + print(f'src: db {encode(template)}') + + +if __name__ == '__main__': + main() diff --git a/src/Colleen.s b/src/Colleen.s index 80ef142..c226743 100644 --- a/src/Colleen.s +++ b/src/Colleen.s @@ -1,7 +1,7 @@ global _start section .rodata -src: db 103, 108, 111, 98, 97, 108, 32, 95, 115, 116, 97, 114, 116, 10, 10, 115, 101, 99, 116, 105, 111, 110, 32, 46, 114, 111, 100, 97, 116, 97, 10, 115, 114, 99, 58, 32, 100, 98, 32, 34, "~", 34, 10, 115, 114, 99, 95, 108, 101, 110, 58, 32, 101, 113, 117, 32, 36, 32, 45, 32, 115, 114, 99, 10, 10, 115, 101, 99, 116, 105, 111, 110, 32, 46, 116, 101, 120, 116, 10, 10, 59, 112, 114, 105, 110, 116, 95, 110, 117, 109, 98, 101, 114, 58, 10, 9, 10, 10, 95, 115, 116, 97, 114, 116, 58, 10, 9, 112, 117, 115, 104, 32, 114, 49, 52, 59, 32, 105, 110, 116, 32, 105, 10, 9, 112, 117, 115, 104, 32, 114, 49, 51, 10, 9, 120, 111, 114, 32, 114, 49, 52, 44, 32, 114, 49, 52, 32, 59, 32, 105, 32, 61, 32, 48, 10, 10, 9, 46, 108, 111, 111, 112, 58, 10, 9, 59, 32, 105, 102, 32, 105, 32, 62, 32, 115, 114, 99, 95, 108, 101, 110, 10, 9, 99, 109, 112, 32, 114, 49, 52, 44, 32, 115, 114, 99, 95, 108, 101, 110, 10, 9, 106, 103, 32, 46, 100, 111, 110, 101, 32, 59, 32, 98, 114, 101, 97, 107, 59, 10, 10, 9, 59, 114, 49, 51, 32, 61, 32, 97, 100, 100, 114, 32, 111, 102, 32, 115, 114, 99, 32, 43, 32, 105, 10, 9, 108, 101, 97, 32, 114, 49, 51, 44, 32, 91, 114, 101, 108, 32, 115, 114, 99, 93, 10, 9, 97, 100, 100, 32, 114, 49, 51, 44, 32, 114, 49, 52, 10, 9, 10, 9, 99, 109, 112, 32, 98, 121, 116, 101, 32, 91, 114, 49, 51, 93, 44, 32, 49, 50, 54, 10, 9, 106, 101, 32, 46, 101, 115, 99, 97, 112, 101, 10, 10, 10, 9, 59, 32, 119, 114, 105, 116, 101, 32, 49, 44, 32, 114, 49, 51, 44, 32, 49, 10, 9, 109, 111, 118, 32, 101, 97, 120, 44, 32, 49, 10, 9, 109, 111, 118, 32, 114, 100, 105, 44, 32, 49, 10, 9, 109, 111, 118, 32, 114, 115, 105, 44, 32, 114, 49, 51, 10, 9, 109, 111, 118, 32, 114, 100, 120, 44, 32, 49, 10, 9, 115, 121, 115, 99, 97, 108, 108, 10, 9, 106, 109, 112, 32, 46, 101, 115, 99, 97, 112, 101, 95, 100, 111, 110, 101, 10, 10, 9, 46, 101, 115, 99, 97, 112, 101, 58, 10, 9, 112, 117, 115, 104, 32, 114, 49, 49, 10, 9, 120, 111, 114, 32, 114, 49, 49, 44, 32, 114, 49, 49, 32, 59, 32, 106, 32, 61, 32, 48, 10, 9, 46, 101, 95, 108, 111, 111, 112, 58, 10, 9, 99, 109, 112, 32, 114, 49, 49, 44, 32, 115, 114, 99, 95, 108, 101, 110, 10, 9, 106, 103, 32, 46, 101, 115, 99, 97, 112, 101, 95, 100, 111, 110, 101, 10, 10, 9, 109, 111, 118, 32, 101, 97, 120, 44, 32, 49, 10, 9, 109, 111, 118, 32, 114, 100, 105, 44, 32, 49, 10, 9, 109, 111, 118, 32, 114, 115, 105, 44, 32, 34, 44, 32, 34, 10, 9, 109, 111, 118, 32, 114, 100, 120, 44, 32, 50, 10, 9, 115, 121, 115, 99, 97, 108, 108, 10, 10, 9, 108, 101, 97, 32, 114, 97, 120, 44, 32, 91, 114, 101, 108, 32, 115, 114, 99, 93, 10, 9, 97, 100, 100, 32, 114, 97, 120, 44, 32, 114, 49, 49, 10, 9, 109, 111, 118, 32, 97, 108, 44, 32, 91, 114, 97, 120, 93, 10, 9, 59, 99, 97, 108, 108, 32, 112, 114, 105, 110, 116, 95, 110, 117, 109, 98, 101, 114, 10, 10, 9, 105, 110, 99, 32, 114, 49, 49, 10, 9, 106, 109, 112, 32, 46, 101, 95, 108, 111, 111, 112, 10, 9, 46, 101, 115, 99, 97, 112, 101, 95, 100, 111, 110, 101, 58, 10, 9, 112, 111, 112, 32, 114, 49, 49, 10, 10, 9, 105, 110, 99, 32, 114, 49, 52, 32, 59, 32, 43, 43, 105, 10, 9, 106, 109, 112, 32, 46, 108, 111, 111, 112, 10, 10, 9, 46, 100, 111, 110, 101, 58, 10, 9, 109, 111, 118, 32, 101, 97, 120, 44, 32, 54, 48, 32, 9, 9, 9, 9, 9, 59, 32, 83, 89, 83, 95, 101, 120, 105, 116, 10, 9, 120, 111, 114, 32, 101, 100, 105, 44, 32, 101, 100, 105, 9, 9, 9, 9, 9, 59, 32, 99, 111, 100, 101, 32, 61, 32, 48, 10, 9, 115, 121, 115, 99, 97, 108, 108, 10 +src: db 103, 108, 111, 98, 97, 108, 32, 95, 115, 116, 97, 114, 116, 10, 10, 115, 101, 99, 116, 105, 111, 110, 32, 46, 114, 111, 100, 97, 116, 97, 10, 115, 114, 99, 58, 32, 100, 98, 32, 126, 10, 115, 114, 99, 95, 108, 101, 110, 58, 32, 101, 113, 117, 32, 36, 32, 45, 32, 115, 114, 99, 10, 115, 101, 112, 58, 32, 100, 98, 32, 34, 44, 32, 34, 10, 122, 101, 114, 111, 95, 115, 116, 114, 58, 32, 100, 98, 32, 34, 48, 34, 10, 10, 115, 101, 99, 116, 105, 111, 110, 32, 46, 116, 101, 120, 116, 10, 10, 59, 118, 111, 105, 100, 9, 112, 117, 116, 110, 117, 109, 98, 101, 114, 40, 117, 105, 110, 116, 56, 95, 116, 32, 110, 41, 10, 59, 123, 10, 59, 9, 99, 104, 97, 114, 9, 98, 117, 102, 102, 101, 114, 91, 51, 93, 59, 10, 59, 9, 105, 110, 116, 9, 9, 108, 101, 110, 59, 10, 59, 9, 105, 110, 116, 9, 9, 105, 59, 10, 59, 10, 59, 9, 105, 102, 32, 40, 110, 32, 61, 61, 32, 48, 41, 10, 59, 9, 123, 10, 59, 9, 9, 119, 114, 105, 116, 101, 40, 49, 44, 32, 34, 48, 34, 44, 32, 49, 41, 59, 10, 59, 9, 9, 114, 101, 116, 117, 114, 110, 32, 59, 10, 59, 9, 125, 10, 59, 9, 108, 101, 110, 32, 61, 32, 48, 59, 10, 59, 9, 119, 104, 105, 108, 101, 32, 40, 110, 32, 62, 32, 48, 41, 10, 59, 9, 123, 10, 59, 9, 9, 98, 117, 102, 102, 101, 114, 91, 108, 101, 110, 93, 32, 61, 32, 40, 110, 32, 37, 32, 49, 48, 41, 59, 10, 9, 9, 59, 98, 117, 102, 102, 101, 114, 91, 108, 101, 110, 93, 32, 43, 61, 32, 39, 48, 39, 10, 59, 9, 9, 110, 32, 47, 61, 32, 49, 48, 59, 10, 59, 9, 9, 108, 101, 110, 43, 43, 59, 10, 59, 9, 125, 10, 59, 9, 105, 32, 61, 32, 108, 101, 110, 32, 45, 32, 49, 59, 10, 59, 9, 119, 114, 105, 116, 101, 40, 49, 44, 32, 38, 98, 117, 102, 102, 101, 114, 91, 105, 93, 44, 32, 108, 101, 110, 41, 59, 10, 112, 114, 105, 110, 116, 95, 110, 117, 109, 98, 101, 114, 58, 10, 9, 112, 117, 115, 104, 32, 114, 98, 112, 10, 9, 109, 111, 118, 32, 114, 98, 112, 44, 32, 114, 115, 112, 10, 9, 115, 117, 98, 32, 114, 115, 112, 44, 32, 49, 54, 10, 9, 59, 32, 97, 108, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 61, 32, 110, 32, 40, 105, 110, 112, 117, 116, 44, 32, 117, 105, 110, 116, 56, 95, 116, 41, 10, 9, 59, 32, 91, 114, 98, 112, 32, 45, 32, 52, 93, 32, 32, 32, 61, 32, 108, 101, 110, 32, 32, 40, 100, 119, 111, 114, 100, 41, 10, 9, 59, 32, 91, 114, 98, 112, 32, 45, 32, 56, 93, 32, 32, 32, 61, 32, 98, 117, 102, 102, 101, 114, 91, 48, 93, 32, 32, 117, 110, 105, 116, 115, 32, 100, 105, 103, 105, 116, 32, 32, 40, 115, 116, 111, 114, 101, 100, 32, 102, 105, 114, 115, 116, 41, 10, 9, 59, 32, 91, 114, 98, 112, 32, 45, 32, 57, 93, 32, 32, 32, 61, 32, 98, 117, 102, 102, 101, 114, 91, 49, 93, 32, 32, 116, 101, 110, 115, 32, 100, 105, 103, 105, 116, 10, 9, 59, 32, 91, 114, 98, 112, 32, 45, 32, 49, 48, 93, 32, 32, 61, 32, 98, 117, 102, 102, 101, 114, 91, 50, 93, 32, 32, 104, 117, 110, 100, 114, 101, 100, 115, 32, 100, 105, 103, 105, 116, 10, 10, 9, 99, 109, 112, 32, 97, 108, 44, 32, 48, 10, 9, 106, 110, 101, 32, 46, 101, 95, 119, 114, 105, 116, 101, 95, 48, 10, 9, 59, 32, 110, 32, 61, 61, 32, 48, 32, 58, 32, 119, 114, 105, 116, 101, 32, 34, 48, 34, 32, 97, 110, 100, 32, 114, 101, 116, 117, 114, 110, 10, 9, 109, 111, 118, 32, 101, 97, 120, 44, 32, 49, 10, 9, 109, 111, 118, 32, 114, 100, 105, 44, 32, 49, 10, 9, 108, 101, 97, 32, 114, 115, 105, 44, 32, 91, 114, 101, 108, 32, 122, 101, 114, 111, 95, 115, 116, 114, 93, 10, 9, 109, 111, 118, 32, 114, 100, 120, 44, 32, 49, 10, 9, 115, 121, 115, 99, 97, 108, 108, 10, 9, 106, 109, 112, 32, 46, 101, 110, 100, 10, 9, 46, 101, 95, 119, 114, 105, 116, 101, 95, 48, 58, 10, 10, 9, 109, 111, 118, 32, 100, 119, 111, 114, 100, 32, 91, 114, 98, 112, 32, 45, 32, 52, 93, 44, 32, 48, 10, 9, 46, 108, 111, 111, 112, 58, 10, 9, 99, 109, 112, 32, 97, 108, 44, 32, 48, 10, 9, 106, 122, 32, 46, 100, 111, 110, 101, 10, 10, 9, 59, 32, 100, 105, 118, 105, 100, 101, 32, 110, 32, 98, 121, 32, 49, 48, 32, 58, 32, 113, 117, 111, 116, 105, 101, 110, 116, 32, 105, 110, 32, 114, 97, 120, 32, 40, 110, 101, 119, 32, 110, 41, 44, 32, 114, 101, 109, 97, 105, 110, 100, 101, 114, 32, 105, 110, 32, 114, 100, 120, 32, 40, 110, 101, 120, 116, 32, 100, 105, 103, 105, 116, 41, 10, 9, 109, 111, 118, 122, 120, 32, 114, 97, 120, 44, 32, 97, 108, 10, 9, 120, 111, 114, 32, 114, 100, 120, 44, 32, 114, 100, 120, 10, 9, 109, 111, 118, 32, 114, 99, 120, 44, 32, 49, 48, 10, 9, 100, 105, 118, 32, 114, 99, 120, 10, 10, 9, 59, 32, 115, 116, 111, 114, 101, 32, 100, 105, 103, 105, 116, 32, 97, 115, 32, 65, 83, 67, 73, 73, 32, 97, 116, 32, 98, 117, 102, 102, 101, 114, 91, 108, 101, 110, 93, 44, 32, 103, 114, 111, 119, 105, 110, 103, 32, 100, 111, 119, 110, 119, 97, 114, 100, 32, 102, 114, 111, 109, 32, 114, 98, 112, 45, 56, 10, 9, 97, 100, 100, 32, 100, 108, 44, 32, 39, 48, 39, 10, 9, 108, 101, 97, 32, 114, 57, 44, 32, 91, 114, 98, 112, 32, 45, 32, 56, 93, 10, 9, 109, 111, 118, 32, 101, 99, 120, 44, 32, 91, 114, 98, 112, 32, 45, 32, 52, 93, 10, 9, 115, 117, 98, 32, 114, 57, 44, 32, 114, 99, 120, 32, 32, 32, 32, 32, 32, 32, 32, 32, 59, 32, 114, 57, 32, 61, 32, 38, 98, 117, 102, 102, 101, 114, 91, 108, 101, 110, 93, 10, 9, 109, 111, 118, 32, 91, 114, 57, 93, 44, 32, 100, 108, 10, 10, 9, 105, 110, 99, 32, 100, 119, 111, 114, 100, 32, 91, 114, 98, 112, 32, 45, 32, 52, 93, 10, 9, 106, 109, 112, 32, 46, 108, 111, 111, 112, 10, 10, 9, 46, 100, 111, 110, 101, 58, 10, 9, 59, 32, 98, 117, 102, 102, 101, 114, 32, 104, 111, 108, 100, 115, 32, 100, 105, 103, 105, 116, 115, 32, 108, 101, 97, 115, 116, 45, 115, 105, 103, 110, 105, 102, 105, 99, 97, 110, 116, 32, 102, 105, 114, 115, 116, 59, 32, 119, 114, 105, 116, 101, 32, 102, 114, 111, 109, 32, 109, 111, 115, 116, 45, 115, 105, 103, 110, 105, 102, 105, 99, 97, 110, 116, 10, 9, 59, 32, 109, 111, 115, 116, 45, 115, 105, 103, 110, 105, 102, 105, 99, 97, 110, 116, 32, 100, 105, 103, 105, 116, 32, 105, 115, 32, 97, 116, 32, 114, 98, 112, 32, 45, 32, 56, 32, 45, 32, 40, 108, 101, 110, 32, 45, 32, 49, 41, 32, 61, 32, 114, 98, 112, 32, 45, 32, 55, 32, 45, 32, 108, 101, 110, 10, 9, 109, 111, 118, 32, 101, 100, 120, 44, 32, 91, 114, 98, 112, 32, 45, 32, 52, 93, 32, 32, 59, 32, 101, 100, 120, 32, 61, 32, 108, 101, 110, 10, 9, 109, 111, 118, 32, 101, 97, 120, 44, 32, 49, 10, 9, 109, 111, 118, 32, 114, 100, 105, 44, 32, 49, 10, 9, 108, 101, 97, 32, 114, 115, 105, 44, 32, 91, 114, 98, 112, 32, 45, 32, 55, 93, 10, 9, 115, 117, 98, 32, 114, 115, 105, 44, 32, 114, 100, 120, 32, 32, 32, 32, 32, 32, 32, 32, 59, 32, 114, 115, 105, 32, 61, 32, 114, 98, 112, 32, 45, 32, 55, 32, 45, 32, 108, 101, 110, 10, 9, 115, 121, 115, 99, 97, 108, 108, 10, 10, 9, 46, 101, 110, 100, 58, 10, 9, 109, 111, 118, 32, 114, 115, 112, 44, 32, 114, 98, 112, 10, 9, 112, 111, 112, 32, 114, 98, 112, 10, 9, 114, 101, 116, 10, 10, 95, 115, 116, 97, 114, 116, 58, 10, 9, 112, 117, 115, 104, 32, 114, 49, 52, 59, 32, 105, 110, 116, 32, 105, 10, 9, 112, 117, 115, 104, 32, 114, 49, 51, 10, 9, 120, 111, 114, 32, 114, 49, 52, 44, 32, 114, 49, 52, 32, 59, 32, 105, 32, 61, 32, 48, 10, 10, 9, 46, 108, 111, 111, 112, 58, 10, 9, 59, 32, 105, 102, 32, 105, 32, 62, 32, 115, 114, 99, 95, 108, 101, 110, 10, 9, 99, 109, 112, 32, 114, 49, 52, 44, 32, 115, 114, 99, 95, 108, 101, 110, 10, 9, 106, 103, 101, 32, 46, 100, 111, 110, 101, 32, 59, 32, 98, 114, 101, 97, 107, 59, 10, 10, 9, 59, 114, 49, 51, 32, 61, 32, 97, 100, 100, 114, 32, 111, 102, 32, 115, 114, 99, 32, 43, 32, 105, 10, 9, 108, 101, 97, 32, 114, 49, 51, 44, 32, 91, 114, 101, 108, 32, 115, 114, 99, 93, 10, 9, 97, 100, 100, 32, 114, 49, 51, 44, 32, 114, 49, 52, 10, 9, 10, 9, 99, 109, 112, 32, 98, 121, 116, 101, 32, 91, 114, 49, 51, 93, 44, 32, 49, 50, 54, 10, 9, 106, 101, 32, 46, 101, 115, 99, 97, 112, 101, 10, 10, 10, 9, 59, 32, 119, 114, 105, 116, 101, 32, 49, 44, 32, 114, 49, 51, 44, 32, 49, 10, 9, 109, 111, 118, 32, 101, 97, 120, 44, 32, 49, 10, 9, 109, 111, 118, 32, 114, 100, 105, 44, 32, 49, 10, 9, 109, 111, 118, 32, 114, 115, 105, 44, 32, 114, 49, 51, 10, 9, 109, 111, 118, 32, 114, 100, 120, 44, 32, 49, 10, 9, 115, 121, 115, 99, 97, 108, 108, 10, 9, 106, 109, 112, 32, 46, 110, 101, 120, 116, 95, 98, 121, 116, 101, 10, 10, 9, 46, 101, 115, 99, 97, 112, 101, 58, 10, 9, 112, 117, 115, 104, 32, 114, 49, 50, 10, 9, 120, 111, 114, 32, 114, 49, 50, 44, 32, 114, 49, 50, 32, 59, 32, 106, 32, 61, 32, 48, 10, 9, 46, 101, 95, 108, 111, 111, 112, 58, 10, 9, 99, 109, 112, 32, 114, 49, 50, 44, 32, 115, 114, 99, 95, 108, 101, 110, 10, 9, 106, 103, 101, 32, 46, 101, 115, 99, 97, 112, 101, 95, 101, 110, 100, 10, 10, 9, 108, 101, 97, 32, 114, 97, 120, 44, 32, 91, 114, 101, 108, 32, 115, 114, 99, 93, 10, 9, 97, 100, 100, 32, 114, 97, 120, 44, 32, 114, 49, 50, 10, 9, 109, 111, 118, 32, 97, 108, 44, 32, 91, 114, 97, 120, 93, 10, 9, 99, 97, 108, 108, 32, 112, 114, 105, 110, 116, 95, 110, 117, 109, 98, 101, 114, 10, 10, 9, 105, 110, 99, 32, 114, 49, 50, 10, 9, 99, 109, 112, 32, 114, 49, 50, 44, 32, 115, 114, 99, 95, 108, 101, 110, 10, 9, 106, 103, 101, 32, 46, 101, 115, 99, 97, 112, 101, 95, 101, 110, 100, 10, 10, 9, 109, 111, 118, 32, 101, 97, 120, 44, 32, 49, 10, 9, 109, 111, 118, 32, 114, 100, 105, 44, 32, 49, 10, 9, 108, 101, 97, 32, 114, 115, 105, 44, 32, 91, 114, 101, 108, 32, 115, 101, 112, 93, 10, 9, 109, 111, 118, 32, 114, 100, 120, 44, 32, 50, 10, 9, 115, 121, 115, 99, 97, 108, 108, 10, 10, 9, 106, 109, 112, 32, 46, 101, 95, 108, 111, 111, 112, 10, 9, 46, 101, 115, 99, 97, 112, 101, 95, 101, 110, 100, 58, 10, 9, 112, 111, 112, 32, 114, 49, 50, 10, 10, 9, 46, 110, 101, 120, 116, 95, 98, 121, 116, 101, 58, 10, 9, 105, 110, 99, 32, 114, 49, 52, 32, 59, 32, 43, 43, 105, 10, 9, 106, 109, 112, 32, 46, 108, 111, 111, 112, 10, 10, 9, 46, 100, 111, 110, 101, 58, 10, 9, 109, 111, 118, 32, 101, 97, 120, 44, 32, 54, 48, 32, 9, 9, 9, 9, 9, 59, 32, 83, 89, 83, 95, 101, 120, 105, 116, 10, 9, 120, 111, 114, 32, 101, 100, 105, 44, 32, 101, 100, 105, 9, 9, 9, 9, 9, 59, 32, 99, 111, 100, 101, 32, 61, 32, 48, 10, 9, 115, 121, 115, 99, 97, 108, 108, 10 src_len: equ $ - src sep: db ", " zero_str: db "0" @@ -32,16 +32,16 @@ section .text print_number: push rbp mov rbp, rsp - sub rsp, 16 - ; al = n (uint8_t) - ; [rbp - 1] = buffer[0] - ; [rbp - 2] = buffer[1] - ; [rbp - 3] = buffer[2] - ; [rbp - 4] = len (int) - ; [rbp - 8] = i (int) + sub rsp, 16 + ; al = n (input, uint8_t) + ; [rbp - 4] = len (dword) + ; [rbp - 8] = buffer[0] units digit (stored first) + ; [rbp - 9] = buffer[1] tens digit + ; [rbp - 10] = buffer[2] hundreds digit cmp al, 0 jne .e_write_0 + ; n == 0 : write "0" and return mov eax, 1 mov rdi, 1 lea rsi, [rel zero_str] @@ -50,32 +50,37 @@ print_number: jmp .end .e_write_0: - mov dword [rbp - 4], 0 ; len = 0 - .loop: ; while n > 0 + mov dword [rbp - 4], 0 + .loop: cmp al, 0 - jle .done + jz .done - ;lea rax, [rbp - 1] - ;add rax, [rbp - 4] - ; + ; divide n by 10 : quotient in rax (new n), remainder in rdx (next digit) + movzx rax, al + xor rdx, rdx + mov rcx, 10 + div rcx - - movzx rax, al ; rax <- n - xor rdx, rdx ; rdx = 0 - mov rcx, 10 ; rxc = 10 - div rcx ; n / 10 + ; store digit as ASCII at buffer[len], growing downward from rbp-8 + add dl, '0' + lea r9, [rbp - 8] + mov ecx, [rbp - 4] + sub r9, rcx ; r9 = &buffer[len] + mov [r9], dl - inc dword [rbp - 4] ; len ++ + inc dword [rbp - 4] jmp .loop - + .done: - ; write 1 buffer len + ; buffer holds digits least-significant first; write from most-significant + ; most-significant digit is at rbp - 8 - (len - 1) = rbp - 7 - len + mov edx, [rbp - 4] ; edx = len mov eax, 1 mov rdi, 1 - lea rsi, [rbp - 1] - mov edx, [rbp - 4] + lea rsi, [rbp - 7] + sub rsi, rdx ; rsi = rbp - 7 - len syscall - + .end: mov rsp, rbp pop rbp @@ -89,7 +94,7 @@ _start: .loop: ; if i > src_len cmp r14, src_len - jg .done ; break; + jge .done ; break; ;r13 = addr of src + i lea r13, [rel src] @@ -105,14 +110,23 @@ _start: mov rsi, r13 mov rdx, 1 syscall - jmp .escape_done + jmp .next_byte .escape: - push r11 - xor r11, r11 ; j = 0 + push r12 + xor r12, r12 ; j = 0 .e_loop: - cmp r11, src_len - jg .escape_done + cmp r12, src_len + jge .escape_end + + lea rax, [rel src] + add rax, r12 + mov al, [rax] + call print_number + + inc r12 + cmp r12, src_len + jge .escape_end mov eax, 1 mov rdi, 1 @@ -120,15 +134,11 @@ _start: mov rdx, 2 syscall - lea rax, [rel src] - add rax, r11 - mov al, [rax] - call print_number - - inc r11 jmp .e_loop - .escape_done: + .escape_end: + pop r12 + .next_byte: inc r14 ; ++i jmp .loop