Durante la discussione avvenuta il 23-05 in laboratorio è stata proposta da Ghezzi & Rossi la seguente soluzione per la realizzazione di IFGT ifgt1 MAR = SP = SP - 1; rd ifgt2 OPC = TOS ifgt3 TOS = MDR ifgt4 N = OPC; if (N) goto F; else goto ifgt5 ifgt5 Z = OPC; if (Z) goto F; else goto T Il micro assemblatore ha generato parecchi errori. La spegazione è contenuta nelle righe finali del Tanenbaun, a pag. 228. Quando si usa if (Z) goto l1; else goto l2 l1 ed l2 devono soddisfare la seguente condizione: l1 deve essere maggiore di l2 di esattamente 256 byte. Sarà compito del microassemblatore trovare due indirizzi che verificano la condizione indicata. Nel sorgente mic1 ci sono però altre istruzioni if così costruite: ifeq1 MAR = SP = SP - 1; rd // Read in next-to-top word of stack ifeq2 OPC = TOS // Save TOS in OPC temporarily ifeq3 TOS = MDR // Put new top of stack in TOS ifeq4 Z = OPC; if (Z) goto T; else goto F // Branch on Z bit Le condizione di salto della riga ifgt5 e quella della riga ifeq4 sono chiaramente in contrasto tra loro. L'indirizzo T o è maggiore di F come previsto da ifeq4, o minore come previsto da ifgt5. Per questo motivo il microassemblatore non può generare il codice corretto. Il problema può essere risolto nel seguente modo: ifgt1 MAR = SP = SP - 1; rd ifgt2 OPC = TOS ifgt3 TOS = MDR ifgt4 N = OPC; if (N) goto f1; else goto ifgt5 ifgt5 Z = OPC; if (Z) goto f2; else goto t1 f1 goto f f2 goto f t1 goto t In questo modo il micro assemblatore è in grado di trovare coppie di indirizzi che verificano le condizioni sopra esposte.