EAX ... AX



  • Warum gibt es AX, auf welches man auch über AL und AH zugreifen kann, und EAX, bei dem es nichts wie EAL und EAH gibt? Wo ist der Unterschied zwischen den beiden Registern?

    lg, phreaking



  • Original erstellt von phreaking:
    Warum gibt es AX, auf welches man auch über AL und AH zugreifen kann, und EAX, bei dem es nichts wie EAL und EAH gibt? Wo ist der Unterschied zwischen den beiden Registern?
    lg, phreaking

    AX ist Teil von EAX.
    ungefär so:

    union
    {
       int EAX;
       union
       {
          short AX;
          union
          {
             char AH;
             char AL;
          }
       }  
    }
    


  • 😕 Entweder hast du da was falsch verstanden, oder ich jetzt 😃
    eax ist ein 32Bit Register ax hat 16Bit al und ah haben nur 8.
    al und ah sind in ax und ax ist wiederum in eax enthalten. Das verdeutlicht diese Skizze vielleicht etwas besser:

    Bits 0-7 8-15 16-31
    al ah /
    \ax/ /
    \__eax___/
    [edit:]Zu langsam 😃 [/edit]

    [ Dieser Beitrag wurde am 29.06.2002 um 21:07 Uhr von Nobuo T editiert. ]



  • Original erstellt von Nobuo T:
    **😕 Entweder hast du da was falsch verstanden, oder ich jetzt 😃
    eax ist ein 32Bit Register ax hat 16Bit al und ah haben nur 8.
    al und ah sind in ax und ax ist wiederum in eax enthalten. Das verdeutlicht diese Skizze vielleicht etwas besser:

    Bits 0-7 8-15 16-31
    al ah /
    \ax/ /
    \__eax___/
    [edit:]Zu langsam 😃 [/edit]

    [ Dieser Beitrag wurde am 29.06.2002 um 21:07 Uhr von [qb]Nobuo T** editiert. ][/QB]

    Soweit habe ich das ja auch verstanden. Aber warum verwendet man manchmal einfach nur ax, bx, cx, usw. und manchmal nur eax, ebx, ecx, usw, und warum kommt das eigentlich nie gemischt in Programmen vor (ich habe das zumindest bis jetzt noch nie gesehen)?
    Meine Frage bzgl. al sowie ah:

    | 0| 1| 2| 3| 4| 5| 6| 7| 8| 9|10|11|12|13|14|15|
    |     AL    |     AH    |                       |
    |           AX          |                       |
    |                      EAX                      |
    

    Mittels AX kann (könnte) ich jetzt ja quasi auf den LOW-Teil von EAX zugreifen. Aber es gibt doch keine Möglichkeit, "direkt" auf den HIGH-Teil von EAX zuzugreifen (wie das eben bei AX mittels AH möglich ist), oder? Warum eigentlich nicht?

    lg, phreaking



  • In 32Bit-Anwendungen werden meist nur 32Bit Register verwendet, da 1. zum Addressieren eh 32Bit Register benoetigt werden und 2. OpCodes mit 16Bit-Register ein Code Prefix benoetigen (66h oder 67h)
    Bei 16Bit-Anwendungen ist das genau andersrum: OpCodes mit 32Bit-Registern brauchen dieses Prefix.
    Es gibt aber eigentlich auch genug Grenzfaelle, in denen 16Bit und 32Bit Register benutzt werden. Ich habe das aber bisher nur bei Windows-Programmen, die mit Assembler geschrieben wurden, oder DOS-Programmen gesehen 😕

    Warum es keine Moeglichkeit gibt, den high Bereich von eax direkt anzusprechen habe ich mich auch schon oft genug gefragt. Kann man wohl nichts machen :o 😉



  • Also soweit ich mich erinnere gibt es da etliche 32-bit Programme, die auch die 16-bit Register und auch die darin enthaltenen 8-bit Register verwenden. Man schaue sich doch mal ein normales Programm im Disassembler an. 😉

    Warum man den höherwertigen Teil von EAX nicht direkt ändern kann? Nun, anfangs habe ich mich das auch gefragt. Aber während längerer Programmierpraxis habe ich dann festgestellt, dass ich eigentlich so gut wie nie den höherwertigen Teil eines 32-bit Registers direkt manipulieren wollte.



  • Naja, danke für eure Antworten. Eigentlich kann ich dem letzten Satz von malfunction ja auch nur beipflichten, denn die Frage war eher theoretisch gemeint!

    greetz, phreaking



  • das ist ja aber auch nich sooo schwer

    rol eax,16
    mov ax,bla
    rol eax,16



  • Das es nicht Unmöglich ist, die Zuweisung über einen "Umweg" durchzuführen, war mir sowieso klar (es ginge auch über ein shiften und eine bitweise Oder-Verknüpfung). Die Frage war ja auch nur, warum es keinen direkten Wege gibt!
    Aber trotzdem Danke!

    greetz, phreaking



  • Hmm leider habt ihr ein Register vergessen:

    😃

    0......63
    \_RAX__/

    [ Dieser Beitrag wurde am 25.08.2002 um 13:53 Uhr von Necromancer editiert. ]



  • hmm... Gilt nicht :p
    RAX ist kein x86-Intel-Standard.
    Sonst koennte ich ja hier auch noch mit Registern vom 65c816 anruecken 😉



  • Original erstellt von Nobuo T:
    **RAX ist kein x86-Intel-Standard.
    **

    Ich mag mich irren, aber ist das nicht ein ganz normales IA-64-Register? Dann ists von Intel, von IA-32 hast du ja nichts gesagt 😉



  • Hast recht, das ist ein IA-64-Register.
    und ich habe nichts von einer 32Bit-Begrenzung gesagt 😉
    auch nicht, dass dieser Standard nicht von Intel waere... Aber gehoeren die entsprechenden Prozzies noch zur x86(Pentium)-Serie 😕

    Was solls: es ging hier urspruenglich mal um eax und ax. => 32Bit
    Ausserdem: wer benutzt heute schon solche 64Bitter privat? :p



  • Original erstellt von Nobuo T:
    Hast recht, das ist ein IA-64-Register.

    Ist ein x86-64 Register (AMD Opteron/Clawhammer).

    Was solls: es ging hier urspruenglich mal um eax und ax. => 32Bit
    Ausserdem: wer benutzt heute schon solche 64Bitter privat? :p

    Ende dieses Jahres soll der Clawhammer kommen und es gibt immer private Leute , die sich sowas leisten.

    [ Dieser Beitrag wurde am 26.08.2002 um 11:46 Uhr von Necromancer editiert. ]


Anmelden zum Antworten