na ja .. trotzdem ist Assembler einfach das kleinste, was du erzeugen kannst ...

Mein ebend geschriebenes "Hallo Welt." Programm ist gerade mal 29 Byte gross. Zugegeben, es ist eine COM Datei, aber im Prinzip koennte man nen header davorsetzen, ein paar byte dazuschreiben, und haette eine Exe.

Hier einmal der Quellcode fuer nasm

Code:
;Hello World Programm
  ORG 100h ; COM File

EntryPoint: 
  mov si, message1	; Addresse von String Message nach SI
 .startloop
  lodsb 		; Byte laden
  or al,al		; ist = 0 ?
  jz short .endloop	; wenn 0, dann ende
  mov ah,0x0E
  int 0x10		; Bios-Interrupt
  jmp short .startloop	; naechstes Zeichen
 .endloop
  ret			; Ende COM File

DataSection:
  message1 db "Hallo Welt.",13,10,0
Wie man sieht hab ich auf BIOS-Routinen zurueckgegriffen und nicht auf die lausige DOS-Routine int 21h. Wer benutzt schon $ als terminales Zeichen ? .. mein Prog handhabt so wenigstens Null-terminierte Strings ...
Ausserdem sollte so der Assemblercode auch recht leicht auf linux portierbar sein ...

und fuer alle, die es interessiert, hier der Maschienencode mit ASM-Entsprechung

Code:
Pos      Maschienencode          ASM-Code
00000000 BE0F01                  MOV SI,word 0x010F
00000003 AC                      LODSB 
00000004 08C0                    OR AL,AL
00000006 7406                    JE 0x0000000E
00000008 B40E                    MOV AH,byte 0x0E
0000000A CD10                    INT byte 0x10
0000000C EBF5                    JMP 0x00000003
0000000E C3                      RETN 
0000000F 48                      byte 0x48 'H'
00000010 61                      byte 0x61 'a'
00000011 6C                      byte 0x6C 'l'
00000012 6C                      byte 0x6C 'l'
00000013 6F                      byte 0x6F 'o'
00000014 20                      byte 0x20 ' '
00000015 57                      byte 0x57 'W'
00000016 65                      byte 0x65 'e'
00000017 6C                      byte 0x6C 'l'
00000018 74                      byte 0x74 't'
00000019 2E                      byte 0x2E '.'
0000001A 0D                      byte 0x0D CR
0000001B 0A                      byte 0x0A LF
0000001C 00                      byte 0x00 NULL
Wenn man es genau betrachtet, ist das programm lediglich 15 Byte gross, der Rest sind ja die auszugebenden Daten ^^