最初コミット
This commit is contained in:
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
*.o
|
||||
*.core
|
||||
server
|
||||
12
Makefile
Normal file
12
Makefile
Normal file
@@ -0,0 +1,12 @@
|
||||
all:
|
||||
nasm -f elf64 main.s -o main.o
|
||||
ld main.o -o server
|
||||
|
||||
debug:
|
||||
nasm -f elf64 -g -F dwarf main.s -o main.o
|
||||
ld main.o -o server
|
||||
|
||||
clean:
|
||||
rm -rf main.o server
|
||||
|
||||
.PHONY: all debug clean
|
||||
53
file.s
Normal file
53
file.s
Normal file
@@ -0,0 +1,53 @@
|
||||
section .text
|
||||
|
||||
load_file:
|
||||
; ファイルの開く
|
||||
mov rax, 5 ; sys_open
|
||||
mov rdi, filename
|
||||
mov rsi, 0 ; O_RDONLY
|
||||
mov rdx, 0
|
||||
mov rax, 499 ; sys_openat
|
||||
; mov rax, 547
|
||||
; mov rdi, -100 ; AT_FDCWD
|
||||
; mov rsi, filename
|
||||
; mov rdx, 0 ; O_RDONLY
|
||||
; mov r10, 0 ; モード(見逃し)
|
||||
syscall
|
||||
|
||||
cmp rax, 0
|
||||
jl .fail
|
||||
mov [filefd], rax
|
||||
|
||||
; ファイルサイズの受け取り
|
||||
mov rax, 478 ; sys_lseek
|
||||
mov rdi, [filefd]
|
||||
xor rsi, rsi
|
||||
mov rdx, 2 ; SEEK_END
|
||||
syscall
|
||||
|
||||
mov [file_size], rax
|
||||
|
||||
; 初めからシーク
|
||||
mov rax, 478
|
||||
xor rsi, rsi
|
||||
mov rdx, 0 ; SEEK_SET
|
||||
syscall
|
||||
|
||||
; ファイルの全部の読み込み
|
||||
mov rax, 3 ; sys_read
|
||||
mov rdi, [filefd]
|
||||
mov rsi, file_buf
|
||||
mov rdx, [file_size]
|
||||
syscall
|
||||
|
||||
; ファイルを閉じる
|
||||
mov rax, 6 ; sys_close
|
||||
mov rdi, [filefd]
|
||||
syscall
|
||||
|
||||
xor rax, rax ; 成功
|
||||
ret
|
||||
|
||||
.fail:
|
||||
mov rax, -1
|
||||
ret
|
||||
139
main.s
Normal file
139
main.s
Normal file
@@ -0,0 +1,139 @@
|
||||
; このサーバーのコードははFreeBSD向けに書きました。
|
||||
; Linuxに実行するには、syscall番号を変更して下さい。
|
||||
section .data
|
||||
filename db "./www/index.html", 0x0
|
||||
at_fd dq -0x64
|
||||
|
||||
listen_msg db "サーバーは http://0.0.0.0:8000/ で実行中・・・", 0xa, 0x0
|
||||
listen_len equ $-listen_msg-1
|
||||
; 1101
|
||||
|
||||
http_header db "HTTP/1.1 200 OK", 0xd, 0xa
|
||||
db "Content-Type: text/html", 0xd, 0xa
|
||||
db "Connection: close", 0xd, 0xa
|
||||
db "Content-Length: "
|
||||
clen_str db " ", 0xd, 0xa, 0xd, 0xa, 0x0
|
||||
|
||||
notfound db "HTTP/1.1 404 Not Found", 0xd, 0xa,
|
||||
db "Content-Length: 0", 0xd, 0xa, 0xd, 0xa, 0x0
|
||||
|
||||
section .bss
|
||||
sock resq 0x1 ; サーバーソケット
|
||||
clientfd resq 0x1 ; クライアントソケット
|
||||
filefd resq 0x1
|
||||
file_size resb 0x400 ; HTMLファイルサイズ
|
||||
file_buf resb 0x20000 ; 128 KiB
|
||||
req_buf resb 0x1000 ; 4 KiB
|
||||
addr resb 0x10 ; sockaddr_in ストラクチャー
|
||||
|
||||
section .text
|
||||
%include "file.s"
|
||||
%include "u64todec.s"
|
||||
global _start
|
||||
|
||||
_start:
|
||||
mov rax, 4 ; sys_write
|
||||
mov rdi, 1 ; stdout
|
||||
mov rsi, listen_msg
|
||||
mov rdx, listen_len
|
||||
syscall
|
||||
|
||||
; ソケットの作成
|
||||
mov rax, 97 ; sys_socket
|
||||
mov rdi, 2 ; PF_INET
|
||||
mov rsi, 1 ; SOCK_STREAM
|
||||
mov rdx, 0 ; プロトコール
|
||||
syscall
|
||||
|
||||
cmp rax, 0
|
||||
jl error_exit
|
||||
mov [sock], rax
|
||||
|
||||
; 0.0.0.0:8000 にバインド
|
||||
mov word [addr], 2 ; sin_family = AF_INET
|
||||
mov word [addr+2], 0x401f ; sin_port = 8000 (ポート番号)、ネットワークのバイト列:0x1f40
|
||||
;mov dword [addr+4], 0x0100007f ; sin_addr = 127.0.0.1(リトルエンディアンで)
|
||||
mov dword [addr+4], 0 ; sin_addr = INADDR_ANY = 0.0.0.0
|
||||
mov qword [addr+8], 0 ; パッディング
|
||||
|
||||
; バインド
|
||||
mov rax, 104 ; sys_bind
|
||||
mov rdi, [sock]
|
||||
mov rsi, addr
|
||||
mov rdx, 0x10
|
||||
syscall
|
||||
|
||||
cmp rax, 0
|
||||
jne error_exit
|
||||
|
||||
; リッスン
|
||||
mov rax, 106 ; sys_listen
|
||||
mov rdi, [sock]
|
||||
mov rsi, 0xa ; バックログ
|
||||
syscall
|
||||
|
||||
cmp rax, 0
|
||||
jne error_exit
|
||||
|
||||
; HTMLファイルをメモリに読み込み(一回だけ)
|
||||
call load_file
|
||||
test rax, rax
|
||||
jnz error_exit ; ファイルを見つけなければ、エラーで終了する
|
||||
|
||||
accept_loop:
|
||||
; 接続の受け取り
|
||||
; mov rax, 30 ; sys_accept
|
||||
mov rax, 541 ; sys_accept4
|
||||
mov rdi, [sock]
|
||||
mov rsi, 0
|
||||
mov rdx, 0
|
||||
mov r10, 0 ; フラグ=0
|
||||
syscall
|
||||
|
||||
cmp rax, 0
|
||||
jl loop_continue
|
||||
mov [clientfd], rax
|
||||
|
||||
; リクエストの読み込み
|
||||
mov rax, 3 ; sys_read
|
||||
mov rdi, [clientfd]
|
||||
mov rsi, req_buf
|
||||
mov rdx, 0xfff
|
||||
syscall
|
||||
|
||||
; ヘッダーの送信
|
||||
; Content-Length文字から
|
||||
mov rax, [file_size]
|
||||
mov rdi, clen_str
|
||||
call u64_to_dec
|
||||
|
||||
mov rax, 4 ; sys_write
|
||||
mov rdi, [clientfd]
|
||||
mov rsi, http_header
|
||||
mov rdx, clen_str + 20 - http_header ; ヘッダーの長さ(CRLF含む)
|
||||
syscall
|
||||
|
||||
; ファイル内容の送信
|
||||
mov rax, 4 ; sys_write
|
||||
mov rdi, [clientfd]
|
||||
mov rsi, file_buf
|
||||
mov rdx, [file_size]
|
||||
syscall
|
||||
|
||||
; クライアントの終了
|
||||
mov rax, 6 ; sys_close
|
||||
mov rdi, [clientfd]
|
||||
syscall
|
||||
|
||||
loop_continue:
|
||||
jmp accept_loop
|
||||
|
||||
error_exit:
|
||||
mov rax, 1 ; sys_exit
|
||||
mov rdi, 1
|
||||
syscall
|
||||
|
||||
; 終了(CTRL+C)
|
||||
; mov rax, 1 ; sys_exit
|
||||
; xor rdi, rdi
|
||||
; syscall
|
||||
33
u64todec.s
Normal file
33
u64todec.s
Normal file
@@ -0,0 +1,33 @@
|
||||
section .text
|
||||
|
||||
u64_to_dec:
|
||||
mov rcx, 10
|
||||
mov r8, rdi
|
||||
lea rdi, [rdi + 0x13]
|
||||
|
||||
test rax, rax
|
||||
jnz .convert
|
||||
mov byte [rdi], '0'
|
||||
dec rdi
|
||||
jmp .pad
|
||||
|
||||
.convert:
|
||||
xor rdx, rdx
|
||||
div rcx
|
||||
add dl, '0'
|
||||
mov [rdi], dl
|
||||
dec rdi
|
||||
test rax, rax
|
||||
jnz .convert
|
||||
|
||||
.pad:
|
||||
inc rdi
|
||||
.pad_loop:
|
||||
cmp rdi, r8
|
||||
jbe .done
|
||||
mov byte [rdi], ' '
|
||||
inc rdi
|
||||
jb .pad_loop
|
||||
|
||||
.done:
|
||||
ret
|
||||
12
www/index.html
Normal file
12
www/index.html
Normal file
@@ -0,0 +1,12 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ja">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<link rel="stylesheet" type="text/css" href="/style.css" />
|
||||
<title>ささ</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>ささ</h1>
|
||||
</body>
|
||||
</html>
|
||||
4
www/style.css
Normal file
4
www/style.css
Normal file
@@ -0,0 +1,4 @@
|
||||
body {
|
||||
background-color: #232023;
|
||||
color: #fcfcfc;
|
||||
}
|
||||
Reference in New Issue
Block a user