

A web server in x86 assembly language - hide1713
http://www.intel-assembler.it/portale/5/cinchy-x86-web-server/a-basic-asm-web-server.asp

======
Luyt
Hmmm, 90% seems to be glueing Win32 APIs together for a GUI. That's not very
exciting in assembly; neither is it significantly more efficient than doing it
from C. It's also very unreadable, and I fear for maintainability.

And does this webserver serve many simultaneous connections? I doubt it. You'd
learn more about proper webserver programming techniques by studying the
source code to nginx [1] or mongrel2 [2].

As an example, it's more useful in showing how to build GUIs in assembly, and
that's not very productive. You _do_ get small executables, tho.

[1] <http://nginx.org/en/>

[2] <http://mongrel2.org/home>

~~~
mhd
For a short while it was quite fashionable to have really small Windows
programs around, before broadband was common enough, as a reaction to bloated
programs, Java runtimes, multi-megabyte VB executables etc. Saw quite a number
of assembly-based editors back then. But to be honest, most of those were a
small wrapper around the Windows edit controls...

------
Wo0kToR
These Win32 assembly programs are quite cool. I used to dabble with writing
small things in it. But I realised a while ago that, as Luyt has already
touched on, 95% - 99.x% of the CPU time is spent in the Win32 library code,
which is written in C, and which you have to call if you want to do anything
significant, eg. put up a GUI. That defeats the performance benefit of writing
such programs in asm: like Luyt said the slow down from writing the same thing
in efficient C or C++ code would be minute. You still get the benefit of tiny
executables, though.

One might consider the fact that nowadays it's only worth writing "busy code"
in assembly, and most or all of a GUI app isn't busy code, but that would be
being sensible. A web server might have a few pieces of busy code in it IF
it's designed to connect to hundreds or thousands of users at once. It would
be good to write those in assembly. :)

~~~
danparsonson
Also, generally speaking you'd have to be a pretty fine assembler programmer
to out-optimise a modern compiler in a meaningful way; either that, or have
some knowledge that the compiler doesn't (e.g. data parallelism).

Of course, there's always the fun factor :-)

~~~
daeken
In terms of out-optimizing a modern compiler, it really depends on what you're
optimizing for. For performance, a modern compiler is going to destroy you 99%
of the time -- I've been writing x86 assembly for many years and in the vast
majority of cases, I can't write faster code than MSVC. However, if code
_size_ is what's important, it's easy to beat any compiler. You can often get
your code down an order of magnitudes, sometimes even two. Sizecoding has
become my passion in recent years, and it's amazing how much you can do that
the compiler can't if you really care; for instance, this is a bootsector I
wrote that reads a kernel from NTFS:
<http://demoseen.com/ColorblindBoot.s.txt> As far as I know, this is the only
NTFS reader that actually fits into the boot sector (510 bytes, of which it
uses every one), which is kinda neat.

~~~
sometwo
Why did you use port I/O instead of int 13h?

~~~
daeken
Using int 13h is fine for floppies, but when you're using it with hard drives
it gets messy -- you have to use the extended versions which are buggy as
hell. Much easier to just do it directly, and it doesn't take up much more
space (if at all).

------
kragen
It's mostly calls to some kind of assembler macro built into MASM, which means
it's not really x86 assembly language:

    
    
                INVOKE SetFilePointer,hFile,FOffset,0,FILE_BEGIN
                INVOKE ReadFile,hFile,pMem,FSize,offset NotUsed,0
                INVOKE send,wParam,pMem,FSize,0
                INVOKE GlobalUnlock,hMem
                INVOKE GlobalFree,hMem
                INVOKE closesocket,wParam
                INVOKE CloseHandle,hFile    ;Done with file and socket too.
    

The guy wrote it in 2001, when he was in high school, and he's done a lot more
cool and interesting stuff since then, and it looks like he's graduated to
Linux: <http://lingcog.iit.edu/~scubed/projects.xml>

Too bad he stopped adding new projects to the page in 2007. His "portfolio"
page has a few more things since then.

~~~
Wo0kToR
Screw MASM. TASM Ideal Mode all the way!

------
msie
It would have been really neat if the page was served by the very same
assembly code.

------
limmeau
It's also an example of a Win32 program in assembler, together with a WndProc
for a window. Does Win32 require a window if you want to write a web server?

~~~
DrJokepu
Obviously not, a Win32 process is not required to have any windows at all.
Actually, web servers are typically ran as services and services are not
allowed to interact with the user interface at all in theory (not just with
windows, but with things such as printers either).

------
leon_
I'd say code readability is at the level of a Node.js application.

~~~
smokeyj
That's a bit unfair towards node. With proper foresight clean code can be
written in almost any language.

------
Argorak
Hm, no rack adapter yet?

 _duck_

