Einen Assembler programmieren



  • Assembler schrieb:

    Womit wir im Prinzip wieder am Anfang sind: ich habe keine Referenz, wann wie wo welcher Opcode rauskommt (streng genommen, weiß ich nichtmal, ob ich überhaupt alles kenne, das Einfluss nimmt) und finde keine Erläuterung...

    Danke

    Erster Anlaufpunkt sind immer die Dokumentationen des Herstellers:

    http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html

    Da steht alles, aber wirklich auch alles drin ;). Du wirst schnell merken, warum es keine "Tutorials" gibt.

    Aber einen Assembler für einen 8086 (16 Bit, Realmodus, "reduced" CISC, Ausgabe in .com-Datei) kann man relativ einfach basteln. Als ich das damals gemacht habe, habe ich jedoch bei den 32-Bit-80386-Befehlen aufgegeben. Irgendwann denkt man sich: Warum tu ich mir das an, wo es doch so viele, so gute, so billige und so fehlerfreie Assembler gibt :D.

    Hier ist eine Tabelle für die 8086-Befehle:

    http://ref.x86asm.net/coder.html

    viele grüße
    ralph



  • Ich glaube er sucht was Hübsches wie das hier, nur halt für x86: http://www.coranac.com/files/gba/re-ejected-armref.pdf



  • Nein, ich suche eine Erklärung, wie ich die Werte, die in der Tabelle stehn zu einem Opcode zusammensetzte... Einfach hintereinander schreiben funktioniert nämlich nicht und XORen auch nicht...

    Danke



  • Sorry für den Doppelpost, aber ich muss noch was anhängen:

    Und wie ich den Operanden mit einbaue, und inwiefern die hundert verschiedenen ADDs sich (außer dem Opcode) unterscheiden....


  • Mod

    Assembler schrieb:

    Nein, ich suche eine Erklärung, wie ich die Werte, die in der Tabelle stehn zu einem Opcode zusammensetzte... Einfach hintereinander schreiben funktioniert nämlich nicht

    Doch, genau so geht das. Dann wirst du wohl was falsch gemacht haben. Guck doch mal das Beispiel auf Wikipedia:
    http://en.wikipedia.org/wiki/Assembly_language#Example_listing_of_assembly_language_source_code

    und XORen auch nicht...

    😮 😕 Was hast du vor?



  • Ich meinte nicht die generierten Opcodes, klar gehören die hintereinander. Ich meinte, wie ich mit den Daten aus der Tabelle den Opcode erstelle...

    Heißt:

    Wie komme ich an

    03C3
    

    Wenn ich

    add eax, ebx
    

    habe?

    Dabei weiß ich aus der Tabelle:

    1. Dass der PO einer von 00 bis 05 ist (ich werde wohl über die Operanden entscheiden müssen)
    2. Dass das Opcode Field "r" ist (was auch immer das heißt...)

    Bei anderen Opcodes ist das ganze noch schlimmer:

    So sind die PO von

    neg
    

    und

    mul
    

    dieselben, aber bei

    neg eax
    

    und

    mul eax
    

    kommen (logischerweise andere Opcodes raus:

    neg eax ; = F7D8
    mul eax ; = F7E0
    

    ). Der Unterschied zwischen den beiden ist nur das Opcode Field, dass ist beim ersten 3 und beim zweiten 4, wie diese zwei Zahlen aber im Opcode "verarbeitet" sind weiß ich nicht...

    Danke



  • Moin.

    Welche Operanden verwendet werden wird im "Mod R/M"-Byte oder "Post"-Byte spezifiziert.

    Format of Postbyte(Mod R/M aus Intel-Doku)
    ------------------------------------------
    MM RRR MMM
    
    MM  - Memeory addressing mode
    RRR - Register operand address
    MMM - Memoy operand address
    
    RRR Register Names
    Filds  8bit  16bit  32bit
    000    AL     AX     EAX
    001    CL     CX     ECX
    010    DL     DX     EDX
    011    Bl     BX     EBX
    100    AH     SP     ESP
    101    CH     BP     EBP
    110    DH     SI     ESI
    111    BH     DI     EDI
    
    ---
    
    16bit memory (No 32 bit memory address prefix)
    MMM   Default MM Field
    Field Sreg     00        01          10             11=MMM is reg
    000   DS       [BX+SI]   [BX+SI+o8]  [BX+SI+o16]
    001   DS       [BX+DI]   [BX+DI+o8]  [BX+DI+o16]
    010   SS       [BP+SI]   [BP+SI+o8]  [BP+SI+o16]
    011   SS       [BP+DI]   [BP+DI+o8]  [BP+DI+o16]
    100   DS       [SI]      [SI+o8]     [SI+o16]
    101   DS       [DI]      [DI+o8]     [SI+o16]
    110   SS       [o16]     [BP+o8]     [BP+o16]
    111   DS       [BX]      [BX+o8]     [BX+o16]
    Note: MMM=110,MM=0 Default Sreg is DS !!!!
    
    32bit memory (Has 67h 32 bit memory address prefix)
    MMM   Default MM Field
    Field Sreg     00        01          10             11=MMM is reg
    000   DS       [EAX]     [EAX+o8]    [EAX+o32]
    001   DS       [ECX]     [ECX+o8]    [ECX+o32]
    010   DS       [EDX]     [EDX+o8]    [EDX+o32]
    011   DS       [EBX]     [EBX+o8]    [EBX+o32]
    100   SIB      [SIB]     [SIB+o8]    [SIB+o32]
    101   SS       [o32]     [EBP+o8]    [EBP+o32]
    110   DS       [ESI]     [ESI+o8]    [ESI+o32]
    111   DS       [EDI]     [EDI+o8]    [EDI+o32]
    Note: MMM=110,MM=0 Default Sreg is DS !!!!
    
    ---
    
    SIB is (Scale/Base/Index)
    SS BBB III
    Note: SIB address calculated as:
    <sib address>=<Base>+<Index>*(2^(Scale))
    
    Fild   Default Base
    BBB    Sreg    Register   Note
    000    DS      EAX
    001    DS      ECX
    010    DS      EDX
    011    DS      EBX
    100    SS      ESP
    101    DS      o32        if MM=00 (Postbyte)
    SS      EBP        if MM<>00 (Postbyte)
    110    SS      ESI
    111    DS      EDI
    
    Fild  Index
    III   register   Note
    000   EAX
    001   ECX
    010   EDX
    011   EBX
    100              never Index SS can be 00
    101   EBP
    110   ESI
    111   EDI
    
    Fild Scale coefficient
    SS   =2^(SS)
    00   1
    01   2
    10   4
    11   8
    

    Dirk



  • Anmerkung: In Bezug auf mit und ohne "memory address prefixe(67h)", werden diese Postbyte-Tabellen aus der Sicht des 16 Bit-Adressmodes(D-Flag nicht gesetz) betrachtet.

    Dirk



  • SeppJ, wenn das Wort richtig geschrieben gewesen wäre, hättest du vielleicht auch was gefunden 😉 Hier: https://webcache.googleusercontent.com/search?q=cache:16-iNtIgbicJ:http://www.c-jump.com/CIS77/CPU/x86/X77_0240_prefix.htm (Die Seite ließ sich nicht direkt öffnen, ohne Skripte zu erlauben), bzw. hier: http://brokenthorn.com/Resources/OSDevX86.html (weiter unten, bei IA32 and IA64 Instruction encoding (in grün), Unterabschnitt Instruction encoding)


  • Mod

    Sonnenbleichung schrieb:

    SeppJ, wenn das Wort richtig geschrieben gewesen wäre, hättest du vielleicht auch was gefunden 😉 Hier: https://webcache.googleusercontent.com/search?q=cache:16-iNtIgbicJ:http://www.c-jump.com/CIS77/CPU/x86/X77_0240_prefix.htm (Die Seite ließ sich nicht direkt öffnen, ohne Skripte zu erlauben), bzw. hier: http://brokenthorn.com/Resources/OSDevX86.html (weiter unten, bei IA32 and IA64 Instruction encoding (in grün), Unterabschnitt Instruction encoding)

    Ok, das sind aber Teile der Opcodes selber, nicht wie vom TE dargestellt ein "State" der Assemblersprache. Das heißt, ein einfacher 1:1 Übersetzer ist nach wie vor ausreichend.


Anmelden zum Antworten