Compare commits

...

3 Commits

Author SHA1 Message Date
e3705a5d5c Support data in the pico mode 2024-08-12 00:24:29 +03:00
ae54bb7b92 All in the name of size! 2024-08-12 00:16:09 +03:00
8be7bb8718 Use rodata 2024-08-11 23:27:02 +03:00
4 changed files with 37 additions and 19 deletions

View File

@ -1,5 +1,5 @@
server: main.o func.o server: link.ld main.o func.o
gcc main.o func.o -o server -nostdlib -static gcc -T link.ld main.o func.o -o server -nostdlib -static
main.o: main.S main.o: main.S
gcc -c main.S gcc -c main.S

2
func.S
View File

@ -13,7 +13,7 @@
#define AF_INET PF_INET #define AF_INET PF_INET
#define SOCK_STREAM 1 #define SOCK_STREAM 1
.data .section .rodata
errstr: .ascii "error happened\n" errstr: .ascii "error happened\n"
.set errstr_len, .-errstr .set errstr_len, .-errstr

18
link.ld Normal file
View File

@ -0,0 +1,18 @@
ENTRY(_start)
SECTIONS {
. = 4M;
. = . + SIZEOF_HEADERS;
.text : { *(.text) } :text
.rodata : { *(.rodata) } :text
. += 4K;
.data : { *(.data) } :data
. = ALIGN(4K);
.bss : { *(COMMON) *(.bss) } :bss
}
PHDRS {
text PT_LOAD FILEHDR PHDRS FLAGS(5);
data PT_LOAD FLAGS(6);
bss PT_LOAD;
}

30
main.S
View File

@ -14,7 +14,7 @@
#define PORT 20335 #define PORT 20335
.data .section .rodata
greeting: greeting:
.ascii "Welcome to the minimalistic echo server!\n" .ascii "Welcome to the minimalistic echo server!\n"
.ascii "It is written in pure assembly, and it don't use the standard library, only raw system calls.\n" .ascii "It is written in pure assembly, and it don't use the standard library, only raw system calls.\n"
@ -29,9 +29,6 @@ message: .ascii "Client connected\n"
errstr: .ascii "Error happened\n" errstr: .ascii "Error happened\n"
.set errstr_len, .-errstr .set errstr_len, .-errstr
s: .quad 0
s2: .quad 0
true_val: .quad 1 true_val: .quad 1
.set true_val_len, .-true_val .set true_val_len, .-true_val
@ -44,6 +41,9 @@ myaddr:
.extern passthru .extern passthru
.extern write_buf .extern write_buf
#define server_socket %rbx
#define connection_socket %r12
.text .text
.global _start .global _start
_start: _start:
@ -59,10 +59,10 @@ _start:
syscall syscall
cmp $-1, %rax cmp $-1, %rax
jz error jz error
movq %rax, s movq %rax, server_socket
movq $__NR_setsockopt, %rax movq $__NR_setsockopt, %rax
movq s, %rdi movq server_socket, %rdi
movq $SOL_SOCKET, %rsi movq $SOL_SOCKET, %rsi
movq $SO_REUSEADDR, %rdx movq $SO_REUSEADDR, %rdx
movq $true_val, %r10 movq $true_val, %r10
@ -72,7 +72,7 @@ _start:
jnz error jnz error
movq $__NR_bind, %rax movq $__NR_bind, %rax
movq s, %rdi movq server_socket, %rdi
movq $myaddr, %rsi movq $myaddr, %rsi
movq $myaddr_len, %rdx movq $myaddr_len, %rdx
syscall syscall
@ -80,7 +80,7 @@ _start:
jnz error jnz error
movq $__NR_listen, %rax movq $__NR_listen, %rax
movq s, %rdi movq server_socket, %rdi
movq $8, %rsi movq $8, %rsi
syscall syscall
test %rax, %rax test %rax, %rax
@ -88,14 +88,14 @@ _start:
loop: loop:
movq $__NR_accept, %rax movq $__NR_accept, %rax
movq s, %rdi movq server_socket, %rdi
movq $0, %rsi movq $0, %rsi
movq $0, %rdx movq $0, %rdx
movq $0, %r10 movq $0, %r10
syscall syscall
cmp $-1, %rax cmp $-1, %rax
jz error jz error
movq %rax, s2 movq %rax, connection_socket
movq $STDOUT, %rdi movq $STDOUT, %rdi
movq $message, %rsi movq $message, %rsi
@ -116,7 +116,7 @@ loop:
/* we're in the parent if we reach this line */ /* we're in the parent if we reach this line */
movq $__NR_close, %rax movq $__NR_close, %rax
movq s2, %rdi movq connection_socket, %rdi
syscall syscall
test %rax, %rax test %rax, %rax
jnz error jnz error
@ -124,7 +124,7 @@ loop:
exit: exit:
movq $__NR_close, %rax movq $__NR_close, %rax
movq s, %rdi movq server_socket, %rdi
syscall syscall
test %rax, %rax test %rax, %rax
jnz error jnz error
@ -148,12 +148,12 @@ error:
child: child:
/* we're in the child if we reach this line */ /* we're in the child if we reach this line */
movq s2, %rdi movq connection_socket, %rdi
movq s2, %rsi movq connection_socket, %rsi
call passthru call passthru
movq $__NR_close, %rax movq $__NR_close, %rax
movq s2, %rdi movq connection_socket, %rdi
syscall syscall
movq $__NR_exit, %rax movq $__NR_exit, %rax