Memoria di programmazione dell’assemblaggio Assegnazione di EAX vs Ax, AH, AL

La mia comprensione dei registri di assembly dice che ogni registro può essere consultato dall’intero codice a 32 bit ed è suddiviso in più registri accessibili. In questo esempio, EAX è un registro a 32 bit, se chiamiamo AX dovrebbe restituire i primi 16 bit, e se chiamiamo AH o AL , dovrebbe restituire gli 8 bit successivi dopo i 16 bit e AL dovrebbe restituire gli ultimi 8 bit.

Quindi la mia domanda, perché non credo veramente sia così che funziona. Se memorizziamo un valore a 32 bit di sette … ovvero l’archiviazione EAX

 0000 0000 0000 0000 0000 0000 0000 0111 

Quindi se chiamiamo AX dovrebbe tornare

 0000 0000 0000 0000 

se chiamiamo AH dovrebbe tornare

 0000 0000 

e quando chiamiamo AL dovrebbe tornare

 0000 0111 

È corretto? e se è questo il valore che fornisce veramente la chiamata ad AH ?

No, non è giusto.

 EAX is the full 32-bit value AX is the lower 16-bits AL is the lower 8 bits AH is the bits 8 through 15 (zero-based) 

Modificare:

Per completezza, oltre a quanto sopra, basato su una CPU a 32 bit, le CPU Intel / AMD a 64 bit hanno

 RAX, which hold a 64-bit value, and where EAX is mapped to the lower 32 bits. 

AX è i 16 bit inferiori di EAX. AH sono gli 8 bit alti di AX (ovvero i bit 8-15 di EAX) e AL è il byte meno significativo (bit 0-7) di EAX e AX.

Esempio (cifre esadecimali):

 EAX: 12 34 56 78 AX: 56 78 AH: 56 AL: 78 

no your ans è sbagliato

La selezione di Al e Ah è da AXE non da EAX

per esempio

 EAX=0000 0000 0000 0000 0000 0000 0000 0111 

Quindi se chiamiamo AXI dovrebbe tornare

 0000 0000 0000 0111 

se chiamiamo AH dovrebbe tornare

 0000 0000 

e quando chiamiamo AL dovrebbe tornare

 0000 0111 

Esempio numero 2

 EAX: 22 33 55 77 AX: 55 77 AH: 55 AL: 77 

esempio 3

 EAX: 1111 0000 0000 0000 0000 0000 0000 0111 AX= 0000 0000 0000 0111 AH= 0000 0000 AL= 0000 0111 

No – AL sono gli 8 bit meno significativi di AX. AX è il 16 bit meno significativi di EAX.

Forse è più facile da gestire se iniziamo con 04030201h in eax. In questo caso, AX conterrà 0201h, AH wil contiene 02h e AL conterrà 01h.

Lo snippet seguente esamina EAX utilizzando GDB.

  (gdb) info register eax eax 0xaa55 43605 (gdb) info register ax ax 0xaa55 -21931 (gdb) info register ah ah 0xaa -86 (gdb) info register al al 0x55 85 
  1. EAX: valore completo a 32 bit
  2. AX – valore inferiore a 16 bit
  3. AH – Bit da 8 a 15
  4. AL – inferiore 8 bit di EAX / AX