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