Unterschiedliche Registernamen (x64 u. x86 Betriebssystem) in gdb



  • Hallo,

    als ich vor kurzem eine Ubuntu-Live-CD(x86) ausprobierte und mir die Register des Prozessors mit Hilfe des GDB habe ausgeben lassen hießen diese z.B. eax,ecx,edx,...
    Auf meinem gewöhnlichen Ubuntu-Betriebssystem(x64) heißen diese allerdings rax,rcx,rdx,...
    Das eax für "Extended Accumulator" steht weiß ich, wofür aber ein 'r' stehen sollte bleibt mir schleierhaft.Wofür steht das r? Und warum werden unterschiedliche Namen angezeigt?

    Desweiteren ist mir aufgefallen, dass die disassemblierten Programminstruktionen auf beiden Betriebssystemen unterschiedlich sind obwohl ja der selbe Prozessor verwendet wurde
    (oder simuliert der 32-Bit Kompatibilitätsmodus auch 32-Bit Instruktionen?).Warum ist das so?
    Theoretisch könnte es auch an unterschiedlichen Versionen des GDB liegen!?

    Vielen dank im Voraus!

    fischlefisch



  • Wofür steht das r? Und warum werden unterschiedliche Namen angezeigt?

    Das r steht wohl vermutlich für "register", und der unterschiedliche Name kommt wohl daher, weil das Register nun als 64 Bit angesprochen wird.

    Auf x86 CPUs gibt es z.B. folgende Befehle (MASM Syntax, für GNU Tools muss man die Befehle anders schreiben):

    mov al, memory    ; ein Byte laden, die Bits 8-31 des Registers bleiben unverändert
    mov ax, memory    ; zwei Byte laden, Bits 16-31 bleiben unverändert
    mov eax, memory   ; view Byte laden, alle Bits werden gesetzt
    

    Ich gehe davon aus dass diese drei Befehle im "long mode" von x64 CPUs immernoch dasselbe machen, und wenn man 8 Byte in ein Register laden muss, muss man eben "rax" schreiben:

    mov rax, memory    ; acht Byte laden
    

    Ich kenne mich mit der GNU Assembler Syntax allerdings nicht wirklich aus. Kann sein dass die Unterscheidung zwischen 8/16/32/64 Bit Befehlen nicht über den Registernamen gemacht wird, sondern dass der Befehl dort wiklich anders heisst.
    Beim MC68000 war das z.B. so, dort musste man "move.b" für einen "1 Byte move" schreiben, "move.w" für 2 Bytes und "move.l" für 4 Bytes.



  • Der 64 Bit Modus ist eben eine Erweiterung zum 32 Bit Modus und bietet mehr Anweisungen und 64 Bit Register an. rax etc. sind dann eben die 64 Bit Register und eax etc die 32 Bit Anteile.



  • Dieser Thread wurde von Moderator/in rüdiger aus dem Forum Themen rund um den PC in das Forum Assembler verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • hustbaer schrieb:

    Ich kenne mich mit der GNU Assembler Syntax allerdings nicht wirklich aus. Kann sein dass die Unterscheidung zwischen 8/16/32/64 Bit Befehlen nicht über den Registernamen gemacht wird, sondern dass der Befehl dort wiklich anders heisst.
    Beim MC68000 war das z.B. so, dort musste man "move.b" für einen "1 Byte move" schreiben, "move.w" für 2 Bytes und "move.l" für 4 Bytes.

    movq, movl, movb etc. heißen die Anweisungen in der GNU Syntax. Die Register heißen %rax, %eax etc.



  • hustbaer schrieb:

    Wofür steht das r? Und warum werden unterschiedliche Namen angezeigt?

    Das r steht wohl vermutlich für "register", und der unterschiedliche Name kommt wohl daher, weil das Register nun als 64 Bit angesprochen wird. [...]

    Ok r für register klingt sehr plausibel, danke!

    Dann habe ich also in einem 64-Bit Prozessor sowohl 32- als auch 64-Bit große Register. Wenn ich jetzt eine 32-Bit Anwendung auf einem 64-Bit Rechner laufen lasse werden die 'e'-Register (eax,ebx,...) angesprochen. Diese müssen auch vorhanden sein, da die Anwendungen ja in ihren Maschineninstruktionen diese direkt verwenden, oder? Oder werden beidesmal die gleichen Register verwendet die 8-Byte groß sind und sich für 32-Anwendugen einfach als 'e'-Register ausgeben um nicht doppelt so viele Register wie nötig auf den Prozessoren zu verwenden?


Log in to reply