122Byte の Web サーバ

なんとなく小さい Web サーバを書いてみました。 Web サーバというかどんなリクエストでも固定応答するだけ。

http://shinh.org:40960/

例のごとく 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

なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h