5 ms·
A web server in x86 assembly language
- Luyt 15y agoHmmm, 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/ http://nginx.org/en/ [2] http://mongrel2.org/home http://mongrel2.org/home
- mhd 15y agoFor 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...
- limmeau 15y agoIt'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?
- narag 15y agoNo. Without seeing the code, my guess is it's used either as a control console or for IPC.
- DrJokepu 15y agoObviously 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).
- Argorak 15y agoHm, no rack adapter yet? duck
- leon_ 15y agoI'd say code readability is at the level of a Node.js application.
- chrisjsmith 15y ago+1 ironically true!
- smokeyj 15y agoThat's a bit unfair towards node. With proper foresight clean code can be written in almost any language.
- msie 15y agoIt would have been really neat if the page was served by the very same assembly code.
- Wo0kToR 15y agoThese 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 15y agoAlso, 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 :-)
- Wo0kToR 15y agoFor a large amount of code, like a whole program, maybe. But I think you can still get big gains in small loops or algorithms written and optimized in assembly. Even more so if you optimize for a specific processor and cache. Write the rest of the program in a high level language.
- eru 15y agoAnd run a profiler, before you optimize.
- daeken 15y agoIn 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 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.
- kragen 15y agoIt'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 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 15y agoScrew MASM. TASM Ideal Mode all the way!