trucchi-com

assembler per principianti


Cap. 5 Algebra booleana Abbiamo visto che il processore conosce solo il sistema binario (0 e 1) per cui bisogna ragionare con questo sistema per riuscire a capire il risultato di tutto quello che chiediamo al nostro processore (d'ora in poi chiamerò il processore CPU cioè Central Processin Unit, unità centrale di processo).Il sistema binario possiede una sua logica chiamata algebra booleana, che è simile alla nostra algebra, ma che agisce su solo due cifre invece che le nostre 10 (0-9).L'addizione si esegue in modo uguale, per esempio: 1011b +0110b =10001bovvero 1+1=0 con riporto di 1 non esistendo il 2.Stesso dicasi per le altre operazioni.Ma l'algebra booleana possiede altre funzioni più interessanti e non disponibili con altri sistemi.Per esempio la funzione AND che dati due numeri esegue il confronto bit per bit del primo numero col secondo. Per esempio:1001b AND1100b =1000bOvvero solo se entrambi i bit sono a 1 il risultato è 1, negli altri casi è 0. A che serve?. Calma ci arriviamo subito.Supponete di avere ottenuto il risultato di un calcolo e che questo sia 10110110b, ora non mi serve il risultato complessivo, ma solo i primi 4 bit, bene basta fare AND 00001111b ed avrò estratto solo i primi 4 bit.Un'altra funzione interessante è l'OR che funziona come AND, ma dà risultato 1 se almeno uno dei due bit è a 1.Un OR più drastico è lo XOR che richiede che uno ed uno solo dei due bit sia ad 1 per dare 1 altrimenti ritorna 0.Questo è quasi tutto quello che c'è da sapere sull'algebra booleana, per quello che ci riguarda. Vogliamo, ora, fare una lista delle istruzioni disponibili? Lo temevo che avreste detto di si.La lista non sarà completa, ma comprenderà solo quelle istruzioni di uso più frequente e meno difficile, per altre informazioni vi consiglio di procurarvi un bel tomo della Intel sui suoi processori.Prima devo spiegare la funzione di un registro che ho nominato precedentemente, e voi vi state ancora chiedendo a che serve. Giusto? Questo è il registro F, che è l'iniziale di FLAG, in inglese bandiera, ebbene il nome è proprio appropriato perché il registro F si comporta come una bandiera che può essere alzata o abbassata a seconda delle condizioni, anzi 16 bandiere perché il registro F è a 16 bit, ed ogni bit rappresenta una situazione.Si va bene, ma quale situazione? Per rispondere farò ora un piccolo esempio.Prendiamo il seguente pezzo di codice:MOV CX,2 'carica 2 nel registro CXDEC CX 'decrementa il registro CX di 1, CX=CX-1DEC CX ' decrementa di nuovo il registroCos'è successo dopo il secondo decremento? Che CX è diventato zero, la CPU giustamente se ne accorge e pone a 1 il bit corrispondente in F che si chiama bit di zero, quindi se io volessi controllare se un'operazione ha dato zero come risultato mi basta controllare questo flag, esiste anche il flag di carry che segnala se in una sottrazione c'è stato prestito, un altro chiamato flag di overflow che segnala se l'operazione ha ecceduto la capacità del registro, il flag di segno che segnala se il sedicesimo bit è ad 1, poiché in alcuni casi i registri vengono considerati a 15 bit e negativi o positivi, e quindi il sedicesimo bit è zero se positivo e 1 se negativo.Esiste anche il flag di direzione che indica se i registri SI e DI devono incrementarsi o decrementarsi in seguito ad alcune istruzioni di lettura scrittura in memoria.