2011-09-06 12 views
5

Va bene, così ho a che fare con il seguente frammento di codice:risultati strano con movzwl,% ascia e valori negativi

push %ebp 
mov %esp,%ebp 
push %ebx 
mov 0x8(%ebp),%eax 
movzwl %ax,%edx 

Quindi questo si comporta come previsto quando si tratta di valori positivi. Il valore copiato in% edx è il trailing 16 bit di% eax (o% ax).

Tuttavia, se si inserisce un numero negativo, tutto inizia a diventare strano e non sembra comportarsi come previsto.

Per esempio, se il valore di% eax è -67.043.552, allora il valore copiato in% edx è 65312.

Sono abbastanza nuovo per il montaggio, mi dispiace se questo è un errore di interpretazione evidente da parte mia. Qualsiasi aiuto sarebbe molto apprezzato.

+0

['movswl'] (http://www.felixcloutier.com/x86/MOVSX:MOVSXD.html) è disponibile quando si desidera firmare-estendere il valore firmato del complemento a 2 anziché estendere a zero valore senza segno binario. (Vedi anche [wiki tag x86] (http://stackoverflow.com/tags/x86/info). –

+0

Inoltre, se hai stampato i tuoi numeri come esadecimale, sarebbe molto meno confuso/più ovvio cosa sta succedendo. –

+0

Inoltre, a meno che tu non abbia effettivamente bisogno del valore completo in '% eax', dovresti' movzwl 0x8 (% ebp),% edx' direttamente invece di sprecare un'istruzione che lo faccia separatamente.Le CPU Intel possono gestire 'movzx' /' movsx' come solo un load uop, senza ALU richiesta. –

risposta

16

Ricordare che movzwl copia solo i bit in %ax in %edx riempiendo i 16 bit alti di %edx con zero.

Così %edx finisce sempre con un numero positivo minore o uguale a 65535.

In dettaglio: -67043552 in esadecimale è fc00ff20. Quindi se questo è in %eax, quindi %ax contiene ff20. Se si sposta in %edx con estensione zero, quindi %edx diventa 0000ff20. Quello è 65312.

Problemi correlati