2009-01-17 14 views
11

In der Schule programmieren wir seit einiger Zeit in der MIPS-Assemblersprache. Ich bin daran interessiert, in die x86-Montage einzutauchen und ich habe gehört, dass das etwas schwieriger ist (sogar mein MIPS-Lehrbuch sagt das).Was sollte ich wissen, wenn ich von MIPS auf x86-Assembly umschalte?

Welche Kerninformationen sollte ich als MIPS-Programmierer kennen, bevor ich in die x86-Welt eintauchen kann?

Antwort

14

Die größten Dinge im Auge zu behalten sind:

  • Wenige Universalregister, und die, die Sie haben noch keine reine GP - viele Befehle benötigen Sie bestimmen Register für einen bestimmten Zweck zu verwenden.
  • X86-Anweisungen sind zwei-Opcode-Form statt Drei-Opcode, die bestimmte Operationen komplexer machen können. Das heißt, anstelle von add r0, r1, r2 (r0 = r1 + r2) addieren Sie eax, ebx (eax + = ebx).
  • Segmente im geschützten Modus (alle 32-Bit-Code außerhalb von DOS, effektiv) machen Ihr Speicheradressierungsschema extrem nicht offensichtlich, die Sie in den Arsch beißen können, wenn Sie beginnen.
  • Sie werden ständig die Flaggen nachschlagen. Lernen Sie die Intel Handbücher zu lieben.
  • Edit, eine Sache, die ich vergessen: Die Verwendung von Unterregistern (z. B. ah auf die hohen 8 Bits der niedrigen 16-Bits des eax-Registers zuzugreifen) können Tracking-Manipulationen zu Ihren Registern sehr schwierig machen. Seien Sie vorsichtig und kommentieren Sie großzügig, bis Sie die Dinge erledigt haben.

Abgesehen davon ist x86 ziemlich geradlinig. Wenn Sie lernen, Anweisungen wie "lea" und "test" zu missbrauchen, lernen Sie, es zu lieben. Auch, protip: Intel schickt Ihnen Kopien der Anweisungssatzhandbücher kostenlos, muss nicht sogar für den Versand bezahlen. Suchen Sie auf der Website nach der Erfüllungs-E-Mail und fordern Sie die Bücher nach SKU an.

+0

Sie können die CD [hier] bestellen (https://secure.hibbertgroup.com/intel/spm?programId=1). Die Hardcopy wird leider nicht mehr angeboten. – new123456

+1

Der x86 Befehlssatz wird am besten von Archäologie verstanden, ich finde - wenn Sie gesehen haben, was eine 8080 hat, wie das vage das Design einer 8088 beeinflusst, und schließlich, wie die 386 Dinge an der Spitze hinzugefügt hat, macht alles Sinn. Ansonsten scheinen die Regeln ein wenig willkürlich. – ijw

5

x86 hat im Vergleich zu den meisten anderen Architekturen eine sehr begrenzte Anzahl verfügbarer Register. Dies macht die Assemblersprache nicht wirklich schwieriger zu erlernen, erschwert aber manchmal die Implementierung von Code in der Praxis.

Auch wegen der x86-Geschichte der starken Rückwärtskompatibilität, ist der Befehlssatz nicht schrecklich symmetrisch (definitiv Vor-RISC) und es kann viele Ausnahmen geben, um die Regel und Ecken Fälle zu beachten.

+0

Ja, aber es ist nicht so begrenzt im Vergleich zu MIPS. :) – BobbyShaftoe

+3

@BobbyShaftoe, bist du ein Assembly-Programmierer? MIPS hat 32 allgemeine Register und x86 hat 8, soweit ich weiß. – mmcdole

1

x86 haben komplexere Anweisungen als MIPS. So gibt es wahrscheinlich eine einzige Anweisung für gemeinsame Sequenzen in MIPS (vor allem Speicheradressierung). Der Mangel an zahlreichen Registern ist sicherlich ein Nachteil, aber in beiden Architekturen gibt es Konventionen, die die Anzahl der Dinge, die Sie frei verwenden können, auf bis zu 4-5 beschränken. Deutlich ausgeprägter in x86. x86 hat mehr Ausnahmen für die Verwendung von Registern als MIPS, die Sie im Hinterkopf behalten müssen, aber nichts, worüber Sie sich ständig ärgern sollten.

Aus Erfahrung sagen, hat jede Sprache etwa die gleiche Schwierigkeit zu lernen, einschließlich der Konventionen. Vielleicht x86 ist ein bisschen einfacher, unter Berücksichtigung der reichlich vorhandenen Online-Ressourcen und seiner Popularität.

Der schwierige Teil über x86 ist die Generierung von binären, wegen seiner variablen Länge Befehle und mehrere Adressierungsmodi. Meistens müssen Sie es nie tun.

Ich kann Ihnen sicherlich eine komplexere Befehlsarchitektur als MIPS empfehlen.

Und das ist wichtig, nicht ein Teil des religiösen Krieges zwischen RISC vs. CISC ...

1

Ich habe x86 und x86_64 gelernt, um selbst einen Assembler zu schreiben. Wenn Sie nicht selbst einen Assembler schreiben, dann ist einiges von dem, was ich erzählen werde, ziemlich nutzlos. Ich weiß selbst nichts über MIPS.

x86 indirekte Adressierung ist eine komplexe Sache. In einer einzigen Anweisung, können Sie diese tun:

mov reg, [reg+offset] 
mov reg, [reg*scale+base register+offset] # in where scale can be 1, 2, 4 or 8. 

Ihre Befehlscodierung, weil dieser Komplex ist, aber es ist konsistent für jede Anweisung, die auf diese Weise kodiert. Vielleicht möchten Sie dies von sandpile.org lesen. Wenn Sie mehr über die Kodierung wissen wollen, können Sie immer danach fragen. Ein weiteres Instruktionscodierungs-bezogenes störendes Detail sind die Präfixe. Sie ändern die Bedeutung der Anweisung sehr. Zum Beispiel, 0x66 (wenn ich mich recht erinnere) vorne und einige Anweisungen werden für 16bit GPRs anstelle von 32bit Einsen.

32bit GPRs (in Reihenfolge): EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI

64bit GPRs: Rax, RCX, RDX, RBX, RSP, RBP, rsi, RDI, r8 , r9, r10, r11, r12, r13, r14, r15

Beachten Sie, wie wenig allgemeine Register gibt es, wird dies die meisten Software zwingen, es mehr oder weniger in einer Stapel-Maschine Manieren-Art zu verwenden. Ein schmerzhaftes Detail. rsp wird für den Stack verwendet (pop, push -instructions), und rbp ist tendenziell ebenfalls reserviert. x86_64 hat mehr Register, aber es wird Zeit brauchen, bis die Leute es übernehmen werden, selbst wenn jeder einzelne Verbraucher einen Prozessor dazu hat.

Es gibt zwei verschiedene Befehlssätze für Gleitkommaarithmetik. XMM ist der neuere. In x86_64 stehen 16 128-Bit-Register zur Verfügung und in x86 sind es nur 8. Der ältere Befehlssatz behandelt Register als Stapel. Sie haben einfach keinen Swap, Nip oder Fäulnis, also ist das Arbeiten mit ihm überwältigend.

In Verwendung neigt x86 dazu, in eine RISC-Maschine zu reduzieren. Einige dieser komplexen Anweisungen bieten keine Vorteile oder sind auf neueren Maschinen noch langsamer. Sie werden mit dem Verständnis von 30-150 Anweisungen abhängig davon, was Sie lesen oder schreiben. Sie können auch einige alte Anweisungen und AL/HL-stuff komplett ignorieren. Denken Sie daran, alle Clutter-Ursprünge hinter 1978, das ist ziemlich überraschend, es ist nicht schlimmer, 31 Jahre davon und 24 Jahre nach der ersten Einführung von IA-32. Viele Dinge ändern ihre Relevanz in dieser Zeit.

Direkte Sprünge und Aufrufe scheinen relativ zur nächsten Anweisung in x86 zu sein. Daher:

Endet nach 'JMP imm codiert: 0, NOP'. Der register-indirekte jmp, der absolute Sprünge macht. Es ist auch gut zu bemerken, dass es keine registerindirekten bedingten Sprünge gibt, es störte mich auch.

Hier ist nicht alles möglich, was Sie wissen sollten, aber das erste Zeug, das mir aus Ihrer Frage einfällt. Aber vielleicht kommst du jetzt erstmal mit ihnen klar.

Verwandte Themen