diff --git a/Makefile b/Makefile index e079547..50d3b67 100644 --- a/Makefile +++ b/Makefile @@ -1,14 +1,16 @@ SRC_DIR = src -COLLEEN_SRCS = $(SRC_DIR)/Colleen.c -GRACE_SRCS = $(SRC_DIR)/Grace.c -SULLY_SRCS = $(SRC_DIR)/Sully.c +COLLEEN_SRCS = $(SRC_DIR)/Colleen/Colleen.c +GRACE_SRCS = $(SRC_DIR)/Grace/Grace.c +SULLY_SRCS = $(SRC_DIR)/Sully/Sully.c COLLEEN = Colleen GRACE = Grace SULLY = Sully -COLLEEN_ASM_SRCS = $(SRC_DIR)/Colleen.s +COLLEEN_ASM_SRCS = $(SRC_DIR)/Colleen/Colleen.s COLLEEN_ASM = Colleen_asm +GRACE_ASM_SRCS = $(SRC_DIR)/Grace/Grace.s +GRACE_ASM = Grace_asm NASM = nasm NASMFLAGS = -f elf64 LD = ld @@ -33,9 +35,10 @@ SULLY_OBJS = $(SULLY_SRCS:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o) SULLY_DEPS = $(SULLY_OBJS:.o=.d) COLLEEN_ASM_OBJS = $(COLLEEN_ASM_SRCS:$(SRC_DIR)/%.s=$(OBJ_DIR)/%.asm.o) +GRACE_ASM_OBJS = $(GRACE_ASM_SRCS:$(SRC_DIR)/%.s=$(OBJ_DIR)/%.asm.o) .PHONY: all -all: $(COLLEEN) $(GRACE) $(SULLY) $(COLLEEN_ASM) +all: $(COLLEEN) $(GRACE) $(SULLY) $(COLLEEN_ASM) $(GRACE_ASM) $(GRACE): $(GRACE_OBJS) $(CC) $(LDFLAGS) -o $@ $^ @@ -49,6 +52,9 @@ $(SULLY): $(SULLY_OBJS) $(COLLEEN_ASM): $(COLLEEN_ASM_OBJS) $(LD) -o $@ $^ +$(GRACE_ASM): $(GRACE_ASM_OBJS) + $(LD) -o $@ $^ + $(OBJ_DIR)/%.o: $(SRC_DIR)/%.c @mkdir -p $(dir $@) $(CC) $(CPPFLAGS) $(CFLAGS) -MMD -MP -c $< -o $@ @@ -67,7 +73,7 @@ clean: .PHONY: fclean fclean: clean - $(RM) $(COLLEEN) $(GRACE) $(SULLY) $(COLLEEN_ASM) + $(RM) $(COLLEEN) $(GRACE) $(SULLY) $(COLLEEN_ASM) $(GRACE_ASM) .PHONY: re re: fclean diff --git a/src/Colleen.s b/src/Colleen.s deleted file mode 100644 index c226743..0000000 --- a/src/Colleen.s +++ /dev/null @@ -1,148 +0,0 @@ -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, 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" - -section .text - -;void putnumber(uint8_t n) -;{ -; char buffer[3]; -; int len; -; int i; -; -; if (n == 0) -; { -; write(1, "0", 1); -; return ; -; } -; len = 0; -; while (n > 0) -; { -; buffer[len] = (n % 10); - ;buffer[len] += '0' -; n /= 10; -; len++; -; } -; i = len - 1; -; write(1, &buffer[i], len); -print_number: - push rbp - mov rbp, rsp - 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] - mov rdx, 1 - syscall - jmp .end - .e_write_0: - - mov dword [rbp - 4], 0 - .loop: - cmp al, 0 - jz .done - - ; 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 .loop - - .done: - ; 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 - 7] - sub rsi, rdx ; rsi = rbp - 7 - len - syscall - - .end: - mov rsp, rbp - pop rbp - ret - -_start: - push r14; int i - push r13 - xor r14, r14 ; i = 0 - - .loop: - ; if i > src_len - cmp r14, src_len - jge .done ; break; - - ;r13 = addr of src + i - lea r13, [rel src] - add r13, r14 - - cmp byte [r13], 126 - je .escape - - - ; write 1, r13, 1 - mov eax, 1 - mov rdi, 1 - mov rsi, r13 - mov rdx, 1 - syscall - jmp .next_byte - - .escape: - push r12 - xor r12, r12 ; j = 0 - .e_loop: - 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 - lea rsi, [rel sep] - mov rdx, 2 - syscall - - jmp .e_loop - .escape_end: - pop r12 - - .next_byte: - inc r14 ; ++i - jmp .loop - - .done: - mov eax, 60 ; SYS_exit - xor edi, edi ; code = 0 - syscall diff --git a/src/Colleen.c b/src/Colleen/Colleen.c similarity index 100% rename from src/Colleen.c rename to src/Colleen/Colleen.c diff --git a/src/Colleen/Colleen.s b/src/Colleen/Colleen.s new file mode 100644 index 0000000..8240ce7 --- /dev/null +++ b/src/Colleen/Colleen.s @@ -0,0 +1,148 @@ +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, 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, 9, 9, 9, 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, 9, 9, 61, 32, 108, 101, 110, 32, 40, 100, 119, 111, 114, 100, 41, 10, 9, 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, 9, 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, 9, 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, 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, 32, 59, 32, 108, 101, 110, 32, 61, 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, 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, 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, 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, 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, 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, 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, 59, 32, 83, 89, 83, 95, 101, 120, 105, 116, 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 +src_len: equ $ - src +sep: db ", " +zero_str: db "0" + +section .text + +;void putnumber(uint8_t n) +;{ +; char buffer[3]; +; int len; +; int i; +; +; if (n == 0) +; { +; write(1, "0", 1); +; return ; +; } +; len = 0; +; while (n > 0) +; { +; buffer[len] = (n % 10); + ;buffer[len] += '0' +; n /= 10; +; len++; +; } +; i = len - 1; +; write(1, &buffer[i], len); +print_number: + push rbp + mov rbp, rsp + 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] + mov rdx, 1 + syscall + jmp .end + .e_write_0: + + mov dword [rbp - 4], 0 ; len = 0 + .loop: + cmp al, 0 + jz .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 .loop + + .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, 1 + lea rsi, [rbp - 7] + sub rsi, rdx ; rsi = rbp - 7 - len + syscall + + .end: + mov rsp, rbp + pop rbp + ret + +_start: + push r14; int i + push r13 + xor r14, r14 ; i = 0 + + .loop: + ; if i > src_len + cmp r14, src_len + jge .done ; break; + + ;r13 = addr of src + i + lea r13, [rel src] + add r13, r14 + + cmp byte [r13], 126 + je .escape + + + ; write 1, r13, 1 + mov eax, 1 + mov rdi, 1 + mov rsi, r13 + mov rdx, 1 + syscall + jmp .next_byte + + .escape: + push r12 + xor r12, r12 ; j = 0 + .e_loop: + 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 + lea rsi, [rel sep] + mov rdx, 2 + syscall + + jmp .e_loop + .escape_end: + pop r12 + + .next_byte: + inc r14 ; ++i + jmp .loop + + .done: + mov eax, 60 ; SYS_exit + xor edi, edi ; code = 0 + syscall diff --git a/src/Colleen.sh b/src/Colleen/Colleen.sh similarity index 100% rename from src/Colleen.sh rename to src/Colleen/Colleen.sh diff --git a/src/Grace.c b/src/Grace/Grace.c similarity index 100% rename from src/Grace.c rename to src/Grace/Grace.c diff --git a/src/Grace/Grace.s b/src/Grace/Grace.s new file mode 100644 index 0000000..8240ce7 --- /dev/null +++ b/src/Grace/Grace.s @@ -0,0 +1,148 @@ +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, 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, 9, 9, 9, 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, 9, 9, 61, 32, 108, 101, 110, 32, 40, 100, 119, 111, 114, 100, 41, 10, 9, 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, 9, 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, 9, 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, 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, 32, 59, 32, 108, 101, 110, 32, 61, 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, 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, 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, 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, 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, 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, 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, 59, 32, 83, 89, 83, 95, 101, 120, 105, 116, 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 +src_len: equ $ - src +sep: db ", " +zero_str: db "0" + +section .text + +;void putnumber(uint8_t n) +;{ +; char buffer[3]; +; int len; +; int i; +; +; if (n == 0) +; { +; write(1, "0", 1); +; return ; +; } +; len = 0; +; while (n > 0) +; { +; buffer[len] = (n % 10); + ;buffer[len] += '0' +; n /= 10; +; len++; +; } +; i = len - 1; +; write(1, &buffer[i], len); +print_number: + push rbp + mov rbp, rsp + 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] + mov rdx, 1 + syscall + jmp .end + .e_write_0: + + mov dword [rbp - 4], 0 ; len = 0 + .loop: + cmp al, 0 + jz .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 .loop + + .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, 1 + lea rsi, [rbp - 7] + sub rsi, rdx ; rsi = rbp - 7 - len + syscall + + .end: + mov rsp, rbp + pop rbp + ret + +_start: + push r14; int i + push r13 + xor r14, r14 ; i = 0 + + .loop: + ; if i > src_len + cmp r14, src_len + jge .done ; break; + + ;r13 = addr of src + i + lea r13, [rel src] + add r13, r14 + + cmp byte [r13], 126 + je .escape + + + ; write 1, r13, 1 + mov eax, 1 + mov rdi, 1 + mov rsi, r13 + mov rdx, 1 + syscall + jmp .next_byte + + .escape: + push r12 + xor r12, r12 ; j = 0 + .e_loop: + 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 + lea rsi, [rel sep] + mov rdx, 2 + syscall + + jmp .e_loop + .escape_end: + pop r12 + + .next_byte: + inc r14 ; ++i + jmp .loop + + .done: + mov eax, 60 ; SYS_exit + xor edi, edi ; code = 0 + syscall diff --git a/src/Grace.sh b/src/Grace/Grace.sh similarity index 100% rename from src/Grace.sh rename to src/Grace/Grace.sh diff --git a/src/Sully.c b/src/Sully/Sully.c similarity index 100% rename from src/Sully.c rename to src/Sully/Sully.c diff --git a/src/Sully.sh b/src/Sully/Sully.sh similarity index 100% rename from src/Sully.sh rename to src/Sully/Sully.sh