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.
['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). –
Inoltre, se hai stampato i tuoi numeri come esadecimale, sarebbe molto meno confuso/più ovvio cosa sta succedendo. –
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. –