Extrem kleine Asm-Programme



  • Hallo ich würde gerne mal wissen,wie klein man die kleinsten ASM-Programm machen kann,so dss diese auch noch laufen.
    Ich programmiere unter MASM32 und das kleinste was ich hinbekomme ist 1KB.
    Geht das nicht noch kleiner??
    Mfg Hans



  • Hi.

    Der Klassiker:

    ret
    

    Ist ein komplett lauffaehiges, 1Byte grosses DOS .com-Programm.
    Macht zwar nicht viel, aber danach hast du schliesslich auch nicht gefragt. 😉



  • Danke.
    Und wie kann ich möglichst kleine Programme erstellen,die auch was machen??



  • Lauffähige .com Anwendungen die etwas sinnvolles machen, bekommst du in wenige hundert Byte - eine lauffähige, native Windowsanwendung bekommst du meines Wissens nach aber kaum kleiner als ca. ein Kilobyte. Zumindest habe ich das noch nie gesehen, und programmiere selbst schon eine Weile in Assembler.

    Falls ich falsch liege, möge man mich berichtigen.



  • Danke



  • Wenn 16Bit auch zählt hab ich einige Übungsanwendungen die nur einige hundert bytes groß sind und trotzdem was sinnvolles tun. Ist halt schon nen Unterschied ob man nun gegen ne Bibliothek linkt oder Interrupts verwendet.



  • gabs da nicht mal nen Thread "Programme, die die Welt nicht braucht" irgendwann vor 4 oder 5 Jahren?

    Damals hatte ich nen "Texteditor" in 5 oder 6 Assembler-Zeilen gepostet..



  • Lauffähiges Windows Programm (32-bit, PE)unter 1 KB ist soweit ich weiß nicht möglich. Ich hab mal auf einer xxx.RU Seite Codeschnipsel gesehen um ein 5XX Byte großes Program zu erstellen, es lief aber eben nur auf XP (bzw. musste für 2000 leicht angepasst werden und konnte nicht unter 9x laufen) und man musste einige Tricks anwenden - unter anderem PE Header selber basteln. Da kann man sich wohl gleich mit Interupts auseinandersetzen und COMs schreiben. Ok, manchmal ist es lustig Aufgaben mit 20-80 Byte großen Programmen zu erledigen, ist aber wie ich finde noch eine Stufe unübersichtlicher als 32-Bit Programmierung weil man doch wegen der 16-Bit Registereinschränkung und der Speicheradressierung ziemliche Verrenkungen machen muss.



  • Kannst dich noch ungefähr an de seite erinnern?



  • #pragma comment(linker,"/NODEFAULTLIB")
    #pragma comment(linker,"/ENTRY:WinMain")
    
    #pragma comment(linker,"/MERGE:.rdata=.data")
    #pragma comment(linker,"/MERGE:.text=.data")
    
    #pragma comment(linker,"/SECTION:.data,ERW,ALIGN:64")
    //#pragma comment(lib,"msvcrt.lib")
    
    //Nicht mittels pragma definierbar:
    //#pragma comment(linker,"/ALIGN:64");
    //#pragma comment(linker,"/STUB:smallstub.dat");
    
    #include <windows.h>
    
    typedef BOOL (WINAPI *PBEEPFUNC)(DWORD,DWORD);
    
    int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
    {
    	((PBEEPFUNC)0x7C838A53)(500,100);
    	((PBEEPFUNC)0x7C838A53)(600,100);
    	((PBEEPFUNC)0x7C838A53)(700,100);	
    }
    

    Ergibt bei mir mit Visual Studio 7.1 eine unter Windows XP lauffähige 576 Byte große EXE-Datei. Die Funktion Beep wird direkt über die Adresse aufgerufen, da die Kernel32.dll eigentlich bei jedem Prozess an die gleiche Adresse gemappt wird und man sich somit den statischen Import für die Funktion sparen kann. Der Standard-DOS-Stub, den VS7.1 anhängt ist etwa 180byte groß, mit der Linkeroption STUB kann aber ein eigener Stub eingefügt werden. Dieser muss angeblich mindestens 64Byte groß sein aber ich konnte noch keinen erstellen, den der Linker als gültiges DOS-Programm erkannt hat. Theoretisch könnte man den DOS-Stub auch komplett weglassen (manuell nach dem Compilieren). In dem Fall und könnte somit weitere 180 Byte einsparen. Ansonsten könnte man vielleicht noch die Directories im Optional Header entfernen, aber da bin ich mir nicht so sicher, ob es dann noch lauffähig ist.
    Alles in Allem ist diese EXE natürlich ein wackeliges Konstrukt und allein schon wegen des Section Alignments nicht mehr standardkonform.



  • Weist du wo ich genaueres dazu finde?
    MFg Hans



  • Hans94 schrieb:

    Danke.
    Und wie kann ich möglichst kleine Programme erstellen,die auch was machen??

    für batch-programme war es immer wichtig, testen einlesen zu können. da hab ich mal ne com mit 5 bytes gesehen, die ein zeichen einliest und zurückgibt.



  • volkard schrieb:

    da hab ich mal ne com mit 5 bytes gesehen, die ein zeichen einliest und zurückgibt.

    also das kleinste was ich hinbekomme ist 9byte gross:

    mov ah,01                2byte
    mov dh,02                2byte
    int 21h                  2byte
    xchg dx,ax               1byte
    jmp 0104                 2byte
    

    5 byte: platz fuer nen int ein mov und evtl noch ein xchg koennt ich mir vorstellen. also 5 byte sollten doch ganz schoen knapp bemessen sein 😉

    ps. lasse mich gerne eines besseren belehren



  • Das sind doch aber alles keine gültigen Win32-Anwendungen und darum ging es dem Threadersteller ja wohl auch. 😕 Dass man ein reines Assembler-Programm ohne Rücksicht auf ein spezielles Executableformat oder Betriebssystem (wobei DOS ja mit den COM-Dateien ja auch recht sparsam ist) sehr klein bekommen kann, ist ja klar.



  • Genau.Also am interessantesten sah der c++ Beispielcode von masterofx32 aus.
    Weis jemand einen link oder ähliches mit mer informationen?
    Nfg Hans



  • Das lesen:

    Prtable Executable File Format Specification.htm
    Win32 Portable Executable File Format.pdf

    Und dann solltest du dir die Optionen anschauen, die dein Linker dir bietet und wie diese sich auf die erstellte EXE auswirken. ➡ PEView



  • Hallo
    Ich hab ein Problem,der USB Treiber eines ACER USB-Sticks wird nicht mehr erkannt nicht auf Linux und auch nicht auf Windows.Ich bekomme nicht mal ein Signal meines Linuxsystems wenn der USB-Stick eingesteckt ist.Bios hingegen erkennt das der USB
    Stick eingesteckt ist.Von ACER bekomme ich keine Treiber mehr.Kann man da mit Assembler was machen so das das Teil wenigstens erkannt wird und man es wieder formatieren kann?...



  • Trexter schrieb:

    Hallo
    Ich hab ein Problem,der USB Treiber eines ACER USB-Sticks wird nicht mehr erkannt nicht auf Linux und auch nicht auf Windows.Ich bekomme nicht mal ein Signal meines Linuxsystems wenn der USB-Stick eingesteckt ist.Bios hingegen erkennt das der USB
    Stick eingesteckt ist.Von ACER bekomme ich keine Treiber mehr.Kann man da mit Assembler was machen so das das Teil wenigstens erkannt wird und man es wieder formatieren kann?...

    Ja, Assembler kann alles, damit kann man sogar DIREKT auf Hardware zugreifen - Mann, ist das toll! :p



  • Was haben die letzten 2 Beiräge Bitte schön mit dem Thema zu tun??
    Naja.Ich habe gelesen,dass die Kernel32.dll und user32.dll immer an der gleichen Stelle im Speicher geladen sind.Wenn das stimmt,wo ist das?
    Was macht die Präprozessordirektive "Pragma".
    Mfg Hans



  • Ich habe gelesen,dass die Kernel32.dll und user32.dll immer an der gleichen Stelle im Speicher geladen sind.

    Auf der gleichen Windows-Version schon, aber die Adresse ist höchstwahrscheinlich bei XP und 2000 jeweils eine andere, möglicherweise spielen da auch installierte Service Packs eine Rolle.


Anmelden zum Antworten