Domanda

A scuola programmiamo da tempo nel linguaggio assembly MIPS. Mi interessa approfondire l'assemblaggio x86 e ho sentito che è un po 'più difficile (anche il mio libro di testo MIPS dice questo).

Quali informazioni fondamentali dovrei sapere come programmatore MIPS prima di immergermi nel mondo x86?

È stato utile?

Soluzione

Le cose più importanti da tenere a mente sono:

  • Pochi registri di uso generale e quelli che possiedi non sono GP puri: molte istruzioni richiedono di utilizzare determinati registri per uno scopo specifico.
  • Le istruzioni x86 sono in formato a due codici op anziché a tre codici che possono rendere più complesse determinate operazioni. Cioè, invece di aggiungere r0, r1, r2 (r0 = r1 + r2), aggiungi eax, ebx (eax + = ebx).
  • I segmenti in modalità protetta (tutto il codice a 32 bit al di fuori di DOS, in modo efficace) rendono il tuo schema di indirizzamento della memoria estremamente ovvio, il che può morderti nel culo quando inizi.
  • Dovrai sempre cercare le bandiere impostate / cancellate dalle istruzioni. Impara ad amare i manuali Intel.
  • Modifica, una cosa che ho dimenticato: l'uso di sottoregistratori (ad es. ah per accedere agli 8 bit alti dei 16 bit bassi del registro eax) può rendere molto difficile la manipolazione del tracciamento dei registri. Fai attenzione e commenta liberamente fino a quando non riuscirai a risolvere il problema.

A parte questo, x86 è piuttosto semplice. Quando impari ad abusare di istruzioni come "lea" e "test", impari ad amarlo. Inoltre, protip: Intel ti invierà gratuitamente copie dei manuali del set di istruzioni, non dovrai nemmeno pagare per la spedizione. Cerca nel loro sito l'e-mail di adempimento e richiedi i libri tramite SKU.

Altri suggerimenti

x86 ha un set molto limitato di registri disponibili rispetto alla maggior parte delle altre architetture. Questo in realtà non rende il linguaggio assembly più difficile da imparare, ma a volte rende più difficile implementare il codice in pratica.

Inoltre, a causa della storia x86 di forte compatibilità con le versioni precedenti, il set di istruzioni non è terribilmente simmetrico (sicuramente pre-RISC) e ci possono essere molte eccezioni alla regola e casi d'angolo a cui prestare attenzione.

x86 ha istruzioni più complesse di MIPS. Quindi esiste probabilmente un'unica istruzione per sequenze comuni in MIPS (in particolare l'indirizzamento della memoria). La mancanza di numerosi registri è certamente uno svantaggio, ma in entrambe le architetture ci sono convenzioni che limitano praticamente il numero di ciò che è possibile utilizzare liberamente fino a 4-5. Solo più pronunciato in x86. x86 ha più eccezioni per l'utilizzo dei registri rispetto ai MIPS che devi tenere a mente, ma nulla che valga la pena lamentarsi costantemente.

Parlando per esperienza, entrambe le lingue hanno circa la stessa difficoltà di apprendimento, convenzioni incluse. Forse x86 è un po 'più semplice, considerando le abbondanti risorse online e la sua popolarità.

La parte difficile di x86 è la generazione binaria, a causa delle sue istruzioni di lunghezza variabile e delle diverse modalità di indirizzamento. Molto spesso, non devi mai farlo comunque.

Posso sicuramente consigliarti di imparare un'architettura di istruzioni più complessa di MIPS.

E, questo è importante, non far parte della guerra religiosa tra RISC v.s. CISC ...

Ho imparato x86 e x86_64 a scrivere da solo un assemblatore. Se non hai intenzione di scrivere un assemblatore da solo, alcune delle cose che dirò sono praticamente inutili. Tuttavia, non conosco MIPS.

L'indirizzamento indiretto x86 è una cosa complessa. In una singola istruzione, puoi eseguire queste operazioni:

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

La loro codifica delle istruzioni è complessa per questo, ma è coerente per ogni istruzione che codifica in questo modo. Potresti voler leggere questo da sandpile.org . Se vuoi sapere di più sulla codifica, puoi sempre chiedermelo. Un'altra istruzione che codifica i dettagli fastidiosi correlati sono i prefissi. Cambiano molto il significato dell'istruzione. Ad esempio, 0x66 (se ricordo bene) di fronte e alcune istruzioni diventano per GPR a 16 bit anziché a 32 bit.

GPR a 32 bit (in ordine): eax, ecx, edx, ebx, esp, ebp, esi, edi

GPR a 64 bit: rax, rcx, rdx, rbx, rsp, rbp, rsi, rdi, r8, r9, r10, r11, r12, r13, r14, r15

Nota che ci sono pochi registri di uso generale, questo costringerà la maggior parte del software a usarlo più o meno in modo impilabile. Un dettaglio doloroso. rsp è usato per lo stack (pop, push -instructions) e anche rbp tende a essere riservato. x86_64 ha più registri, ma ci vorrà del tempo quando le persone lo adotteranno, anche se ogni singolo consumatore avesse un processore in grado di farlo.

Esistono due diversi set di istruzioni per l'aritmetica in virgola mobile. XMM è il più recente. In x86_64 sono disponibili 16 registri a 128 bit e in x86 ce ne sono solo 8. Il set di istruzioni precedente gestisce i registri come una pila. Semplicemente non hai swap, nip o rot, quindi lavorare con esso è strabiliante.

In uso x86 tende a ridursi in una macchina RISC. Alcune di queste istruzioni complesse non danno benefici o sono ancora più lente su macchine più recenti. Farai con la comprensione di circa 30-150 istruzioni a seconda di ciò che stai leggendo o scrivendo. Puoi anche ignorare completamente alcune vecchie istruzioni e AL / HL -stuff. Tieni presente che tutte le origini del disordine dietro al 1978, il che è abbastanza sorprendente, non è peggio, a 31 anni da quello e 24 anni dalla prima introduzione di IA-32. Molte cose cambiano la loro rilevanza in quel momento.

I salti diretti e le chiamate sembrano essere relativi dall'istruzione successiva in x86. Pertanto:

    jmp nowhere  # or call, jz, jg whatever...
nowhere:
    nop

Finisce codificato in "JMP imm: 0, NOP". Il jmp indiretto al registro che esegue salti assoluti. È anche bello notare che non ci sono salti condizionali indiretti dal registro, anche questo mi ha infastidito.

Questo non è tutto ciò che dovresti sapere, ma le prime cose che mi vengono in mente dalla tua domanda. Ma forse per ora puoi andare d'accordo con questi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top