x86-64 inkompatibel? Wie machen das die Compiler?



  • Hallo Leute
    Ich hab mal an gefangen ein E-Book über Assembler zu lesen, allerdings einige Probleme.
    Und zwar wenn ich es für 32 Bit assemble beschwert er sich über inkompatibelitäten und wenn ich es für 64 Bit assemble sein einige Befehle(vor allem in den Hilfsdateien, die zum lernen dabei sind, meist push&pop Befehle) nicht vorhanden.
    Nur wenn x86-64 inkompatibel zu i386(wies in der Fehlermeldung heißt) ist, wie machen, dass dann die Compiler, bei denen kompilierte auf allen Arten von x86 laufen(zumindest 32 und 64, 16 weiß ich nicht) verwenden die nur einen speziellen Befehlssatz, der unter beiden Arten der CPU läuft, oder gibt da sonst irgend einen Trick?
    Ich verwende übrigens NASM Assembler unter Linux und dieses E-Book hier:
    http://www.drpaulcarter.com/pcasm/pcasm-book-german.zip



  • ich glaube du haust da irgendetwas durcheinander. compiler erzeugen keinen code der unabdinglich auf x86_64 und i386 läuft. die ausnahme besteht in 32bit code. dieser ist auch lauffähig in 64bit umgebungen, da die x86_64 architektur exakt über die selben instruktionen und register wie die i386 architektur verfügt. desweiteren hängt es davon ab in welchen modus das betriebssystem den prozessor geschaltet hat. so existieren auf der x86_64 nunmehr 3 modi:

    real mode : 16 bit
    protected mode : 32 bit
    long mode : 64 bit

    wobei es im long mode möglich ist 32bit instruktionen zu verwenden, also 32bit programme unter 64bit betriebsystemen auszuführen. abhängig vom modus in dem der prozessor gestartet ist (welches das betriebsystem beim booten übernimmt) stehen dir dann instruktionen zur verfügung oder eben nicht.



  • Aber warum beschwert er sich dann bei mir, dass gewisse Befehle nur unter i386 und nicht unter x86-64 vorhanden wären?(push, pop, pusha, popa vermutlich aber auch noch andere)



  • Zahnersatz schrieb:

    Aber warum beschwert er sich dann bei mir, dass gewisse Befehle nur unter i386 und nicht unter x86-64 vorhanden wären?(push, pop, pusha, popa vermutlich aber auch noch andere)

    ich bin mir jetzt nicht sicher, aber im falle der stackoperationen ist dies eine ausnahme :). pusha und popa existieren in der tat nicht mehr, zumindest wenn der prozessor im long mode läuft. push/pop sollten dennoch funktionieren, abhängig in welcher syntax du programmierst (intel oder at&t?) ist es glaube ich auch notwendig die breite in der instruktion anzugeben. also zum beispiel um einen 64bit wert zu sichern "pushl %rax". zieh dir die spezifikationen von amd rein! 😛
    http://www.amd.com/de-de/Processors/TechnicalResources/0,,30_182_739_7044,00.html


Anmelden zum Antworten