2013-03-03 12 views
16

La mia comprensione dei registri di assiemi indica che a ogni registro è possibile accedere tramite l'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.Memoria di programmazione assiemi Assegnazione di EAX a Ax, AH, AL

Quindi la mia domanda, perché non credo veramente, è così che funziona. Se abbiamo memorizzare un valore a 32 bit di sette anni ... alias EAX memorizzazione

0000 0000 0000 0000 0000 0000 0000 0111 

Quindi, se chiamiamo AX deve restituire

0000 0000 0000 0000 

se lo chiamiamo AH deve restituire

0000 0000 

e quando chiamiamo AL deve restituire

0000 0111 

È corretto? e se è questo valore fornisce veramente la chiamata a AH?

+0

No, il valore per AX è sbagliato. Hack off gli ultimi 16 bit. AH restituisce semplicemente i bit da 8 a 15 di EAX. –

+1

si prega di sostituire il modello di bit con qualcosa che è più facile da capire int il contesto della tua domanda es: 0000 0001 0010 0011 ... –

risposta

33

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) 

Edit:

Per completezza, in aggiunta a quanto sopra, che era 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. 
+0

Quindi diresti che il mio fraintendimento verrebbe da Axe tra i primi 16, ma invece una chiamata ad un valore contenente sia Al che Ah? – Randy

+0

Grazie per l'aiuto, questo ha chiarito molto. Un errore così stupido – Randy

+0

come si chiamano i 16 bit più alti e 32 bit più alti? C'è un EAXH o AXH? – user97662

4

No - AL è l'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.

18

AX sono i 16 bit inferiori di EAX. AH sono gli 8 bit alti di AX (cioè 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

4

no.your ANS è Sbagliato

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

e.g

EAX=0000 0000 0000 0000 0000 0000 0000 0111 

Quindi, se chiamiamo AX deve restituire

0000 0000 0000 0111 

se lo chiamiamo AH deve restituire

0000 0000 

e quando lo chiamiamo AL deve restituire

0000 0111 

numero di esempio 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 
+1

Qualche cosa da fare con endian? Se faccio 'movl $ 0x01% eax' assemblando con _GAS_, quali saranno i valori di'% ax' e '% al' essere? Uno o zero? –

+0

@FrozenFlame: No, endianness si applica solo alla memoria (incluso il modo in cui l'istruzione 'mov $ imm32,% eax' è codificata, come' opcode 01 00 00 00'.). Il valore in% al sarà '1'. Spostamento a sinistra% eax funziona se si pensa all'MSB a sinistra, LSB a destra all'interno del registro. (Questo può essere complicato per i registri vettoriali, vedi https://stackoverflow.com/questions/41351087/convention-for-displaying-vector-registers) –

3

Il frammento di seguito 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 Figura 32 bit
  2. AX - basso valore a 16 bit
  3. AH - bit da 8 a 15
  4. AL - 8 bit inferiori di EAX/AX
+0

puoi anche stampare i registri in gdb con 'p/x $ eax' (o ometti il ​​'/ x' per i decimali). E modificali con 'set $ eax = 0xdeadbeef', IIRC. Vedi anche la parte inferiore del [wiki tag x86] (https://stackoverflow.com/tags/x86/info) per alcuni suggerimenti su gdb per asm. –

Problemi correlati