Codifica delle istruzioni semplici
Prendiamo le seguenti istruzioni di assemblaggio:
add %cl,%bl
Questo viene codificato come:, 00 cbo 00000000 11001011in binario. Mettere il cbnei campi di bit Modr / M, sembra che:
1 1 0 0 1 0 1 1
+---+---+---+---+---+---+---+---+
| mod | reg | r/m |
+---+---+---+---+---+---+---+---+
E, guardando il campo del registro qui otteniamo:
- mod:
11(Registra modalità di indirizzamento) - reg:
001(registro cl) - r / m:
011(registro bl)
E credo 000000dssia l' addistruzione, e d=s=0dal momento che sono tutti registri. È questa una corretta comprensione di come questa istruzione è codificata? Inoltre, per lo schema di "codifica completa", sarebbe accurato quanto segue (in byte non in bit):
[empty] 0x0 0b11001011 [empty] [empty] [empty]
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Prefix Instruction Mod-reg-r/m Scale displacement immediate
Ci sono cose che mi mancano qui nel mio tentativo di "decodificare" le istruzioni?
Risposte
Sì, sembra giusto.
Il modello generale (per le istruzioni ALU "legacy" che risalgono a 8086) per la codifica op r/m, rvs. op r, r/m, e 8 bit vs. 16/32 bit utilizza i 2 bit bassi del byte del codice operativo in uno schema regolare, ma non ce n'è bisogno fare affidamento su quello.
Intel documenta completamente esattamente cosa sta succedendo per ogni codifica di ogni istruzione nel loro manuale vol.2. Vedere la colonna Op / En e la tabella di codifica degli operandi addper esempio. (Guarda anchehttps://ref.x86asm.net/coder64.htmche specifica anche quale operando è quale per ogni codice operativo). Entrambi ti consentono di sapere quali codici operativi accettano un byte ModRM e quali no.
Questi ovviamente usano l'ordine della sintassi Intel. Stai rendendo la tua vita più complicata cercando di seguire manuali e tutorial mentre usi la sintassi AT&T che inverte l'ordine dell'elenco degli operandi rispetto ai manuali Intel e AMD.
ad esempio 00 /rè elencato come MRcodifica degli operandi, che dalla tabella possiamo vedere è l'operando 1 = ModRM:r/m (r, w), quindi è letto e scritto e codificato dal r/mcampo. operando 2 = ModRM:reg (r), quindi è una sorgente di sola lettura codificata dal regcampo.
Fatto divertente: 00 00è add [rax], al, o AT&Tadd %al, (%rax)
Nota che puoi chiedere a GAS di scegliere una delle due codifiche: x86 XOR opcode differenze
{load} add %cl,%bl # 02 d9
{store} add %cl,%bl # 00 cb
Vedi anche Differenza tra MOV r / m8, r8 e MOV r8, r / m8