View Full Version : programmazione assembly Istruzione ADC
Salve a tutti,
Volevo capire bene come funziona l'istruzione ADC in assembly...
Qualcuno puo' farmi un esempio numerico?
Grazie.
Salve a tutti,
Volevo capire bene come funziona l'istruzione ADC in assembly...
Qualcuno puo' farmi un esempio numerico?
Grazie.
il mio libro di sistemi dice: l'istruzione ADC esegue l'addizione tenendo conto anche del riporto nell'istruzione precedente.
ADC operando1, operando 2
destinazione=destinazione+sorgente+valore del flag di carry
purtroppo esempi non ce ne sono..
Salve a tutti,
Volevo capire bene come funziona l'istruzione ADC in assembly...ADC – Add with Carry
DEST <— DEST + SRC + CF
Qualcuno puo' farmi un esempio numerico?In genere una ADC è molto utile per fare somme a "precisione multipla". Esempio:
VAL1 DD 12345678h
VAL2 DD 0000ABCDh
RES DD ?
....
MOV AX,[WORD PTR VAL1]
MOV DX,[WORD PTR VAL1+2]
ADD AX,[WORD PTR VAL2]
ADC DX,[WORD PTR VAL2+2]
MOV [WORD PTR RES],AX
MOV [WORD PTR RES+2],DX
In RES si ottiene il valore 12350245h. La somma dei 16 bit bassi ha prodotto un carry che è stato aggiunto con la ADC nella somma dei 16 bit alti.
Ciao,
nn sono molto esperto di assembly come avrete capito...
Volevo capire meglio il funzionamento di questa istruzione...
Ad esempio se ho tre variabili:
var1= 10100000
var2= 01011001
var3= 11100001
facendo :
add var1,var2
mov ax,var1
adc ax,var3
Quale sara' il risultato??
In pratica che faccio quando ce adc...addiziono i due termini e se ce riporto aggiungo uno???
Grazie.
Ciao,
nn sono molto esperto di assembly come avrete capito...
Volevo capire meglio il funzionamento di questa istruzione...
Ad esempio se ho tre variabili:
var1= 10100000
var2= 01011001
var3= 11100001
facendo :
add var1,var2
mov ax,var1
adc ax,var3
Quale sara' il risultato??Innanzitutto due cose: le istruzioni x86 con 2 operandi non possono avere entrambi gli operandi in memoria, quindi una add var1,var2 non esiste e non è fattibile. Seconda cosa, i valori binari di esempio che hai indicato sono su 8 bit e usando i registri a 16 bit non ottieni alcun carry.
Come ho già detto nel post precedente, uno degli utilizzi più tipici della ADC è nelle somme a "precisione multipla".
Quindi allora....(scusami ma nn sono molto ferrato)
Ti spiego ho un compito e tra i possibili spezzoni di codice ci sarà anche il calcolo di un valore finale che passa per un adc.
Ho due valori a 16 bit...
Io faccio la somma tra questi valori e se ce un carry sommo uno al risultato??
Non so potresti farmi un esempio proprio numerico semplice semplice giusto per vedere l'operazione da fare??
Ti faccio un esempio per farti capire meglio...
W11 dw 0123h
W12 dw 1102h
W21 dw 0012h
W31 dw ?
W32 dw ?
mov ah,bch
mov a1,10h
add a1,02h
sub ax,W12
add ax,W22
mov W32,ax
mov ax,W11
ADC AX,W21
MOV W31,AX
E chiede i valori finali di W31 e W32...
Quindi arrivato a ADC che faccio matematicamente?Li sommo e...
Ti Ringrazio nuovamente.:help:
Ho due valori a 16 bit...
Io faccio la somma tra questi valori e se ce un carry sommo uno al risultato??Ma ti è chiaro il concetto del "carry", cioè del riporto??
Credo di si...
dovrebbe essere quando ad esempio abbiamo
10000000+
10000000=
------------
e quindi si ha il carry no??
:help:
Credo di si...
dovrebbe essere quando ad esempio abbiamo
10000000+
10000000=
------------
e quindi si ha il carry no??Esatto, in generale la somma dei due bit più significativi con in più il carry dal bit precedente genera un nuovo carry, che è quello che poi viene memorizzato nel flag CF.
Anche situazioni del tipo:
11
01000000
11000000
---------
100000000
|
carry
Capisci quindi che non ha molto senso sommare 2 valori qualunque e poi fare una ADC tra due altri valori che non hanno alcuna relazione particolare con i primi due.
Si ma il problema è questo...ho un esame e tra i vari esercizi ce ne sarà uno simile a quello che ti ho fatto vedere...
Come devo comportarmi quando arrivo a ADC???
Sommo semplicemente i due valori e vado avanti aggiungendo il carry se ce??
Vorrei solo una spiegazione di come svolgerlo su carta...giusto per risolvere questo esercizio...
Scusami per la mia poca pratica
Ancora Grazie.
Come devo comportarmi quando arrivo a ADC???
Sommo semplicemente i due valori e vado avanti aggiungendo il carry se ce??In che senso??? ADC già di per sé aggiunge il carry se c'è.
Per esempio se date 4 variabili volessi sommarle tutte insieme e poi "accumulare" i carry su un'altra variabile, potrei fare così:
VAL_A DW 6234h
VAL_B DW 9657h
VAL_C DW 8234h
VAL_D DW 9893h
RES DW ?
CARRY DW ?
MOV CX,0
MOV AX,VAL_A
ADD AX,VAL_B
ADC CX,0
ADD AX,VAL_C
ADC CX,0
ADD AX,VAL_D
ADC CX,0
MOV RES,AX
MOV CARRY,CXAlla fine in RES ho 1352h e in CARRY ho 0002h. Vuol dire che la somma dei 4 valori ha dato un valore complessivo di 21352h.
aaaah ma allora nn ce niente di complicato....basta scrivere il risultato no?
Quindi se ce questo carry io lo scrivo normalmente e vado avanti...
Giusto??
Mentre il solo add se incontra questo carry da errore???
Ci sto arrivando sembra...ehehe
Mentre il solo add se incontra questo carry da errore???Ma no. Sia ADD che ADC generano un carry, la differenza è che ADC "riceve" un carry che aggiunge nella somma.
la differenza è che ADC "riceve" un carry che aggiunge nella somma.
mentre add nn se ne fa di niente??
:muro:
mentre add nn se ne fa di niente??
:muro:Infatti non tiene in considerazione il flag di carry prima della somma.
Per farti capire meglio le somme a precisione multipla: tu hai 2 numeri a 32 bit che sono 12648932h e 42737793h. La loro somma è 54D800C5h. Volendo fare la somma solo con operandi a 16 bit, si deve fare:
_
/ \
1 |
1264 | 8932 +
4273 | 7793 =
------ | -------
54D8 | 100C5
\_/Per fare la somma di 8932h + 7793h usi una ADD (che ci frega del carry??) mentre per fare la somma di 1264h + 4273h usi una ADC, perché così il riporto si "propaga" nella parte alta.
Chiaro adesso?
Si! ci sono!
Quindi per la parte alta e la parte bassa io divido in due il numero e li identifico pero' con quale registri (per esempio ax con ah e al giusto?)
Sei un mago sto capendo...
:) :ave:
Quindi per la parte alta e la parte bassa io divido in due il numero e li identifico pero' con quale registri (per esempio ax con ah e al giusto?)Che registri usare, dipende da dove sono i valori (se in memoria o in altri registri), questo lo devi vedere tu.
Non credo di riuscire a spiegare l'uso della ADC meglio di quanto ho fatto con il "disegnino" della somma che ho riportato sopra.
Si si dai comunque ora ho capito...
e poi con quel disegno sei stato proprio un fenomeno!
Ti Ringrazio davvero.
Ciaoooo:cincin: :winner: :)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.