generated from loic/c-template
feat: Sully.s buffer functions
This commit is contained in:
parent
5d612f7e2a
commit
c9fd8c9bf3
2 changed files with 126 additions and 2 deletions
10
Makefile
10
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
|
||||
|
|
|
|||
118
src/Sully/Sully.s
Normal file
118
src/Sully/Sully.s
Normal 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
|
||||
Loading…
Add table
Reference in a new issue