2010-04-22 12 views
8

Quando uso ADC per exmaple:ADC in ASM 8086

AL = 01 and BL = 02, and CF = 1 

quando faccio questo:

ADC AL,BL 

Sarà AL essere 3 o 4? (Con l'aggiunta CF o senza?)

+4

Prova e prendi l'abitudine di provare queste cose per te stesso: è un ottimo modo per imparare. –

+0

+1 Paul R. Tal, imparerai molto più velocemente e otterrai risultati molto più accurati se testerai queste cose da solo. Nel momento in cui ti è stato chiesto di inserire questa domanda e di chiarire le cose nelle varie risposte seguenti, avresti potuto testare ogni singolo scenario e avere una risposta definitiva, imparando tutte le cose fondamentali su CPU, registri e flag. –

risposta

3

AL saranno 4. ADC mezzi add with carry, così naturalmente il riporto è riassunta in. CF viene impostata a 0, poiché non v'è alcuna effettuare dell'addizione in domanda.

+0

e se faccio questo: AX = FF, BX = FF, CF = 1 e ADC AX, BX Cosa succederà? Voglio dire, dove sarà il computer a memorizzare il byte in più? Grazie!! – Tal

+1

@Tal, AX e BX sono in grado di memorizzare più di un byte (dal momento che non si utilizzano registri a byte singolo come AL e BL qui!) Quindi il risultato sarà '1FF' in AX e, di nuovo, CF in 0. –

3

Sarà 4. ADC (aggiungi con carry) aggiunge 1 in più se il flag di trasporto (CF) è 1. Vedere la descrizione completa dell'opcode here.

9

alcune cose circa l'istruzione 8086ADC:

Syntax: adc dest, src 
dest: memory or register 
src: memory, register, or immediate 
Action: dest = dest + src + CF 

chiaramente l'azione, dice il flag di riporto (CF) sarà incluso nel l'aggiunta in modo che il risultato sarà non 43.

+0

e cosa succede se faccio questo: AX = FF, BX = FF, CF = 1 e ADC AX, BX Cosa succederà? Voglio dire, dove sarà il computer a memorizzare il byte in più? Grazie !! – Tal

+0

@Tal: Se lo fai, AX sarà 0x01FF e CF sarà 0. Non ci sono byte extra. –

3

non è diverso che aggiungere nella base di 10.

 
99 
+11 

9+1 is zero carry the 1 
9+1+carry is 1 carry the 1 

Il risultato di quanto sopra matematica decimale è 10 con un riporto di 1, o 110 se si vuole pensare in questo modo.

Ad inizio binario con un un bit sommatore, ecco una tabella di verità:

 
000 0 0 
001 0 1 
010 0 1 
011 1 0 
100 0 1 
101 1 0 
110 1 0 
111 1 1 

colonna di sinistra di tre bit sono le combinazioni di ingresso, due operandi e portare in, seconda colonna è svolgere e la terza colonna è il risultato

così 1 + 1 con alcun riporto è di 110 nella colonna di sinistra e il risultato è 0 portano il 1.

Non

affatto differente che la matematica decimale sopra solo molto più semplice, quando aggiungi una colonna in decimale, operando a, operando b, porto. Il risultato è la risposta modulo 10 e il carry è il risultato/10. copia il carry nella parte superiore della colonna successiva e ripeti per sempre. come dimostrato con 99 + 11 o 999 + 111, ecc.

Per semplificare l'aggiunta di due bit senza trasferimento, il risultato è l'xor degli ingressi e l'esecuzione è il e dei due ingressi. È possibile implementare add con carry utilizzando due add senza portatori concatenati o eseguirli direttamente. Il risultato è impostato quando c'è un numero dispari di onces o parità dispari, che è due xors r = a xor b xor carry in. Il carry out con cui sto lottando al momento forse qualcuno può aiutare.

così un 0xFF + 0xFF 8 bit con riporto set darà

 
     1 
11111111 
+11111111 

Questo dimostra 0xff + 0xff con un "portare quella" in arrivo prima di iniziare.

sguardo esso una colonna alla volta da destra, proprio come la matematica decimale

 
1+1+1 = 1 carry the 1 
next column 
1+1+1 = 1 carry the 1 
... 

questo continua e si finisce con 0xFF con il bit di riporto fissato

Quindi, se si aveva solo un 8 bit aggiungi con carry potresti sommare due numeri larghi quanto hai memoria.

consente di guardare un 16 bit aggiuntivo:

 
0x1234 
+0xABCD 

Si può solo fare la matematica con un 16 bit aggiungere, 0xBE01.

o con una vipera a 8 bit:

 
clear the carry bit 
add with carry 0x34+0xCD result 0x01 carry set 
add with carry 0x12+0xAB result 0xBE carry clear 

Quindi la risposta è 0xBE01

o utilizzando un 4 bit vipera se tutto quello che hai è un 4 bit alu

 
clear the carry bit 
add with carry 0x4+0xD = 0x1 carry bit set 
add with carry 0x3+0xC = 0x0 carry bit set 
add with carry 0x2+0xB = 0xE carry bit clear 
add with carry 0x1+0xA = 0xB carry bit clear 

di nuovo il risultato 0xBE01 porta bit clear

potremmo farlo anche con bit singoli o con un sommatore a 3 bit, così lungo poiché è binario, è banale.

Tutti i processori utili devono avere un modo per aggiungere il bit di trasporto in modo da poter allargare l'alu. A volte ci sono add-on e add separati, alcuni l'adc è un passo in più o il più doloroso sarebbe un add senza carry e usa un ramo se è chiaro con un add immediato sotto.

Questo è anche il motivo per cui gli spostamenti o le rotazioni ruotano attraverso il bit di trasporto, in modo da poter eseguire uno spostamento di spostamento più ampio della larghezza di un registro/posizione di memoria.

La moltiplicazione binaria è dolorosamente semplice rispetto al decimale, ma ti risparmierò quella e ti farò pensare.

Sì, si potrebbe avere e dovrebbe aver scritto un programma per provare questo. E ancora posso, potrei intenzionalmente guidarti lungo un percorso di disinformazione.