feat: Sully.s buffer functions

This commit is contained in:
lohhiiccc 2026-06-01 18:58:18 +02:00
parent 5d612f7e2a
commit c9fd8c9bf3
2 changed files with 126 additions and 2 deletions

View file

@ -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

118
src/Sully/Sully.s Normal file
View file

@ -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