AX und EAX



  • Hallo zusammen,

    in meinem Assemblerbuch wird beschrieben, dass für arithmetische Operationen das Regisdter AX verwendet werden solle. Dieses sei in einen LOW und einen Hight Teil unterteilt. Diese Unterteilung gibt es aber nur bei den Allzweckregistern.

    Wenn ich aber nun mit Assembler meine ersten Versuche mache, dann kommt es bei der Verwendung des AX Registers immer zu einem Fehler. Ich muss immer EAX schreiben. Onkel Google verrät mir nicht, was das E bedeutet und warum ich nicht, wie in meinem Buch beschrieben, das AX Register verwenden kann.

    Kleine Anmerkung: Ich benutze Borland Builder C++ und binde dort meinen Assemblercode ein.

    Könnt ihr mich aufklären?

    Vielen Dank
    lg, freakC++





  • Die x86 Architektur ist über die Zeit gewachsen, ist aber immer abwärtskompatibel geblieben. AX ist ein 16 Bit Register und wird in der Regel nur verwendet wenn der Prozessor sich im 16 Bit Modus befindet (Was nicht unbedingt heißt das es sonst nicht ginge). EAX ist die 32 Bit Variante, wobei AX dann die unteren 16 Bit von EAX bildet. Für die oberen 16 Bits gibt es hier aber kein Register wie AH für AX. Die 64 Bit Variante ist dann RAX mit EAX als untere 32 Bit.



  • Ohh! Ok. Danke!

    Ist es denn üblich, dass ein Buch der 3. Auflage aus dem Jahr 2010 alles am 8086 Prozessor erklärt und damit anhand von 16 Bit CPUs?

    Liebe Grüße vom Chiemsee
    freakC++



  • Der 16 Bit Realmode hat einen gewissen Reiz bei der Assemblerprogrammierung. Zum Einen kann man in diesem Modus auf BIOS Interrupts zugreifen, die relativ einfach Funktionen für Ein-/Ausgabe bereitstellen. Zum Anderen hat man grundlegend keine Beschränkung beim Zugriff auf den Speicher. Es gibt nur Bereiche die schon mit etwas anderem belegt sind. Wenn im Protected Mode auf Speicher zugegriffen wird der nicht vom Programm reserviert wurde, gibt es direkt eine Schutzverletzung.



  • wenn man ax und eax gemeinsam benutzen möchte, dann braucht einer von beiden Befehlen ein opcode präfix, denn der opcode von eax und ax ist der gleiche.

    Man kann sich das ganze anschauen, wenn man z.B. mit fasm
    http://www.flatassembler.net/

    den testcode:

    org 100h
    mov ah,08
    mov ax,07
    mov eax,9abcdef1h
    

    eintippt und übersetzen lässt. Anschließend schaut man sich das "programm" im Hexeditor an. Bei mir steht z.B.:
    B408 B80700 66B8F1DEBC9A
    im hexeditor



  • Nur zur vollständigkeit:
    Der 0x66 Prefix wird verwendet wenn man im 16bit Modus ein 32bit Register benutzt.
    Oder wenn man im 32bit Modus ein 16bit Register benutzt.

    mov eax,9abcdef1h -> im 16 bit Modus 66B8F1DEBC9A
    mov eax,9abcdef1h -> im 32 bit Modus B8F1DEBC9A

    mov ax,0007 -> im 16 bit Modus B80700
    mov ax,0007 -> im 32 bit Modus 66B80700



  • ah/al → 8-bit register
    ax = ah + al = 16 bit register
    eax = ax + ax = 2 * (ah + al) = 32 bit register
    und wem es noch interesiert:
    rax = eax + eax = 4 * ax = 8 * (ah + al) = 64 register



  • Qinix schrieb:

    ax = ah + al = 16 bit register
    eax = ax + ax = 2 * (ah + al) = 32 bit register
    und wem es noch interesiert:
    rax = eax + eax = 4 * ax = 8 * (ah + al) = 64 register

    das stimmt so nicht!



  • doch man. vllt das mit den 64 nicht, aber sonst....aber ax besteht doch aus ah und al, einem low byte und high byte



  • nein man!
    C-pseudocode:

    AX = (WORD)(AH << 8 | AL)
    EAX = (DWORD)AX
    RAX = (QWORD)EAX
    


  • Qinix schrieb:

    doch man. vllt das mit den 64 nicht, aber sonst....aber ax besteht doch aus ah und al, einem low byte und high byte

    Ja aber eax besteht aus einem ax mit al und ah. Die anderen 8 Bit sind kein ax( geht ja auch schlecht)

    LG freeG


Anmelden zum Antworten