Autor Thema: Opcode des MOV-Befehls  (Gelesen 3294 mal)

SebE

  • Beiträge: 14
    • Profil anzeigen
Gespeichert
« am: 11. July 2008, 22:00 »
Hi, ich hab grad in dem Intel Instruction Manual gelesen und mir die Opcodes angeschaut.
Mir kommt etwas eigenartig vor: Beispiel:

MOV r16, imm16 -> Opcode: B0 + rw
und
MOV r32, imm32 -> Opcode: B0 + rd

besitzen beide den Opcode B0, addieren jeweils noch den "Register-Code" hinzu...ist ja verständlich, aber...der "Register-Code" ist hierbei gleich (= 0).
Das heißt, dass sich für BEIDE jeweils der Opcode B0 + 0 = B0 ergibt.

Woher weiß der Prozessor, dass er einmal 16 und einmal 32 Bit lesen und verschieben soll?

Ich hoffe, ihr könnt mir meinen Denkfehler erklären...


Vielen Dank

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #1 am: 12. July 2008, 08:53 »
Woher weiß der Prozessor, dass er einmal 16 und einmal 32 Bit lesen und verschieben soll?
Das kommt drauf an in welchem Modus du bist. Im 16Bit Real/Protected-Mode würden so natürlich die 16bit movs kodiert. Im 32bit Protected-Mode (und auch beim Compatibility-Mode wenn es um die 64bit modes geht) werden so hingegen die 32bit movs kodiert. Wenn du jetzt jeweils das andere willst, dann brauchst du eines (oder mehrere) der Opcode Präfixe, in dem Fall sind die interessanten das Operand-size override prefix (0x66) und das Address-size override prefix (0x67). Aus den Intel Manuals (Manual 2A, Kapitel 2.1.1 Instruction Prefixes):
Zitat
The operand-size override prefix allows a program to switch between 16- and 32-bit operand sizes. Either size can be the default; use of the prefix selects the non-default size. Use of 66H followed by 0FH is treated as a mandatory prefix by some SSE/SSE2/SSE3 instructions. Other use of the 66H prefix with MMX/SSE/SSE2/SSE3 instructions is reserved; such use may cause unpredictable behavior.
The address-size override prefix (67H) allows programs to switch between 16- and 32-bit addressing. Either size can be the default; the prefix selects the non-default size. Using this prefix and/or other undefined opcodes when operands for the instruction do not reside in memory is reserved; such use may cause unpredictable behavior.

Ich hoffe dass das hilfreich war. :-)
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

SebE

  • Beiträge: 14
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 12. July 2008, 09:19 »
Ahhhh...

Hab grad NASM und einen Hex-Editor geladen und damit rum-gespielt:

Es stimmt! vor MOV EAX... steht 66h

Vielen Dank bluecode!

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #3 am: 12. July 2008, 09:34 »
Es stimmt! vor MOV EAX... steht 66h
Das ist richtig, wenn du NASM erzählst du willst 16bit Code erzeugen (über [bits 16] explizit, ist aber afaik auch die Standardeinstellung). Wenn du aber ein [bits 32] vor deinem Code hast, sollte kein Prefix mehr erscheinen. Wenn du dann hingegen MOV AX, bla versuchst, wird das Prefix wieder erscheinen.
Soll heißen 0x66 macht je nach dem in welchem Modus du dich befindest "das Andere".
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

SebE

  • Beiträge: 14
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 12. July 2008, 11:36 »
Hab's grad getestet...stimmt auch.
Was mir aufgefallen ist: es wird kein "Vermerk" über den Modus (16 oder 32bit) hinterlassen...erkennt der Prozessor welches Register gemeint ist (AX oder EAX) daran, ob er sich im RealMode/PM befindet?
Oder bekommt er es irgendwie anders mitgeteilt?

Wie sieht es mit 64bit-Architekturen aus...da reicht ja dieses eine Prefix nicht (das EAX ist doch auch da noch 32bit breit, oder???)

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #5 am: 12. July 2008, 12:02 »
Was mir aufgefallen ist: es wird kein "Vermerk" über den Modus (16 oder 32bit) hinterlassen...erkennt der Prozessor welches Register gemeint ist (AX oder EAX) daran, ob er sich im RealMode/PM befindet?
Lies nochmal meinen ersten Post in diesem Thread, exakt so war es gemeint. Für die CPU kommt es nur darauf an in welchem Modus du dich befindest.
Mit den [bits 16], [bits 32] und [bits 64] sagst du nur NASM, dass es annehmen soll die CPU befindet sich in dem Modus und dann für diesen den richtigen Maschinencode generiert.

Zitat
Wie sieht es mit 64bit-Architekturen aus...da reicht ja dieses eine Prefix nicht (das EAX ist doch auch da noch 32bit breit, oder???)
Die Registerbreite der alten Register hat sich nicht verändert. Ansonsten ist das REX Präfix dazugekommen um zwischen 64bit Instruktionen und 32/16bit Instruktionen zu unterscheiden. Zitat aus den Intel Manuals (2A, Kapitel 2.2.1 REX Prefixes):
Zitat
REX prefixes are instruction-prefix bytes used in 64-bit mode. They do the following:
•   Specify GPRs and SSE registers.
•   Specify 64-bit operand size.
•   Specify extended control registers.
Not all instructions require a REX prefix in 64-bit mode. A prefix is necessary only if an instruction references one of the extended registers or uses a 64-bit operand. If a REX prefix is used when it has no meaning, it is ignored.
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

 

Einloggen