esempio
scriviamo un programma in linguaggio
macchina che:
• trasferisce il contenuto delle 2 parole
della RAM di indirizzi 64 e 68 nei registri
R0 ed R1
• somma i contenuti dei registri R0 ed R1
• trasferisce il risultato nella parola della
RAM all’indirizzo 60
byte
56
60
64
68
72
1020
1024
1028
1032
1036
1040
byte
parola
38
8
Copia 64 in R0
Copia 68 in R1
Somma R0 e R1
Copia R0 in 60
RAM
111000
111100
1000000
1000100
1001000
..0100110
..01000
1111111100
10000000000 000000000000..010000
10000000100 000000000001..010001
10000001000 0000001000000001....
10000001100 000000010000..001111
10000010000
RAM
Problemi del linguaggio macchina:
• i programmi in binario sono difficili da
scrivere, capire e modificare.
• il programmatore deve occuparsi di
gestire la RAM: difficile ed inefficiente.
primo passo  Assembler
Caratteristiche dell’Assembler
• codici mnemonici per le operazioni
• nomi mnemonici (identificatori) al posto
degli indirizzi RAM dei dati
• nomi mnemonici (etichette) al posto
degli indirizzi RAM delle istruzioni (usati
nei salti)
• avanzate: tipi dei dati INT e FLOAT
(normalmente non presenti)
codice-op mnemonici:
• trasferimento: LOAD (RAM  CPU) e STORE
(CPU  RAM)
• aritmetiche: ADD,SUB,MULT,DIV,MOD,
FADD,FSUB,FMULT,FDIV
• input/output: READ (U-INP  CPU), WRITE
(CPU  U-OUT)
• test: COMP,FCOMP
• salto: BREQ,BRGT,BRLT,BRGE,BRLE,
BRANCH
• terminazione: STOP
stesso esempio del linguaggio
macchina
Z : INT ;
X : INT 38;
Y : INT 8 ;
LOAD R0 X;
LOAD R1 Y;
ADD R0 R1;
STORE R0 Z;
dichiarazioni degli
identificatori dei dati
istruzioni assembler
esempio
carica due valori dalla RAM, li somma e
mette il risultato al posto del maggiore dei
2 numeri sommati (nel caso siano uguali,
non importa in quale dei due si mette la
somma)
X: INT 38;
Y: INT 8;
LOAD R0 X;
LOAD R1 Y;
LOAD R2 X;
ADD R2 R1;
COMP R0 R1;
BRGE maggiore;
STORE R2 Y;
STOP;
maggiore: STORE R2 X;
STOP;
flowchart
LOAD R0 X;
LOAD R1 Y;
LOAD R2 X;
ADD R2 R1;
SI
R0  R1?
STORE R2 X;
STOP;
test
NO
STORE R2 Y;
STOP;
esempio
Legge un reale X da input, ne calcola il
valore assoluto e lo stampa.
ZeroF : FLOAT 0;
X: FLOAT;
AbsX: FLOAT;
READ STINP X;
LOAD R0 ZeroF;
LOAD R1 X;
FCOMP R1 R0;
BRGE maggiore;
FSUB R0 R1;
STORE R0 AbsX;
BRANCH stampa;
maggiore: STORE R1 AbsX;
stampa: WRITE STOUT AbsX;
STOP;
RAM
ZeroF:
0
X:
-234.43
?
Absx:
234.43
?
CPU
R0:
234.43
?
0
R1:
-234.43
?
RC:
-1
?
flowchart
READ STINP X;
LOAD R0 ZeroF;
LOAD R1 X;
NO
R1  R0?
SI
FSUB R0 R1;
STORE R0 AbsX;
maggiore: STORE R1 AbsX;
stampa: WRITE STOUT AbsX;
STOP;
NO
R1  R0?
FSUB R0 R1;
STORE R0 AbsX;
SI
STORE R1 AbsX;
condizione o test
Laboratorio Guidato 1°
Via Marzolo
Via Paolotti
Lab.
Via Belzoni
Presso il Laboratorio del Dip. Matematica
11.30-12.30 Chimica Ind.
12.30-13.30 Sc. Mat. e Sc. Geol.
16.00-17.00 Chimica
Cose da Fare
1) Inserire nome, cognome, numero di
matricola e corso di studi.
2) Si ottiene un nome di utenza (Username)
ed una parola di accesso (Password) che
permettono di accedere al laboratorio.
Ricopiarle accuratamente su di un foglio
di carta e conservarle. Se le si perde o si
commettono errori nella trascrizione non si
può più accedere al laboratorio.
3) Usando username e password entrare nel
sistema operativo Linux
4) Usare Netscape per mettersi in lista per il
compitino
5) Aprire una shell di Linux
6) Aprire emacs per scrivere un programma
Assembler nel file prog usando il comando:
emacs prog &
Il programma deve leggere le basi A e B
e l’altezza H di un trapezio, calcolarne
l’area e stamparla.
( A  B) H
Area 
2
Prepararsi il programma assembler
scritto su di un foglio di carta.
7) Eseguire tale programma nella shell usando
il comando:
interprete prog
8) Se ci sono errori correggere il programma e
rieseguirlo
9) Quando funziona salvarlo, chiudere emacs
ed uscire da Linux
Esempio
Leggere un intero positivo N e stampare i
bit della sua rappresentazione interna.
Esempio potenza
N: INT ;
Bit : INT;
Nbit : INT 32;
Zero : INT 0;
Uno : INT 1;
Due : INT 2;
READ STINP N;
LOAD R1 Uno;
LOAD R2 Due;
LOAD R0 Zero;
LOAD R3 Nbit;
Ciclo: COMP R0 R3;
BRGE Esci;
LOAD R4 N;
MOD R4 R2;
STORE R4 Bit;
WRITE STOUT Bit;
LOAD R4 N;
DIV R4 R2;
STORE R4 N;
ADD R0 R1;
BRANCH Ciclo;
Esci: STOP;
N: INT ;
Bit : INT;
Nbit : INT 32;
Zero : INT 0;
Uno : INT 1;
Due : INT 2;
READ STINP N;
LOAD R1 Uno;
LOAD R2 Due;
LOAD R0 Zero;
LOAD R3 Nbit;
N:
Bit:
Nbit:
Zero:
Uno:
Due:
….00101
?
?
.100000
……0000
……0001
……0010
R0:
R1:
R2:
R3:
R4:
……0000
?
……0001
?
……0010
?
.100000
?
RC:
?
?
Ciclo: COMP R0 R3;
BRGE Esci;
LOAD R4 N;
MOD R4 R2;
STORE R4 Bit;
WRITE STOUT Bit;
LOAD R4 N;
DIV R4 R2;
STORE R4 N;
ADD R0 R1;
BRANCH Ciclo;
Esci: STOP;
N:
Bit:
Nbit:
Zero:
Uno:
Due:
….00000
….00101
….00010
….00001
……0001
….00000
….00001
?
.100000
……0000
……0001
……0010
R0:
R1:
R2:
R3:
R4:
……0010
……0000
……0001
……0011
.0111111
.100000
……0001
……0010
.100000
RC:
-1
?
0
……0001
….00101
….00010
….00000
….00001
?
Scarica

Lezioni6