Compare commits

..

No commits in common. "e3705a5d5cf88731371da76194bdf59706eda170" and "b7ac106623ebcfc82aa5b067c0cf7a318803aae3" have entirely different histories.

4 changed files with 19 additions and 37 deletions

View File

@ -1,5 +1,5 @@
server: link.ld main.o func.o
gcc -T link.ld main.o func.o -o server -nostdlib -static
server: main.o func.o
gcc 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
.section .rodata
.data
errstr: .ascii "error happened\n"
.set errstr_len, .-errstr

18
link.ld
View File

@ -1,18 +0,0 @@
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
.section .rodata
.data
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,6 +29,9 @@ 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
@ -41,9 +44,6 @@ 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, server_socket
movq %rax, s
movq $__NR_setsockopt, %rax
movq server_socket, %rdi
movq s, %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 server_socket, %rdi
movq s, %rdi
movq $myaddr, %rsi
movq $myaddr_len, %rdx
syscall
@ -80,7 +80,7 @@ _start:
jnz error
movq $__NR_listen, %rax
movq server_socket, %rdi
movq s, %rdi
movq $8, %rsi
syscall
test %rax, %rax
@ -88,14 +88,14 @@ _start:
loop:
movq $__NR_accept, %rax
movq server_socket, %rdi
movq s, %rdi
movq $0, %rsi
movq $0, %rdx
movq $0, %r10
syscall
cmp $-1, %rax
jz error
movq %rax, connection_socket
movq %rax, s2
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 connection_socket, %rdi
movq s2, %rdi
syscall
test %rax, %rax
jnz error
@ -124,7 +124,7 @@ loop:
exit:
movq $__NR_close, %rax
movq server_socket, %rdi
movq s, %rdi
syscall
test %rax, %rax
jnz error
@ -148,12 +148,12 @@ error:
child:
/* we're in the child if we reach this line */
movq connection_socket, %rdi
movq connection_socket, %rsi
movq s2, %rdi
movq s2, %rsi
call passthru
movq $__NR_close, %rax
movq connection_socket, %rdi
movq s2, %rdi
syscall
movq $__NR_exit, %rax