PDA

View Full Version : programmazione assembly Istruzione ADC


pmhwp
15-04-2007, 09:26
Salve a tutti,
Volevo capire bene come funziona l'istruzione ADC in assembly...
Qualcuno puo' farmi un esempio numerico?

Grazie.

ndakota
15-04-2007, 09:39
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..

andbin
15-04-2007, 11:05
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.

pmhwp
16-04-2007, 17:21
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.

andbin
16-04-2007, 19:56
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".

pmhwp
16-04-2007, 20:34
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:

andbin
16-04-2007, 20:39
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??

pmhwp
16-04-2007, 20:45
Credo di si...
dovrebbe essere quando ad esempio abbiamo
10000000+
10000000=
------------
e quindi si ha il carry no??

:help:

andbin
16-04-2007, 20:57
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.

pmhwp
16-04-2007, 21:00
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.

andbin
16-04-2007, 21:15
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.

pmhwp
16-04-2007, 21:22
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

andbin
16-04-2007, 21:29
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.

pmhwp
16-04-2007, 21:35
la differenza è che ADC "riceve" un carry che aggiunge nella somma.

mentre add nn se ne fa di niente??
:muro:

andbin
16-04-2007, 21:40
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?

pmhwp
16-04-2007, 21:47
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:

andbin
16-04-2007, 21:50
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.

pmhwp
16-04-2007, 21:53
Si si dai comunque ora ho capito...
e poi con quel disegno sei stato proprio un fenomeno!

Ti Ringrazio davvero.
Ciaoooo:cincin: :winner: :)