Sto imparando 80386 da PC Assembly by paul caurterproblema nel capire mul & istruzioni IMUL del linguaggio Assembly
mul source
- Se l'operando è byte di dimensioni, che viene moltiplicato per il byte nel registro AL e il risultato viene memorizzato in i 16 bit di AX.
multa.
- Se la sorgente è 16 bit, è moltiplicata per la parola in AX ed il risultato 32 bit è memorizzato in DX: AX.
Q1: Perché DX: AX? Perché non può essere archiviato in EAX/EDX?
imul
è davvero confusa
imul dest, source1
imul dest, source1, source2
alt text http://img697.imageshack.us/img697/8976/imul.gif
ho problema nella comprensione del tavolo.
Q2: nella seconda voce della tabella. Ancora una volta, perché DX: AX. Perché non EAX o EDX?
Ora consideriamo seguente frammento di codice:
imul eax ; edx:eax = eax * eax
mov ebx, eax ; save answer in ebx
mov eax, square_msg ; square_msg db "Square of input is ", 0
call print_string ; prints the string eax
mov eax, ebx
call print_int ; prints the int stored in eax
call print_nl ; prints new line
Q3: suo previsously detto che The notation EDX:EAX means to think of the EDX and EAX registers as one 64 bit register with the upper 32 bits in EDX and the lower bits in EAX.
Quindi la risposta si trova anche nella edx, giusto? nel codice precedente non abbiamo considerato alcun EDX ci riferiamo solo a EAX Come funziona ancora?
Q4: Ho problemi con il resto di tutte le voci nella tabella. il caso peggiore di moltiplicazione di due numeri n bit (n = 8/16/32 bit) è 2n bit. Come mai la sua memorizzazione del risultato di due risultati di moltiplicazione 16/32 bit nel registro della stessa dimensione stessa?
@ Q3: lo sapevo. questo è il codice di quel libro di Paul Carter. Puoi dirmi come dovrebbe essere il codice? Sono confuso su come stampare il risultato. – claws
Il codice fornito è solo un esempio; il testo dovrebbe indicare da qualche parte che non calcolerà correttamente il quadrato se l'input è al di fuori dell'intervallo previsto. Dato che stai chiamando una funzione 'print_int' per stampare un intero a 32 bit, vedi se riesci a trovare una funzione' print_int64' per stampare un intero a 64 bit. –
@ Q4: Sì, è così che dovrebbe essere, ma la tabella dice che la moltiplicazione a 16 bit è memorizzata in un risultato a 16 bit. 4a voce: 'dest * = source1' => dest = dest * source1; dest è 16 bit e source1 è 16 bit. Ed è lo stesso caso per tutte le voci della tabella. anche l'ultima entry source1 e source2 sono a 32 bit e dest è anche a 32 bit. – claws