From b0a098c7146f84e01f5c88917b3f27d967203646 Mon Sep 17 00:00:00 2001 From: lohhiiccc Date: Mon, 8 Jun 2026 17:50:15 +0200 Subject: [PATCH] refactor: Grace_asm --- src/Grace/Grace.s | 375 +++++++++++++++++++++++++++++++--------------- 1 file changed, 252 insertions(+), 123 deletions(-) diff --git a/src/Grace/Grace.s b/src/Grace/Grace.s index ad38563..b48588c 100644 --- a/src/Grace/Grace.s +++ b/src/Grace/Grace.s @@ -1,151 +1,280 @@ 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, 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, 102, 105, 108, 101, 110, 97, 109, 101, 58, 32, 100, 98, 32, 34, 71, 114, 97, 99, 101, 95, 107, 105, 100, 46, 115, 34, 44, 32, 48, 10, 102, 108, 97, 103, 115, 58, 32, 100, 113, 32, 53, 55, 56, 10, 10, 115, 101, 99, 116, 105, 111, 110, 32, 46, 116, 101, 120, 116, 10, 10, 59, 32, 91, 114, 98, 112, 32, 45, 32, 52, 93, 9, 9, 61, 32, 108, 101, 110, 32, 40, 100, 119, 111, 114, 100, 41, 10, 59, 32, 91, 114, 98, 112, 32, 45, 32, 56, 93, 9, 9, 61, 32, 98, 117, 102, 102, 101, 114, 91, 48, 93, 32, 117, 110, 105, 116, 115, 32, 100, 105, 103, 105, 116, 32, 40, 115, 116, 111, 114, 101, 100, 32, 102, 105, 114, 115, 116, 41, 10, 59, 32, 91, 114, 98, 112, 32, 45, 32, 57, 93, 9, 9, 61, 32, 98, 117, 102, 102, 101, 114, 91, 49, 93, 32, 116, 101, 110, 115, 32, 100, 105, 103, 105, 116, 10, 59, 32, 91, 114, 98, 112, 32, 45, 32, 49, 48, 93, 9, 61, 32, 98, 117, 102, 102, 101, 114, 91, 50, 93, 32, 104, 117, 110, 100, 114, 101, 100, 115, 32, 100, 105, 103, 105, 116, 10, 59, 32, 91, 114, 98, 112, 32, 45, 32, 49, 54, 93, 9, 61, 32, 102, 100, 10, 95, 115, 116, 97, 114, 116, 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, 51, 50, 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, 109, 111, 118, 32, 101, 97, 120, 44, 32, 50, 10, 9, 108, 101, 97, 32, 114, 100, 105, 44, 32, 91, 114, 101, 108, 32, 102, 105, 108, 101, 110, 97, 109, 101, 93, 10, 9, 109, 111, 118, 32, 114, 115, 105, 44, 32, 91, 114, 101, 108, 32, 102, 108, 97, 103, 115, 93, 10, 9, 109, 111, 118, 32, 114, 100, 120, 44, 32, 48, 54, 52, 52, 111, 10, 9, 115, 121, 115, 99, 97, 108, 108, 10, 9, 99, 109, 112, 32, 114, 97, 120, 44, 32, 48, 10, 9, 106, 108, 32, 46, 101, 120, 105, 116, 95, 102, 97, 105, 108, 117, 114, 101, 10, 9, 109, 111, 118, 32, 91, 114, 98, 112, 32, 45, 32, 49, 54, 93, 44, 32, 114, 97, 120, 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, 91, 114, 98, 112, 32, 45, 32, 49, 54, 93, 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, 59, 32, 112, 114, 105, 110, 116, 32, 110, 117, 109, 98, 101, 114, 32, 115, 116, 97, 114, 116, 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, 91, 114, 98, 112, 32, 45, 32, 49, 54, 93, 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, 112, 114, 116, 95, 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, 32, 59, 32, 108, 101, 110, 32, 61, 32, 48, 10, 9, 46, 112, 114, 116, 95, 108, 111, 111, 112, 58, 10, 9, 99, 109, 112, 32, 97, 108, 44, 32, 48, 10, 9, 106, 122, 32, 46, 112, 114, 116, 95, 100, 111, 110, 101, 32, 59, 32, 98, 114, 101, 97, 107, 32, 105, 102, 32, 97, 108, 32, 61, 61, 32, 49, 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, 9, 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, 112, 114, 116, 95, 108, 111, 111, 112, 10, 10, 9, 46, 112, 114, 116, 95, 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, 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, 9, 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, 91, 114, 98, 112, 32, 45, 32, 49, 54, 93, 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, 9, 9, 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, 112, 114, 116, 95, 101, 110, 100, 58, 10, 9, 59, 32, 112, 114, 105, 110, 116, 32, 110, 117, 109, 98, 101, 114, 32, 101, 110, 100, 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, 91, 114, 98, 112, 32, 45, 32, 49, 54, 93, 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, 114, 115, 112, 44, 32, 114, 98, 112, 10, 9, 112, 111, 112, 32, 114, 98, 112, 10, 10, 9, 109, 111, 118, 32, 101, 97, 120, 44, 32, 54, 48, 32, 59, 32, 83, 89, 83, 95, 101, 120, 105, 116, 10, 9, 46, 101, 120, 105, 116, 95, 115, 117, 99, 99, 101, 115, 115, 58, 10, 9, 120, 111, 114, 32, 101, 100, 105, 44, 32, 101, 100, 105, 32, 59, 32, 99, 111, 100, 101, 32, 61, 32, 48, 10, 9, 115, 121, 115, 99, 97, 108, 108, 10, 10, 9, 46, 101, 120, 105, 116, 95, 102, 97, 105, 108, 117, 114, 101, 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, 109, 111, 118, 32, 101, 100, 105, 44, 32, 45, 49, 32, 59, 32, 99, 111, 100, 101, 32, 61, 32, 48, 10, 9, 115, 121, 115, 99, 97, 108, 108, 10, 9, 10, 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, 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, 10, 102, 105, 108, 101, 110, 97, 109, 101, 58, 32, 100, 98, 32, 34, 71, 114, 97, 99, 101, 95, 107, 105, 100, 46, 115, 34, 44, 32, 48, 10, 102, 108, 97, 103, 115, 58, 32, 100, 113, 32, 53, 55, 56, 10, 10, 115, 101, 99, 116, 105, 111, 110, 32, 46, 98, 115, 115, 10, 10, 59, 98, 117, 102, 102, 101, 114, 10, 37, 100, 101, 102, 105, 110, 101, 32, 66, 85, 70, 70, 95, 83, 73, 90, 69, 32, 53, 49, 50, 10, 97, 108, 105, 103, 110, 32, 66, 85, 70, 70, 95, 83, 73, 90, 69, 10, 98, 117, 102, 102, 101, 114, 58, 32, 114, 101, 115, 98, 32, 66, 85, 70, 70, 95, 83, 73, 90, 69, 10, 10, 115, 101, 99, 116, 105, 111, 110, 32, 46, 100, 97, 116, 97, 10, 98, 117, 102, 102, 95, 108, 101, 110, 58, 32, 100, 100, 32, 48, 10, 102, 100, 58, 32, 100, 113, 32, 45, 49, 10, 10, 115, 101, 99, 116, 105, 111, 110, 32, 46, 116, 101, 120, 116, 10, 10, 10, 59, 32, 97, 100, 100, 95, 116, 111, 95, 98, 117, 102, 102, 10, 37, 97, 115, 115, 105, 103, 110, 32, 85, 73, 68, 48, 32, 48, 10, 37, 109, 97, 99, 114, 111, 32, 65, 68, 68, 95, 84, 79, 95, 66, 85, 70, 70, 32, 48, 10, 37, 97, 115, 115, 105, 103, 110, 32, 85, 73, 68, 48, 32, 85, 73, 68, 48, 32, 43, 32, 49, 10, 9, 59, 32, 114, 57, 100, 32, 61, 32, 98, 117, 102, 102, 95, 108, 101, 110, 10, 9, 109, 111, 118, 32, 114, 57, 100, 44, 32, 100, 119, 111, 114, 100, 32, 91, 114, 101, 108, 32, 98, 117, 102, 102, 95, 108, 101, 110, 93, 32, 59, 32, 114, 57, 100, 32, 61, 32, 98, 117, 102, 102, 108, 101, 110, 10, 10, 9, 59, 32, 105, 102, 32, 98, 117, 102, 102, 95, 108, 101, 110, 32, 62, 61, 32, 66, 85, 70, 70, 95, 83, 73, 90, 69, 58, 32, 102, 108, 117, 115, 104, 10, 9, 99, 109, 112, 32, 114, 57, 100, 44, 32, 66, 85, 70, 70, 95, 83, 73, 90, 69, 10, 9, 106, 103, 101, 32, 46, 65, 68, 68, 95, 84, 79, 95, 66, 85, 70, 70, 95, 102, 108, 117, 115, 104, 37, 91, 85, 73, 68, 48, 93, 10, 10, 46, 65, 68, 68, 95, 84, 79, 95, 66, 85, 70, 70, 95, 97, 100, 100, 95, 99, 104, 97, 114, 37, 91, 85, 73, 68, 48, 93, 58, 10, 9, 59, 32, 98, 117, 102, 102, 101, 114, 91, 98, 117, 102, 102, 95, 108, 101, 110, 93, 32, 61, 32, 97, 108, 10, 9, 108, 101, 97, 32, 114, 49, 48, 44, 32, 91, 114, 101, 108, 32, 98, 117, 102, 102, 101, 114, 93, 10, 9, 97, 100, 100, 32, 114, 49, 48, 44, 32, 114, 57, 10, 9, 109, 111, 118, 32, 98, 121, 116, 101, 32, 91, 114, 49, 48, 93, 44, 32, 97, 108, 10, 10, 9, 59, 98, 117, 102, 102, 95, 108, 101, 110, 43, 43, 10, 9, 105, 110, 99, 32, 100, 119, 111, 114, 100, 32, 91, 114, 101, 108, 32, 98, 117, 102, 102, 95, 108, 101, 110, 93, 10, 10, 9, 59, 114, 101, 116, 117, 114, 110, 10, 9, 106, 109, 112, 32, 46, 65, 68, 68, 95, 84, 79, 95, 66, 85, 70, 70, 95, 114, 101, 116, 37, 91, 85, 73, 68, 48, 93, 10, 10, 46, 65, 68, 68, 95, 84, 79, 95, 66, 85, 70, 70, 95, 102, 108, 117, 115, 104, 37, 91, 85, 73, 68, 48, 93, 58, 10, 10, 9, 112, 117, 115, 104, 32, 114, 100, 120, 10, 9, 112, 117, 115, 104, 32, 114, 97, 120, 10, 10, 9, 59, 32, 45, 45, 45, 45, 45, 32, 102, 108, 117, 115, 104, 32, 98, 117, 102, 102, 32, 45, 45, 45, 45, 45, 10, 10, 9, 9, 99, 109, 112, 32, 100, 119, 111, 114, 100, 32, 91, 114, 101, 108, 32, 98, 117, 102, 102, 95, 108, 101, 110, 93, 44, 32, 48, 32, 59, 32, 105, 102, 32, 98, 117, 102, 102, 95, 108, 101, 110, 32, 61, 61, 32, 48, 58, 32, 100, 111, 32, 110, 111, 116, 32, 102, 108, 117, 115, 104, 10, 9, 9, 106, 122, 32, 46, 65, 68, 68, 95, 84, 79, 95, 66, 85, 70, 70, 95, 102, 108, 117, 115, 104, 95, 100, 111, 110, 101, 37, 91, 85, 73, 68, 48, 93, 10, 10, 9, 9, 59, 32, 119, 114, 105, 116, 101, 40, 102, 100, 44, 32, 98, 117, 102, 102, 101, 114, 44, 32, 98, 117, 102, 102, 95, 108, 101, 110, 41, 10, 9, 9, 109, 111, 118, 32, 101, 97, 120, 44, 32, 49, 10, 9, 9, 109, 111, 118, 32, 101, 100, 105, 44, 32, 91, 114, 101, 108, 32, 102, 100, 93, 10, 9, 9, 108, 101, 97, 32, 114, 115, 105, 44, 32, 91, 114, 101, 108, 32, 98, 117, 102, 102, 101, 114, 93, 10, 9, 9, 109, 111, 118, 32, 101, 100, 120, 44, 32, 91, 114, 101, 108, 32, 98, 117, 102, 102, 95, 108, 101, 110, 93, 10, 9, 9, 115, 121, 115, 99, 97, 108, 108, 32, 10, 10, 9, 9, 59, 32, 98, 117, 102, 102, 95, 108, 101, 110, 32, 61, 32, 48, 10, 9, 9, 109, 111, 118, 32, 100, 119, 111, 114, 100, 32, 91, 114, 101, 108, 32, 98, 117, 102, 102, 95, 108, 101, 110, 93, 44, 32, 48, 10, 10, 46, 65, 68, 68, 95, 84, 79, 95, 66, 85, 70, 70, 95, 102, 108, 117, 115, 104, 95, 100, 111, 110, 101, 37, 91, 85, 73, 68, 48, 93, 58, 10, 10, 9, 59, 32, 45, 45, 45, 45, 45, 32, 102, 108, 117, 115, 104, 32, 100, 111, 110, 101, 32, 45, 45, 45, 45, 45, 10, 10, 9, 112, 111, 112, 32, 114, 97, 120, 10, 9, 112, 111, 112, 32, 114, 100, 120, 10, 10, 9, 59, 32, 98, 117, 102, 102, 95, 108, 101, 110, 32, 61, 32, 48, 10, 9, 120, 111, 114, 32, 114, 57, 100, 44, 32, 114, 57, 100, 10, 10, 9, 59, 32, 103, 111, 32, 98, 97, 99, 107, 32, 116, 111, 32, 97, 100, 100, 95, 99, 104, 97, 114, 10, 9, 106, 109, 112, 32, 46, 65, 68, 68, 95, 84, 79, 95, 66, 85, 70, 70, 95, 97, 100, 100, 95, 99, 104, 97, 114, 37, 91, 85, 73, 68, 48, 93, 10, 10, 46, 65, 68, 68, 95, 84, 79, 95, 66, 85, 70, 70, 95, 114, 101, 116, 37, 91, 85, 73, 68, 48, 93, 58, 10, 37, 101, 110, 100, 109, 97, 99, 114, 111, 10, 10, 37, 97, 115, 115, 105, 103, 110, 32, 85, 73, 68, 49, 32, 48, 10, 37, 109, 97, 99, 114, 111, 32, 73, 78, 84, 56, 95, 84, 79, 95, 66, 85, 70, 70, 32, 48, 10, 37, 97, 115, 115, 105, 103, 110, 32, 85, 73, 68, 49, 32, 85, 73, 68, 49, 32, 43, 32, 49, 10, 9, 59, 32, 102, 108, 97, 103, 32, 61, 32, 48, 32, 40, 110, 111, 116, 104, 105, 110, 103, 32, 119, 114, 111, 116, 116, 101, 110, 41, 10, 9, 120, 111, 114, 32, 114, 56, 98, 44, 32, 114, 56, 98, 10, 9, 109, 111, 118, 122, 120, 32, 101, 97, 120, 44, 32, 97, 108, 10, 10, 9, 59, 104, 117, 110, 100, 114, 101, 100, 115, 10, 9, 120, 111, 114, 32, 101, 100, 120, 44, 32, 101, 100, 120, 10, 9, 109, 111, 118, 32, 101, 99, 120, 44, 32, 49, 48, 48, 10, 9, 59, 97, 108, 32, 61, 32, 104, 117, 110, 100, 114, 101, 100, 115, 44, 32, 101, 100, 120, 32, 61, 32, 99, 97, 114, 114, 121, 10, 9, 100, 105, 118, 32, 101, 99, 120, 10, 9, 59, 32, 97, 108, 32, 61, 32, 104, 117, 110, 100, 114, 101, 100, 115, 32, 105, 110, 32, 97, 115, 99, 105, 105, 10, 9, 97, 100, 100, 32, 97, 108, 44, 32, 39, 48, 39, 10, 10, 9, 59, 32, 100, 111, 32, 110, 111, 116, 32, 119, 114, 105, 116, 101, 32, 105, 102, 32, 104, 117, 110, 100, 114, 101, 100, 115, 32, 61, 61, 32, 39, 48, 39, 10, 9, 99, 109, 112, 32, 97, 108, 44, 32, 39, 48, 39, 10, 9, 106, 101, 32, 46, 110, 111, 95, 104, 117, 110, 100, 114, 101, 100, 115, 37, 91, 85, 73, 68, 49, 93, 10, 9, 10, 9, 59, 32, 97, 100, 100, 32, 104, 117, 110, 100, 114, 101, 100, 115, 32, 99, 104, 97, 114, 32, 116, 111, 32, 98, 117, 102, 102, 10, 9, 65, 68, 68, 95, 84, 79, 95, 66, 85, 70, 70, 10, 10, 9, 59, 32, 102, 108, 97, 103, 32, 61, 32, 49, 32, 40, 119, 114, 105, 116, 101, 110, 41, 10, 9, 109, 111, 118, 32, 114, 56, 98, 44, 32, 49, 10, 10, 46, 110, 111, 95, 104, 117, 110, 100, 114, 101, 100, 115, 37, 91, 85, 73, 68, 49, 93, 58, 10, 9, 59, 32, 101, 97, 120, 32, 61, 32, 99, 97, 114, 114, 121, 10, 9, 109, 111, 118, 32, 101, 97, 120, 44, 32, 101, 100, 120, 10, 10, 46, 116, 101, 110, 115, 37, 91, 85, 73, 68, 49, 93, 58, 10, 9, 120, 111, 114, 32, 101, 100, 120, 44, 32, 101, 100, 120, 10, 9, 109, 111, 118, 32, 101, 99, 120, 44, 32, 49, 48, 10, 9, 59, 32, 97, 108, 32, 61, 32, 116, 101, 110, 115, 44, 32, 101, 100, 120, 32, 61, 32, 117, 110, 105, 116, 10, 9, 100, 105, 118, 32, 101, 99, 120, 10, 9, 10, 9, 59, 32, 97, 108, 32, 61, 32, 116, 101, 110, 115, 32, 105, 110, 32, 97, 115, 99, 105, 105, 10, 9, 97, 100, 100, 32, 97, 108, 44, 32, 39, 48, 39, 10, 10, 9, 59, 105, 102, 32, 102, 108, 97, 103, 115, 32, 61, 61, 32, 48, 32, 38, 38, 32, 97, 108, 32, 61, 61, 32, 39, 48, 39, 58, 32, 103, 111, 116, 111, 32, 117, 110, 105, 116, 10, 9, 99, 109, 112, 32, 114, 56, 98, 44, 32, 48, 10, 9, 106, 101, 32, 46, 116, 101, 115, 116, 95, 116, 101, 110, 115, 37, 91, 85, 73, 68, 49, 93, 10, 9, 106, 109, 112, 32, 46, 115, 107, 105, 112, 37, 91, 85, 73, 68, 49, 93, 10, 10, 46, 116, 101, 115, 116, 95, 116, 101, 110, 115, 37, 91, 85, 73, 68, 49, 93, 58, 10, 9, 99, 109, 112, 32, 97, 108, 44, 32, 39, 48, 39, 10, 9, 106, 101, 32, 46, 110, 111, 95, 116, 101, 110, 115, 37, 91, 85, 73, 68, 49, 93, 10, 10, 10, 46, 115, 107, 105, 112, 37, 91, 85, 73, 68, 49, 93, 58, 10, 9, 65, 68, 68, 95, 84, 79, 95, 66, 85, 70, 70, 10, 9, 109, 111, 118, 32, 114, 56, 98, 44, 32, 49, 10, 10, 46, 110, 111, 95, 116, 101, 110, 115, 37, 91, 85, 73, 68, 49, 93, 58, 10, 9, 59, 32, 97, 108, 32, 61, 32, 117, 110, 105, 116, 115, 10, 9, 109, 111, 118, 32, 97, 108, 44, 32, 100, 108, 10, 10, 46, 117, 110, 105, 116, 115, 37, 91, 85, 73, 68, 49, 93, 58, 10, 9, 97, 100, 100, 32, 97, 108, 44, 32, 39, 48, 39, 10, 9, 65, 68, 68, 95, 84, 79, 95, 66, 85, 70, 70, 10, 37, 101, 110, 100, 109, 97, 99, 114, 111, 10, 10, 10, 59, 32, 109, 97, 105, 110, 10, 59, 10, 59, 32, 111, 112, 101, 110, 32, 71, 114, 97, 99, 101, 95, 107, 105, 100, 46, 115, 32, 91, 100, 111, 110, 101, 93, 10, 59, 10, 59, 32, 108, 111, 111, 112, 32, 111, 110, 32, 115, 114, 99, 32, 91, 100, 111, 110, 101, 93, 10, 59, 32, 105, 102, 32, 115, 114, 99, 91, 114, 49, 52, 93, 32, 33, 61, 32, 32, 91, 100, 111, 110, 101, 93, 10, 59, 9, 9, 65, 68, 68, 95, 84, 79, 95, 66, 85, 70, 70, 32, 115, 114, 99, 91, 114, 49, 52, 93, 32, 91, 100, 111, 110, 101, 93, 10, 59, 32, 101, 108, 115, 101, 32, 91, 100, 111, 110, 101, 93, 10, 59, 9, 108, 111, 111, 112, 32, 111, 110, 32, 115, 114, 99, 10, 59, 9, 9, 102, 111, 114, 32, 101, 97, 99, 104, 32, 99, 104, 97, 114, 32, 112, 114, 105, 110, 116, 58, 32, 34, 44, 32, 60, 97, 115, 99, 105, 105, 32, 99, 111, 100, 101, 62, 34, 10, 59, 10, 59, 32, 99, 108, 111, 115, 101, 32, 71, 114, 97, 99, 101, 95, 107, 105, 100, 46, 115, 32, 91, 100, 111, 110, 101, 93, 10, 59, 10, 59, 32, 101, 120, 105, 116, 10, 10, 37, 109, 97, 99, 114, 111, 32, 81, 85, 73, 78, 69, 32, 48, 10, 95, 115, 116, 97, 114, 116, 58, 10, 10, 9, 59, 102, 100, 32, 61, 32, 111, 112, 101, 110, 40, 34, 71, 114, 97, 99, 101, 95, 107, 105, 100, 44, 32, 79, 95, 67, 82, 69, 65, 84, 32, 124, 32, 79, 95, 82, 68, 87, 82, 32, 124, 32, 79, 95, 84, 82, 85, 78, 67, 44, 32, 48, 54, 54, 52, 41, 10, 9, 109, 111, 118, 32, 114, 97, 120, 44, 32, 50, 10, 9, 108, 101, 97, 32, 114, 100, 105, 44, 32, 91, 114, 101, 108, 32, 102, 105, 108, 101, 110, 97, 109, 101, 93, 10, 9, 109, 111, 118, 32, 114, 115, 105, 44, 32, 91, 114, 101, 108, 32, 102, 108, 97, 103, 115, 93, 10, 9, 109, 111, 118, 32, 114, 100, 120, 44, 32, 48, 54, 54, 52, 111, 10, 9, 115, 121, 115, 99, 97, 108, 108, 10, 9, 109, 111, 118, 32, 91, 114, 101, 108, 32, 102, 100, 93, 44, 32, 114, 97, 120, 10, 10, 9, 59, 101, 120, 105, 116, 32, 105, 102, 32, 102, 100, 32, 60, 32, 48, 10, 9, 99, 109, 112, 32, 114, 97, 120, 44, 32, 48, 10, 9, 106, 108, 32, 46, 101, 120, 105, 116, 10, 10, 9, 59, 32, 114, 49, 52, 32, 61, 32, 48, 10, 9, 120, 111, 114, 32, 114, 49, 52, 44, 32, 114, 49, 52, 10, 59, 32, 119, 104, 105, 108, 101, 32, 114, 49, 52, 32, 33, 61, 32, 115, 114, 99, 95, 108, 101, 110, 10, 46, 112, 114, 105, 110, 116, 95, 115, 114, 99, 58, 10, 9, 99, 109, 112, 32, 114, 49, 52, 44, 32, 115, 114, 99, 95, 108, 101, 110, 10, 9, 106, 101, 32, 46, 112, 114, 105, 110, 116, 95, 115, 114, 99, 95, 100, 111, 110, 101, 10, 10, 9, 59, 32, 97, 108, 32, 61, 32, 115, 114, 99, 91, 114, 49, 52, 93, 10, 9, 108, 101, 97, 32, 114, 115, 105, 44, 32, 91, 114, 101, 108, 32, 115, 114, 99, 93, 10, 9, 97, 100, 100, 32, 114, 115, 105, 44, 32, 114, 49, 52, 10, 9, 109, 111, 118, 122, 120, 32, 101, 97, 120, 44, 32, 98, 121, 116, 101, 32, 91, 114, 115, 105, 93, 10, 10, 9, 99, 109, 112, 32, 97, 108, 44, 32, 49, 50, 54, 10, 9, 106, 101, 32, 46, 101, 115, 99, 97, 112, 101, 95, 115, 116, 114, 10, 10, 9, 59, 98, 117, 102, 102, 91, 98, 117, 102, 102, 95, 108, 101, 110, 93, 32, 61, 32, 97, 108, 32, 40, 102, 108, 117, 115, 104, 32, 105, 102, 32, 110, 101, 101, 100, 101, 100, 41, 10, 9, 65, 68, 68, 95, 84, 79, 95, 66, 85, 70, 70, 10, 10, 9, 59, 32, 114, 49, 52, 43, 43, 10, 9, 105, 110, 99, 32, 114, 49, 52, 10, 10, 9, 106, 109, 112, 32, 46, 112, 114, 105, 110, 116, 95, 115, 114, 99, 10, 46, 112, 114, 105, 110, 116, 95, 115, 114, 99, 95, 100, 111, 110, 101, 58, 10, 10, 10, 59, 32, 102, 108, 117, 115, 104, 32, 114, 101, 109, 97, 105, 110, 105, 110, 103, 32, 98, 121, 116, 101, 115, 32, 105, 102, 32, 97, 110, 121, 32, 10, 46, 100, 111, 110, 101, 95, 119, 114, 105, 116, 105, 110, 103, 58, 10, 9, 59, 105, 102, 32, 98, 117, 102, 102, 95, 108, 101, 110, 32, 61, 61, 32, 48, 58, 32, 101, 120, 105, 116, 10, 9, 109, 111, 118, 32, 101, 97, 120, 44, 32, 48, 10, 9, 109, 111, 118, 32, 101, 100, 120, 44, 32, 91, 114, 101, 108, 32, 98, 117, 102, 102, 95, 108, 101, 110, 93, 10, 9, 116, 101, 115, 116, 32, 101, 100, 120, 44, 32, 101, 100, 120, 10, 9, 106, 122, 32, 46, 100, 111, 110, 101, 10, 10, 9, 59, 119, 114, 105, 116, 101, 40, 102, 100, 44, 32, 98, 117, 102, 102, 101, 114, 44, 32, 98, 117, 102, 102, 95, 108, 101, 110, 41, 10, 9, 109, 111, 118, 32, 101, 97, 120, 44, 32, 49, 10, 9, 109, 111, 118, 32, 101, 100, 105, 44, 32, 91, 114, 101, 108, 32, 102, 100, 93, 10, 9, 108, 101, 97, 32, 114, 115, 105, 44, 32, 91, 114, 101, 108, 32, 98, 117, 102, 102, 101, 114, 93, 10, 9, 115, 121, 115, 99, 97, 108, 108, 10, 9, 10, 9, 59, 32, 98, 117, 102, 102, 95, 108, 101, 110, 32, 61, 32, 48, 10, 9, 109, 111, 118, 32, 100, 119, 111, 114, 100, 32, 91, 114, 101, 108, 32, 98, 117, 102, 102, 95, 108, 101, 110, 93, 44, 32, 48, 10, 9, 120, 111, 114, 32, 114, 97, 120, 44, 32, 114, 97, 120, 10, 9, 10, 10, 46, 100, 111, 110, 101, 58, 10, 9, 59, 32, 105, 102, 32, 102, 100, 32, 60, 32, 48, 58, 32, 115, 107, 105, 112, 32, 99, 108, 111, 115, 101, 10, 9, 99, 109, 112, 32, 91, 114, 101, 108, 32, 102, 100, 93, 44, 32, 48, 10, 9, 106, 108, 32, 46, 101, 120, 105, 116, 10, 10, 9, 59, 32, 115, 97, 118, 101, 32, 114, 97, 120, 10, 9, 112, 117, 115, 104, 32, 114, 97, 120, 10, 10, 9, 59, 32, 99, 108, 111, 115, 101, 40, 102, 100, 41, 10, 9, 109, 111, 118, 32, 114, 100, 105, 44, 32, 91, 114, 101, 108, 32, 102, 100, 93, 10, 9, 109, 111, 118, 32, 101, 97, 120, 44, 32, 51, 10, 9, 115, 121, 115, 99, 97, 108, 108, 10, 10, 9, 59, 32, 114, 101, 115, 116, 111, 114, 101, 32, 114, 97, 120, 10, 9, 112, 111, 112, 32, 114, 97, 120, 10, 10, 46, 101, 120, 105, 116, 58, 10, 9, 59, 32, 101, 120, 105, 116, 40, 114, 97, 120, 41, 10, 9, 109, 111, 118, 32, 114, 100, 105, 44, 32, 114, 97, 120, 10, 9, 109, 111, 118, 32, 101, 97, 120, 44, 32, 54, 48, 10, 9, 115, 121, 115, 99, 97, 108, 108, 10, 10, 10, 46, 101, 115, 99, 97, 112, 101, 95, 115, 116, 114, 58, 10, 9, 112, 117, 115, 104, 32, 114, 49, 52, 10, 9, 59, 32, 114, 49, 52, 32, 61, 32, 48, 10, 9, 120, 111, 114, 32, 114, 49, 52, 44, 32, 114, 49, 52, 10, 10, 9, 59, 32, 97, 100, 100, 32, 34, 34, 10, 9, 109, 111, 118, 32, 97, 108, 44, 32, 51, 52, 10, 9, 65, 68, 68, 95, 84, 79, 95, 66, 85, 70, 70, 10, 9, 65, 68, 68, 95, 84, 79, 95, 66, 85, 70, 70, 10, 10, 59, 32, 119, 104, 105, 108, 101, 32, 114, 49, 52, 32, 33, 61, 32, 108, 101, 110, 10, 46, 108, 111, 111, 112, 95, 101, 115, 99, 97, 112, 101, 58, 10, 9, 99, 109, 112, 32, 114, 49, 52, 44, 32, 115, 114, 99, 95, 108, 101, 110, 10, 9, 106, 101, 32, 46, 101, 115, 99, 97, 112, 101, 95, 100, 111, 110, 101, 10, 10, 9, 109, 111, 118, 32, 97, 108, 44, 32, 52, 52, 10, 9, 65, 68, 68, 95, 84, 79, 95, 66, 85, 70, 70, 10, 9, 109, 111, 118, 32, 97, 108, 44, 32, 51, 50, 10, 9, 65, 68, 68, 95, 84, 79, 95, 66, 85, 70, 70, 10, 10, 9, 59, 32, 114, 115, 105, 32, 61, 32, 38, 115, 114, 99, 32, 43, 32, 114, 49, 52, 10, 9, 108, 101, 97, 32, 114, 115, 105, 44, 32, 91, 114, 101, 108, 32, 115, 114, 99, 93, 10, 9, 97, 100, 100, 32, 114, 115, 105, 44, 32, 114, 49, 52, 10, 10, 9, 59, 32, 97, 108, 32, 61, 32, 42, 114, 115, 105, 10, 9, 109, 111, 118, 122, 120, 32, 101, 97, 120, 44, 32, 98, 121, 116, 101, 32, 91, 114, 115, 105, 93, 10, 9, 73, 78, 84, 56, 95, 84, 79, 95, 66, 85, 70, 70, 10, 10, 9, 105, 110, 99, 32, 114, 49, 52, 10, 9, 106, 109, 112, 32, 46, 108, 111, 111, 112, 95, 101, 115, 99, 97, 112, 101, 10, 46, 101, 115, 99, 97, 112, 101, 95, 100, 111, 110, 101, 58, 10, 10, 9, 112, 111, 112, 32, 114, 49, 52, 10, 9, 105, 110, 99, 32, 114, 49, 52, 10, 9, 106, 109, 112, 32, 46, 112, 114, 105, 110, 116, 95, 115, 114, 99, 10, 37, 101, 110, 100, 109, 97, 99, 114, 111, 10, 10, 81, 85, 73, 78, 69, 10 src_len: equ $ - src -sep: db ", " -zero_str: db "0" + filename: db "Grace_kid.s", 0 flags: dq 578 +section .bss + +;buffer +%define BUFF_SIZE 512 +align BUFF_SIZE +buffer: resb BUFF_SIZE + +section .data +buff_len: dd 0 +fd: dq -1 + section .text -; [rbp - 4] = len (dword) -; [rbp - 8] = buffer[0] units digit (stored first) -; [rbp - 9] = buffer[1] tens digit -; [rbp - 10] = buffer[2] hundreds digit -; [rbp - 16] = fd -_start: - push rbp - mov rbp, rsp - sub rsp, 32 - push r14; int i - push r13 - xor r14, r14 ; i = 0 - ; open grace_kid.c - mov eax, 2 +; add_to_buff +%assign UID0 0 +%macro ADD_TO_BUFF 0 +%assign UID0 UID0 + 1 + ; r9d = buff_len + mov r9d, dword [rel buff_len] ; r9d = bufflen + + ; if buff_len >= BUFF_SIZE: flush + cmp r9d, BUFF_SIZE + jge .ADD_TO_BUFF_flush%[UID0] + +.ADD_TO_BUFF_add_char%[UID0]: + ; buffer[buff_len] = al + lea r10, [rel buffer] + add r10, r9 + mov byte [r10], al + + ;buff_len++ + inc dword [rel buff_len] + + ;return + jmp .ADD_TO_BUFF_ret%[UID0] + +.ADD_TO_BUFF_flush%[UID0]: + + push rdx + push rax + + ; ----- flush buff ----- + + cmp dword [rel buff_len], 0 ; if buff_len == 0: do not flush + jz .ADD_TO_BUFF_flush_done%[UID0] + + ; write(fd, buffer, buff_len) + mov eax, 1 + mov edi, [rel fd] + lea rsi, [rel buffer] + mov edx, [rel buff_len] + syscall + + ; buff_len = 0 + mov dword [rel buff_len], 0 + +.ADD_TO_BUFF_flush_done%[UID0]: + + ; ----- flush done ----- + + pop rax + pop rdx + + ; buff_len = 0 + xor r9d, r9d + + ; go back to add_char + jmp .ADD_TO_BUFF_add_char%[UID0] + +.ADD_TO_BUFF_ret%[UID0]: +%endmacro + +%assign UID1 0 +%macro INT8_TO_BUFF 0 +%assign UID1 UID1 + 1 + ; flag = 0 (nothing wrotten) + xor r8b, r8b + movzx eax, al + + ;hundreds + xor edx, edx + mov ecx, 100 + ;al = hundreds, edx = carry + div ecx + ; al = hundreds in ascii + add al, '0' + + ; do not write if hundreds == '0' + cmp al, '0' + je .no_hundreds%[UID1] + + ; add hundreds char to buff + ADD_TO_BUFF + + ; flag = 1 (writen) + mov r8b, 1 + +.no_hundreds%[UID1]: + ; eax = carry + mov eax, edx + +.tens%[UID1]: + xor edx, edx + mov ecx, 10 + ; al = tens, edx = unit + div ecx + + ; al = tens in ascii + add al, '0' + + ;if flags == 0 && al == '0': goto unit + cmp r8b, 0 + je .test_tens%[UID1] + jmp .skip%[UID1] + +.test_tens%[UID1]: + cmp al, '0' + je .no_tens%[UID1] + + +.skip%[UID1]: + ADD_TO_BUFF + mov r8b, 1 + +.no_tens%[UID1]: + ; al = units + mov al, dl + +.units%[UID1]: + add al, '0' + ADD_TO_BUFF +%endmacro + + +; main +; +; open Grace_kid.s [done] +; +; loop on src [done] +; if src[r14] != [done] +; ADD_TO_BUFF src[r14] [done] +; else [done] +; loop on src +; for each char print: ", " +; +; close Grace_kid.s [done] +; +; exit + +%macro QUINE 0 +_start: + + ;fd = open("Grace_kid, O_CREAT | O_RDWR | O_TRUNC, 0664) + mov rax, 2 lea rdi, [rel filename] mov rsi, [rel flags] - mov rdx, 0644o + mov rdx, 0664o syscall - cmp rax, 0 ; if -errno - jl .exit_failure - mov [rbp - 16], rax ; fd = open ret + mov [rel fd], rax - .loop: - ; if i > src_len + ;exit if fd < 0 + cmp rax, 0 + jl .exit + + ; r14 = 0 + xor r14, r14 +; while r14 != src_len +.print_src: cmp r14, src_len - jge .done ; break; + je .print_src_done - ;r13 = addr of src + i - lea r13, [rel src] - add r13, r14 + ; al = src[r14] + lea rsi, [rel src] + add rsi, r14 + movzx eax, byte [rsi] + + cmp al, 126 + je .escape_str + + ;buff[buff_len] = al (flush if needed) + ADD_TO_BUFF + + ; r14++ + inc r14 + + jmp .print_src +.print_src_done: + + +; flush remaining bytes if any +.done_writing: + ;if buff_len == 0: exit + mov eax, 0 + mov edx, [rel buff_len] + test edx, edx + jz .done + + ;write(fd, buffer, buff_len) + mov eax, 1 + mov edi, [rel fd] + lea rsi, [rel buffer] + syscall + + ; buff_len = 0 + mov dword [rel buff_len], 0 + xor rax, rax - cmp byte [r13], 126 - je .escape - ; write 1, r13, 1 - mov eax, 1 - mov rdi, [rbp - 16] - mov rsi, r13 - mov rdx, 1 - syscall - jmp .next_byte +.done: + ; if fd < 0: skip close + cmp [rel fd], 0 + jl .exit - .escape: - push r12 - xor r12, r12 ; j = 0 - .e_loop: - cmp r12, src_len - jge .escape_end + ; save rax + push rax - lea rax, [rel src] - add rax, r12 - mov al, [rax] - ; print number start - cmp al, 0 - jne .e_write_0 - ; n == 0 : write "0" and return - mov eax, 1 - mov rdi, [rbp - 16] - lea rsi, [rel zero_str] - mov rdx, 1 - syscall - jmp .prt_end - .e_write_0: - - mov dword [rbp - 4], 0 ; len = 0 - .prt_loop: - cmp al, 0 - jz .prt_done ; break if al == 1 - - ; 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 - - ; 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] - jmp .prt_loop - - .prt_done: - ; buffer holds digits least-significant first - ; most-significant digit is at rbp - 8 - (len - 1) = rbp - 7 - len - mov edx, [rbp - 4] ; edx = len - mov eax, 1 - mov rdi, [rbp - 16] - lea rsi, [rbp - 7] - sub rsi, rdx ; rsi = rbp - 7 - len - syscall - - .prt_end: - ; print number end - - inc r12 - cmp r12, src_len - jge .escape_end - - mov eax, 1 - mov rdi, [rbp - 16] - lea rsi, [rel sep] - mov rdx, 2 - syscall - - jmp .e_loop - .escape_end: - pop r12 - - .next_byte: - inc r14 ; ++i - jmp .loop - - .done: - - ; close fd - mov rdi, [rbp - 16] + ; close(fd) + mov rdi, [rel fd] mov eax, 3 syscall - mov rsp, rbp - pop rbp + ; restore rax + pop rax - mov eax, 60 ; SYS_exit - xor edi, edi ; code = 0 +.exit: + ; exit(rax) + mov rdi, rax + mov eax, 60 syscall - .exit_failure: - mov rsp, rbp - pop rbp - mov eax, 60 ; SYS_exit - mov edi, 1 ; code = 0 - syscall +.escape_str: + push r14 + ; r14 = 0 + xor r14, r14 + ; add "" + mov al, 34 + ADD_TO_BUFF + ADD_TO_BUFF + +; while r14 != len +.loop_escape: + cmp r14, src_len + je .escape_done + + mov al, 44 + ADD_TO_BUFF + mov al, 32 + ADD_TO_BUFF + + ; rsi = &src + r14 + lea rsi, [rel src] + add rsi, r14 + + ; al = *rsi + movzx eax, byte [rsi] + INT8_TO_BUFF + + inc r14 + jmp .loop_escape +.escape_done: + + pop r14 + inc r14 + jmp .print_src +%endmacro + +QUINE