Istruzioni Riferimento alla memoria Codice 0XXX 1XXX 2XXX 3XXX 4XXX 5XXX 6XXX Descrizione AC M[XXX] M[XXX] AC AC AC+ M[XXX] AC AC AND M[XXX] PC XXX If M[XXX] =0 then PC PC+1 If M[XXX] >0 then PC PC+1 Mnemonico LD XXX ST XXX ADD XXX AND XXX JMP XXX SKZ XXX SKP XXX
Istruzioni Riferimento ai registri Codice 8xxx 9xxx Axxx Bxxx Cxxx Descrizione AC AC’ AC 0 ACAC+1 V0 If V=1 then PCPC+1 Mnemonico CMP CLA INC CLV SKV dove V è un flag che vale 1 se vi è un overflow in ADD
BUS E DATA FLOW ALU ADD bus (12 bit) Memoria LD INC CLR LD AC IR(16 bit) Data Reg (MBR) (16 bit) PC (12 bit) Mem Addr Reg (MAR) (12 bit) ADD bus (12 bit) DATA bus (16 bit) Memoria CS R/W BUS E DATA FLOW ALU
Realizzazione di macro istruzioni per una AC based CPU Utilizzando una CPU con un limitato set di istruzioni è possibile realizzare delle istruzioni più complesse scomponendole in istruzioni elementari eseguibili dalla CPU. Es.1: Realizzare una macro che esegue il salto condizionale a una certa locazione di memoria (XXX) se un dato contenuto in una locazione (YYY) è diverso da zero. Il mnemonico della macro è : JNZ XXX,YYY. La CPU esegue le istruzioni elementari di salto (JMP XXX) e di skip condizionale (SKZ YYY) JMPZ XXX,YYY: SKZ YYY JMP XXX Se YYY è diverso da zero eseguo l’operazione di JMP Se YYY è zero non eseguo l’operazione di JMP
Es.2: Realizzare una macro che esegue l’OR bit a bit tra una locazione di memoria XXX e il contenuto dell’accumulatore. Il mnemonico della macro è : OR XXX. La CPU esegue le istruzioni elementari di complemento dell’accumulatore(CMP) e di AND bit a bit tra l’accumulatore e una locazione di memoria (AND XXX). Utilizzando De Morgan l’operazione di OR può essere scritta come: A+B = A·B OR XXX: CMP ST TEMP LD XXX AND TEMP Complemento AC Memorizzo AC Carico XXX sull’accumulatore Complemento il valore che era contenuto in XXX Eseguo l’AND tra AC e XXX Complemento il risultato dell’ operazione di AND N.B.: La realizzazione della macro utilizza una locazione di memoria aggiuntiva (TEMP), che dopo l’esecuzione della macro contiene un valore diverso dall’inizio. Si deve tenere conto di tale effetto collaterale (Side Effect) evitando di utilizzare la locazione TEMP per contenere dei dati!
Es.3: La CPU esegue le addizioni tra operandi a 16 bit utilizzando l’operazione ADD(XXX). Tale operazione esegue: AC AC + M[XXX] Per eseguire somme tra operandi con lunghezza multipla di 16 bit si può utilizzare una istruzione di somma con riporto (ADC XXX) che esegue: AC AC + M[XXX] +V Dove V è il flag di carry. Definiamo due operandi A e B a 32 bits memorizzate nelle locazioni XXX e XXX+1 e YYY e YYY+1. carry A AL AH BL BH B AL AH BL BH + + CL CH = XXX+1 XXX YYY+1 YYY La somma a 32 bits può essere eseguita nel seguente modo: Carico i 16 bits meno significativi di A (AL) LD XXX ADD YYY LD (XXX+1) ADC (YYY+1) Eseguo la somma tra AL e BL Carico i 16 bits più significativi di A (AH) Eseguo la somma tra AH e BH tenendo conto del riporto
Es.3: Nel caso la CPU non abbia a disposizione un’istruzione di ADC(XXX) essa si può realizzare con una macro: ADC XXX: SKV JMP L1 INC L1:ADD XXX Controlla il flag di carry: Se è 0 esegui AC AC+M[XXX] Se il flag di carry è 1 esegui AC AC+1