Quante aggiunte ALU sono necessarie per aggiungere tre numeri?

0

Fornisci i motivi della tua risposta.

Come ho scoperto, sono necessarie due aggiunte. Questo perché ogni numero da aggiungere deve essere modificato in binario. Quindi viene aggiunta l'aggiunta tra due numeri binari in cui viene utilizzato il gate XOR per l'aggiunta. Quando è richiesto un carry bit, è necessario un gate AND per aggiungere il bit di carry alla riga successiva. Pertanto se vengono aggiunti più di 3 numeri binari, possono esserci più di un bit di trasferimento e il gate AND non lo supporta.

Ho ragione o sto confondendo tutto e niente ha senso?

Grazie per il tuo tempo.

    
posta user2695507 31.08.2013 - 09:26
fonte

1 risposta

2

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.

    
risposta data 31.08.2013 - 14:32
fonte

Leggi altre domande sui tag