La risposta è "dipende", perché la domanda è ambigua come formulato.
Come hai osservato, puoi aggiungere due numeri qualsiasi (che definirò come "non firmato e che si inserirà in un registro della CPU") e farla franca con un singolo bit di trasporto perché è tanto quanto è necessario per aggiungere i due i più grandi valori possibili. In un mondo a 8 bit, aggiungendo 0xFF
e 0xFF
si ottiene il net 0x1FE
, verrà mantenuto un valore maggiore di un registro, motivo per cui le CPU hanno bit di trasferimento. Aggiungi un valore grande aggiuntivo ( 0x1FE
+ 0xFF
) e ti trovi in 0x2FD
, che richiede un secondo bit di carry che non hai. Questo è il posto dove smettere di scherzare con un singolo carry bit e utilizzare invece un intero registro per contare i carry. Questo ti dà il numero di 16 bit necessario per contenere il risultato.
Ecco un po 'di assembly per la 6502 , una CPU a 8 bit progettata negli anni '70, che dimostra come è fatta. Stiamo usando due dei suoi registri, X
per contenere i bit superiori e A
per contenere i bit più bassi del risultato a 16 bit. Scopriremo anche che stiamo scrivendo il codice per aggiungere tre numeri che conosciamo in anticipo e che non stiamo facendo nulla di particolare per risparmiare spazio.
; Preparation
LDX #0 ; Clear the high-order bits by loading zero into X.
LDA #11 ; Load first number directly into A, no add required.
CLC ; Clear the carry flag.
; Adding of second number
ADC #22 ; Add the second number to A, with carry.
BCC THIRD ; If carry is clear, no overflow. Branch to THIRD
INX ; Carry was set, increment the high-order bits.
CLC ; Leave the carry flag clear before the next addition
; Adding of third number
THIRD: ADC #33 ; Add the third number to A, with carry.
BCC THEEND ; No carry. We're done.
INX ; Carry was set. Increment the high-order bits.
THEEND: RTS ; Return with the 16-bit result in X and A.
Se le costanti ( 11
, 22
e 33
) possono essere qualsiasi numero, il caso peggiore è che si eseguono due istruzioni ADC
e due INX
per un totale di quattro usi dell'ALU . Il caso migliore non è carry, il che significa solo due aggiunte. Noterai che ci sono solo due aggiunte e non tre, perché il primo è sempre aggiunto a zero e può quindi essere caricato direttamente in un registro senza usare l'ALU.
In una routine più generale, inizieresti azzerando il tuo numero a 16 bit accumulato e dovendo usare l'ALU una volta (senza carry) o due (carry) per addizione. Il caso peggiore per aggiungere tre numeri diventa sei e il caso migliore è tre.