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
gcc main.o func.o -o server -nostdlib -static
server: link.ld main.o func.o
gcc -T link.ld main.o func.o -o server -nostdlib -static
main.o: main.S
gcc -c main.S

2
func.S
View File

@ -13,7 +13,7 @@
#define AF_INET PF_INET
#define SOCK_STREAM 1
.data
.section .rodata
errstr: .ascii "error happened\n"
.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;
}

32
main.S
View File

@ -14,7 +14,7 @@
#define PORT 20335
.data
.section .rodata
greeting:
.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"
@ -29,14 +29,11 @@ message: .ascii "Client connected\n"
errstr: .ascii "Error happened\n"
.set errstr_len, .-errstr
s: .quad 0
s2: .quad 0
true_val: .quad 1
.set true_val_len, .-true_val
myaddr:
.hword AF_INET
.hword AF_INET
port: .byte (PORT >> 8) & 0xFF, (PORT & 0xFF)
addr: .byte 0, 0, 0, 0
.set myaddr_len, 16
@ -44,6 +41,9 @@ myaddr:
.extern passthru
.extern write_buf
#define server_socket %rbx
#define connection_socket %r12
.text
.global _start
_start:
@ -59,10 +59,10 @@ _start:
syscall
cmp $-1, %rax
jz error
movq %rax, s
movq %rax, server_socket
movq $__NR_setsockopt, %rax
movq s, %rdi
movq server_socket, %rdi
movq $SOL_SOCKET, %rsi
movq $SO_REUSEADDR, %rdx
movq $true_val, %r10
@ -72,7 +72,7 @@ _start:
jnz error
movq $__NR_bind, %rax
movq s, %rdi
movq server_socket, %rdi
movq $myaddr, %rsi
movq $myaddr_len, %rdx
syscall
@ -80,7 +80,7 @@ _start:
jnz error
movq $__NR_listen, %rax
movq s, %rdi
movq server_socket, %rdi
movq $8, %rsi
syscall
test %rax, %rax
@ -88,14 +88,14 @@ _start:
loop:
movq $__NR_accept, %rax
movq s, %rdi
movq server_socket, %rdi
movq $0, %rsi
movq $0, %rdx
movq $0, %r10
syscall
cmp $-1, %rax
jz error
movq %rax, s2
movq %rax, connection_socket
movq $STDOUT, %rdi
movq $message, %rsi
@ -116,7 +116,7 @@ loop:
/* we're in the parent if we reach this line */
movq $__NR_close, %rax
movq s2, %rdi
movq connection_socket, %rdi
syscall
test %rax, %rax
jnz error
@ -124,7 +124,7 @@ loop:
exit:
movq $__NR_close, %rax
movq s, %rdi
movq server_socket, %rdi
syscall
test %rax, %rax
jnz error
@ -148,12 +148,12 @@ error:
child:
/* we're in the child if we reach this line */
movq s2, %rdi
movq s2, %rsi
movq connection_socket, %rdi
movq connection_socket, %rsi
call passthru
movq $__NR_close, %rax
movq s2, %rdi
movq connection_socket, %rdi
syscall
movq $__NR_exit, %rax