echo-server/main.S
2016-02-21 00:19:42 +03:00

120 lines
1.7 KiB
ArmAsm

.code64
#include <asm/unistd.h>
#include <asm/socket.h>
#define STDIN 0
#define STDOUT 1
#define STDERR 2
#define PF_INET 2
#define AF_INET PF_INET
#define SOCK_STREAM 1
#define PORT 20335
.data
greeting: .ascii "Socket test!\n"
.set greeting_len, .-greeting
bye: .ascii "Sockets tested!\n"
.set bye_len, .-bye
errstr: .ascii "Error happened\n"
.set errstr_len, .-errstr
s: .quad 0
true_val: .quad 1
.set true_val_len, .-true_val
myaddr:
.hword AF_INET
port: .byte (PORT >> 8) & 0xFF, (PORT & 0xFF)
addr: .byte 0, 0, 0, 0
.set myaddr_len, 16
.extern passthru
.extern write_buf
.text
.global _start
_start:
movq $STDERR, %rdi
movq $greeting, %rsi
movq $greeting_len, %rdx
call write_buf
movq $__NR_socket, %rax
movq $PF_INET, %rdi
movq $SOCK_STREAM, %rsi
movq $0, %rdx
syscall
cmp $-1, %rax
jz error
movq %rax, s
movq $__NR_setsockopt, %rax
movq s, %rdi
movq $SOL_SOCKET, %rsi
movq $SO_REUSEADDR, %rdx
movq $true_val, %r10
movq $true_val_len, %r8
syscall
test %rax, %rax
jnz error
movq $__NR_bind, %rax
movq s, %rdi
movq $myaddr, %rsi
movq $myaddr_len, %rdx
syscall
test %rax, %rax
jnz error
movq $__NR_listen, %rax
movq s, %rdi
movq $8, %rsi
syscall
test %rax, %rax
jnz error
movq $__NR_accept, %rax
movq s, %rdi
movq $0, %rsi
movq $0, %rdx
movq $0, %r10
syscall
cmp $-1, %rax
jz error
test %rax, %rax
jz error
movq %rax, %rdi
movq $STDOUT, %rsi
call passthru
movq $STDERR, %rdi
movq $bye, %rsi
movq $bye_len, %rdx
call write_buf
exit:
movq $__NR_close, %rax
movq s, %rdi
syscall
_exit:
movq $__NR_exit, %rax
movq $0, %rdi
syscall
movq $0, 0
error:
movq $__NR_write, %rax
movq $STDERR, %rdi
movq $errstr, %rsi
movq $errstr_len, %rdx
syscall
jmp _exit