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
|
COLLEEN_ASM = Colleen_asm
|
||||||
GRACE_ASM_SRCS = $(SRC_DIR)/Grace/Grace.s
|
GRACE_ASM_SRCS = $(SRC_DIR)/Grace/Grace.s
|
||||||
GRACE_ASM = Grace_asm
|
GRACE_ASM = Grace_asm
|
||||||
|
SULLY_ASM_SRCS = $(SRC_DIR)/Sully/Sully.s
|
||||||
|
SULLY_ASM = Sully_asm
|
||||||
NASM = nasm
|
NASM = nasm
|
||||||
NASMFLAGS = -f elf64
|
NASMFLAGS = -f elf64
|
||||||
LD = ld
|
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)
|
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)
|
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
|
.PHONY: all
|
||||||
all: $(COLLEEN) $(GRACE) $(SULLY) $(COLLEEN_ASM) $(GRACE_ASM)
|
all: $(COLLEEN) $(GRACE) $(SULLY) $(COLLEEN_ASM) $(GRACE_ASM) $(SULLY_ASM)
|
||||||
|
|
||||||
$(GRACE): $(GRACE_OBJS)
|
$(GRACE): $(GRACE_OBJS)
|
||||||
$(CC) $(LDFLAGS) -o $@ $^
|
$(CC) $(LDFLAGS) -o $@ $^
|
||||||
|
|
@ -55,6 +58,9 @@ $(COLLEEN_ASM): $(COLLEEN_ASM_OBJS)
|
||||||
$(GRACE_ASM): $(GRACE_ASM_OBJS)
|
$(GRACE_ASM): $(GRACE_ASM_OBJS)
|
||||||
$(LD) -o $@ $^
|
$(LD) -o $@ $^
|
||||||
|
|
||||||
|
$(SULLY_ASM): $(SULLY_ASM_OBJS)
|
||||||
|
$(LD) -o $@ $^
|
||||||
|
|
||||||
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c
|
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c
|
||||||
@mkdir -p $(dir $@)
|
@mkdir -p $(dir $@)
|
||||||
$(CC) $(CPPFLAGS) $(CFLAGS) -MMD -MP -c $< -o $@
|
$(CC) $(CPPFLAGS) $(CFLAGS) -MMD -MP -c $< -o $@
|
||||||
|
|
@ -73,7 +79,7 @@ clean:
|
||||||
|
|
||||||
.PHONY: fclean
|
.PHONY: fclean
|
||||||
fclean: clean
|
fclean: clean
|
||||||
$(RM) $(COLLEEN) $(GRACE) $(SULLY) $(COLLEEN_ASM) $(GRACE_ASM)
|
$(RM) $(COLLEEN) $(GRACE) $(SULLY) $(COLLEEN_ASM) $(GRACE_ASM) $(SULLY)
|
||||||
|
|
||||||
.PHONY: re
|
.PHONY: re
|
||||||
re: fclean
|
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