LE STRUTTURE IN PROGRAMMAZIONE ASSEMBLER CALCOLATORI ELETTRONICI I CdL Ingegneria Biomedica (A-I) DIS - Università degli Studi di Napoli Federico II
Istruzioni di selezione Linguaggio ad alto livello Assembler MC 68000:. if (espressione) istruzione; istruzione_successiva. istruzione può essere un compound statement. B(NOT condizione) labela istruzione.... labela istruzione_successiva
Istruzioni di selezione in assembler Esempio: if (D0 == 5) { D1++; D2=D1; } D2 = D0; Codifica in C CMPI.L #5,D0 ;confr. D0 con 5 BNE SKIP ;salta se D0 5 ADDQ.L #1,D1 ;esegui se D0=5 MOVE.L D1,D2 SKIP MOVE.L D0,D2 Codifica in assembler
Istruzioni di selezione in assembler Linguaggio ad alto livello:. if (espressione) istruzione1 else istruzione2 istruzione_successiva Assembler MC 68000: B(NOT condiz.) labela istruzione1 BRA labelb labela istruzione2 labelb istruzione_successiva
Istruzioni di selezione in assembler if (D0 < 5) {D0++; } else {D0=0; } D1=D0 Codifica in C CMPI.L #5,D0 *confr. D0 con 5 BHS ELSE *salta se D0 5 ADDQ.L #1,D0 *esegui se D0<5 BRA CONTN *evita ramo ELSE ELSE CLR.L D0 *esegui se D0 5 CONTN MOVE.L D0,D1 *continua Codifica in assembler
Strutture iterative in assembler Linguaggio ad alto livello: do istruzione; while (condizione ==TRUE); istruzione_successiva; Assembler MC 68000: labela istruzione Bcc labela istruzione_successiva
Strutture iterative in assembler Esempio: calcola 3^N (N>0) senza effettuare il controllo sull'overflow D0=1; D1=1; do { D0=D0*3; D1++; } while (D1<=N); MOVE.B #N,D2 ;D2 = esponente N MOVE.B #1,D1 ;D1 conta le iterazioni MOVE.W #1,D0 ;D0 inizializzato a 1 LOOP MULU.W #3,D0 ;D0 contiene i prodotti parziali ADDQ.B #1,D1 ;il contatore viene incrementato CMP.B D2,D1 ;e confrontato con N BLE LOOP ;itera il ciclo se D1 N MOVE.L D0,VAR ;memorizza il risultato
Strutture iterative in assembler Linguaggio ad alto livello: while (condizione == TRUE) istruzione; istruzione_successiva; Assembler MC 68000: labela labelb BRA labelb istruzione Bcc labela istruzione_successiva
Strutture iterative in assembler Esempio: calcola 3^N (N 0) senza effettuare il controllo sull'overflow LOOP TEST D0 = 1; D1 = 1; while (D1 <= N) { D0 = D0*3; D1++} MOVE.B #N,D2 ; MOVE.B #1,D1 ; inizializzazioni MOVE.W #1,D0 ; BRA TEST ;va ad effettuare prima il test MULU.W #3,D0 ADDQ.B #1,D1 CMP.B D2,D1 ;se N=0 non viene effettuato BLE LOOP ;alcun ciclo, e D0 contiene 1
DBcc Test condition, decrement, and branch DBcc Dn,<label> Dn: registro dati impiegato come contatore di iterazioni a decrescere. label: associata alla prima istruzione del ciclo. DBcc supporta le stesse condizioni logiche cc di Bcc. Sono inoltre possibili i casi DBF (cc = false) DBT (cc = true) Alcuni assemblatori usano DBRA come sinonimo di DBF.
DBcc Dn,<label> Semantica cc==true? NO Dn Dn-1 YES IF(condition false) THEN [Dn] [Dn] 1 {decrement loop counter} IF [Dn] = -1 THEN [PC] [PC]+2{goto next instruction} ELSE [PC] [PC] + d {take branch} ELSE [PC] [PC] + 2 {goto next instruction} NO Dn==-1? Branch to label YES Execute next instruction
Decrement and branch always: DBRA DBRA equivale a DBF: caso particolare di DBcc con cc=false Esempio: equivale a: MOVE.L #N,D1 MOVE.L #N,D1 SUBQ.L #1,D1 SUBQ.L #1,D1 MOVEA.L #NUM,A2 MOVEA.L #NUM,A2 CLR.L D0 CLR.L D0 LOOP ADD.W (A2)+,D0 LOOP ADD.W (A2)+,D0 DBRA D1,LOOP SUBQ #1,D1 MOVE.L D0,SOMMA BGE LOOP MOVE.L D0,SOMMA
Esercizio Assegnati due byte allocati agli indirizzi di memoria A e B, nella locazione di memoria RES viene memorizzato il numero di bit omologhi uguali di A e B. Il programma usa l'istruzione aritmetica EOR. A B 10010111 10101101 D 00111010 4 10 RES 00000100
*Area Istruzioni ORG $8000 START MOVE.B A,D0 * Sposta il primo valore in D0 MOVE.B B,D1 * Sposta il secondo valore in D1 EOR.B D0,D1 * OR esclusivo bit a bit tra D0 e D1 e risultato in D1 MOVE. B#7,D2 * Inizializza il registro contatore D2 a 7 CLR.L D3 * Azzera D3 destinato a contenere il risultato LOOP BTST D2,D1 * Controlla il D2-esimo bit di D1 BNE DEC * Se è 1 salta a DEC ADDQ #1,D3 * incrementa D3 perché i bit omologhi erano uguali DEC DBRA D2,LOOP * Decrementa D2 e ripete il ciclo se D2 >= 0 MOVE.B D3,RES * Sposta il risultato in memoria STOP #$2000 * Mette il processore in attesa di interruzioni * Area Dati ORG $8800 A DC.B %10100110 * primo byte B DC.B %01101110 * secondo byte RES DS.B 1 * area di storage del risultato END START