Ich habe mir gerade mal überlegt, dass alles was ich bisher bei Assembler gemacht habe irgendwie immer 16-Bit bezogen war. Wie sieht das mit 32-Bit-Systemen und den neuen 64-Bit-Systemen aus. Muss man dort anders arbeiten?
Ich meine, die Register sind dann ja zweimal bzw. viermal so lang. Dann bräuchte man doch sicherlich auch wieder spezielle Compiler/Linker/Befehlssätze...
Oder habe ich da jetzt was falsch verstanden? :confused:
Jan Krüger
31.03.2005, 15:08
Die meisten aktuellen x86-Assembler kennen den allgemeinen 32-bit-Befehlssatz; für 64-bit-Befehle und -Register musst du natürlich auch einen passenden Assembler haben. Ich habe leider keinen Überblick, welche Compiler 64 Bit verstehen; der GNU Assembler kann's bestimmt. :)
Ich kann dir Beispiele aus der 32-bit-Welt geben: die 32-bit-Register heißen EAX, EBX, EIP usw. Entsprechende Spezialbefehle wie die 64-bit-Form von DIV (EDX:EAX durch den Operanden teilen oder so ähnlich) oder LODSD sind entsprechend auch dazugekommen.
Ich habe mir gerade mal überlegt, dass alles was ich bisher bei Assembler gemacht habe irgendwie immer 16-Bit bezogen war. Wie sieht das mit 32-Bit-Systemen und den neuen 64-Bit-Systemen aus. Muss man dort anders arbeiten?
Ich meine, die Register sind dann ja zweimal bzw. viermal so lang. Dann bräuchte man doch sicherlich auch wieder spezielle Compiler/Linker/Befehlssätze...
Oder habe ich da jetzt was falsch verstanden? :confused:
Wenn ich jetzt mal von x86 (IA32) Architektur ausgehe, sind die Befehle nicht komplett anders, es sind natürlich neue Befehle dazugekommen, andere wurden verändert (wie IMUL), aber grundsätzlich gibt es noch einen MOV-Befehl und er macht sogar noch das, was man von ihm erwartet... :-)
Was sich ändert, sind die Register, die sind tatsächlich breiter. Aus AX wird so bei 32Bit-Assembler EAX, dessen unteres Word AX enthält, dessen untere Bytes AH und AL sind.
Was sich aber ändert ist das komplette Programmiermodell. 32Bit-Assembler (besser: Das FLAT-Speichermodell) schmeckt ganz anders als 16Bit-Assembler. Es gibt noch Segment-Register, ihre Funktionsweise ist nur komplett anders. Du darfst nicht mehr alles, weil du (zumindest meistens) im protected mode und nicht im Ring0 (der höchsten Privilegstufe) bist. Du kannst auf einmal mit deinen Index-Registern 4GB adressieren, und sogar damit rechnen (womit das ganz 64kb Rumgeschubse endlich entfällt!). Du kannst nicht mehr überall in den Speicher greifen, denn es kann sein, daß er an der Stelle gar nicht vorhanden ist. Der Prozessor schaut dir viel mehr auf die Finger (und haut zuweilen auch drauf, wenn du anfängt, frech zu werden). Deine logische Reihenfolge der Speicheradressen ist auf einmal nicht mehr die physikalische Reihenfolge, vielmehr treiben jetzt 4kb große RAM-Schollen durch den Adressraum, und: Du hast keine Ahnung, ob dort, wo gerade noch Speicherland in Sicht war, jetzt noch welches ist. Das ganze nennt sich unscheinbar "virtueller Speicher", und ist genau das, was der Name sagt: Speicher der keiner sein muß. Unter 32Bit FM kann so ziemlich alles in Bewegung sein, der Prozessor selbst kann virtuell werden, was an Schizophrenie kaum noch zu übertreffen ist. Denn wo der Prozessor virtuell ist, kann auch der Interrupt virtuell werden.... Sprich, man kann sich über kaum etwas sicher sein, außer daß dir der Prozessor schon auf die Finger klopft, wenn etwas schiefläuft.
32Bit FM ist so ziemlich das krankeste und lustigste, was moderne Computer zu bieten haben.
Und...ja, man braucht spezielle Assembler dafür. NASM tuts genauso, wie MASM oder TASM ab Version 4/5. Also so ziemlich alle Assembler, die es seit 15 Jahren auf dem Markt gibt... :-)
Es kommt nur darauf an, das richtige .model und den richtigen Befehlssatz (.386, .486, .586) zu wählen (die passenden Assumes nicht vergessen).
.386
.model flat
vBulletin® v3.8.6, Copyright ©2000-2012, Jelsoft Enterprises Ltd.