122Byte の Web サーバ
なんとなく小さい Web サーバを書いてみました。 Web サーバというかどんなリクエストでも固定応答するだけ。
例のごとく 58Byte Hello を参考に。まだ縮むと思うけど飽きた。
BITS 32 ORG 0 DB 0x7F ; e_ident entry: inc ebp ; e_ident 'E' dec esp ; e_ident 'L' inc esi ; e_ident 'F' mov dl, 102 ; socketcall inc ebx ; socket(1) lea esp, [ecx+12] push byte 0 push byte 1 push byte 2 dw 2 ; EAX is broken dw 3 hige: xchg eax, edx int 0x80 inc ebx ; bind(2) add [eax], eax ; e_entry ; p_type add [eax], al sbb [eax], al ; e_phoff ; p_offset add [eax], al sbb [eax], al ; e_shoff ; p_vaddr add [eax], al fuga: pop edi pop edi jmp short hoge DD 0x00210000-0x18 ; e_ehsize ; p_filesz ; e_phentsize hello: DD 0x00210001 ; e_phnum ; p_memsz ; e_shentsize hoge: pop edi push byte 16 ; mov [ecx+8], 16 push byte addr ; mov [ecx+4], addr mov [ecx], eax mov al, 102 int 0x80 pop edi ; esp+=4, edi <= addr push esi ; mov [ecx+4], esi(1) mov bl, 4 ; listen(4) mov al, 102 webserv: int 0x80 inc ebx ; accept(5) mov al, 102 xor ecx, ecx pop edx push edi ; edi == addr int 0x80 ; mov al, 4 ; write dec ebx ; 4(fd) mov cl, resp mov dl, resp_end - resp int 0x80 mov al, 6 ; close jmp webserv resp: db "HTTP/1.0 200 OK",13,10,13,10,"Hello, world!" resp_end: addr: dw 2 db 160 ; htons(40960) ;; will be filled by 0
これなら Ruby に勝てるかなと思ったけどさっくり負けた。
require'socket' s=TCPServer.open(40960) loop{f=s.accept;f.puts"HTTP/1.0 200 OK\r\n\r\nHello, world!";f.close}
追記: コメントいただいてちょっと修正 http://d.hatena.ne.jp/shinichiro_h/20071128#c1197261429