From c9fd8c9bf3d73f18daa361466f499cc2a86278c0 Mon Sep 17 00:00:00 2001 From: lohhiiccc Date: Mon, 1 Jun 2026 18:58:18 +0200 Subject: [PATCH] feat: Sully.s buffer functions --- Makefile | 10 +++- src/Sully/Sully.s | 118 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 126 insertions(+), 2 deletions(-) create mode 100644 src/Sully/Sully.s diff --git a/Makefile b/Makefile index 50d3b67..20c7574 100644 --- a/Makefile +++ b/Makefile @@ -11,6 +11,8 @@ COLLEEN_ASM_SRCS = $(SRC_DIR)/Colleen/Colleen.s COLLEEN_ASM = Colleen_asm GRACE_ASM_SRCS = $(SRC_DIR)/Grace/Grace.s GRACE_ASM = Grace_asm +SULLY_ASM_SRCS = $(SRC_DIR)/Sully/Sully.s +SULLY_ASM = Sully_asm NASM = nasm NASMFLAGS = -f elf64 LD = ld @@ -36,9 +38,10 @@ 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) +SULLY_ASM_OBJS = $(SULLY_ASM_SRCS:$(SRC_DIR)/%.s=$(OBJ_DIR)/%.asm.o) .PHONY: all -all: $(COLLEEN) $(GRACE) $(SULLY) $(COLLEEN_ASM) $(GRACE_ASM) +all: $(COLLEEN) $(GRACE) $(SULLY) $(COLLEEN_ASM) $(GRACE_ASM) $(SULLY_ASM) $(GRACE): $(GRACE_OBJS) $(CC) $(LDFLAGS) -o $@ $^ @@ -55,6 +58,9 @@ $(COLLEEN_ASM): $(COLLEEN_ASM_OBJS) $(GRACE_ASM): $(GRACE_ASM_OBJS) $(LD) -o $@ $^ +$(SULLY_ASM): $(SULLY_ASM_OBJS) + $(LD) -o $@ $^ + $(OBJ_DIR)/%.o: $(SRC_DIR)/%.c @mkdir -p $(dir $@) $(CC) $(CPPFLAGS) $(CFLAGS) -MMD -MP -c $< -o $@ @@ -73,7 +79,7 @@ clean: .PHONY: fclean fclean: clean - $(RM) $(COLLEEN) $(GRACE) $(SULLY) $(COLLEEN_ASM) $(GRACE_ASM) + $(RM) $(COLLEEN) $(GRACE) $(SULLY) $(COLLEEN_ASM) $(GRACE_ASM) $(SULLY) .PHONY: re re: fclean diff --git a/src/Sully/Sully.s b/src/Sully/Sully.s new file mode 100644 index 0000000..ad0801f --- /dev/null +++ b/src/Sully/Sully.s @@ -0,0 +1,118 @@ +global _start + +section .rodata +src: db "Hello world", 0 +src_len: equ $ - src +sep: db ", " +zero_str: db "0" +flags: dq 578 +i: db 5 + "0" + +section .bss +%define BUFF_SIZE 8 + +align BUFF_SIZE +buffer: resb BUFF_SIZE + +section .data +fd: dq 1 +buff_len: dd 0 +filename: db "Sully_x.s", 0 + +section .text + +%macro EXIT 1 + mov rdi, %1 + mov eax, 60 ; SYS_EXIT + syscall +%endmacro + +open_sully: + mov al, byte [rel i] ; load i in al + mov byte [rel filename + 6], al ; filename[6] = al + + mov rax, 2 ; SYS_OPEN + lea rdi, [rel filename] ; set filename + mov rsi, [rel flags] ; set flags + mov rdx, 0664o ; set perm + syscall + cmp rax, 0 ; if -errno + jl .done + mov [rel fd], rax ; fd = open(filename, flags, 0644) + .done: + ret + +flush_buff: + cmp [rel buff_len], 0 + jz .done + mov eax, 1 ; SYS_WRITE + mov edi, [rel fd] ; set fd + lea rsi, [rel buffer] ; set addr + mov edx, [rel buff_len] ; set len + syscall ; write( fd, addr, len ) + mov dword [rel buff_len], 0 ; buff_len = 0 + .done: + ret + + +; param: al = byte to add +add_to_buff: + mov r9d, dword [rel buff_len] ; r9d = buff_len + cmp r9d, BUFF_SIZE; if buff_len >= BUFF_SIZE + jge .flush + + .add_char: + lea r10, [rel buffer] ; r10 = &buffer + add r10, r9 ; r10 += buff_len + mov byte [r10], al; buffer[buff_len] = al + + inc dword [rel buff_len] ; ++buff_len + ret + + .flush: + push rax ; save char + call flush_buff + pop rax ; restor char + xor r9d, r9d ; sync r9d with buff_len + jmp .add_char + + +_start: + ;mov dword [rel buff_len], 1 + ;mov byte [rel buffer], 126 + ;call flush_buff + + call open_sully + cmp rax, 0 + jl .exit ; if -errno + + push r14; int i + xor r14, r14 ; i = 0 + ; while r14 (i) <= src_len + .loop: + cmp r14, src_len + jge .ldone + + ; move src[r14] in al + lea rsi, [rel src] + add rsi, r14 + movzx eax, byte [rsi] + + ; add al to buff + call add_to_buff + + inc r14 + jmp .loop + .ldone: + pop r14; release i + + call flush_buff + + + ; close(fd) + mov rdi, [rel fd] + mov eax, 3 + syscall + + .exit: + EXIT rax