Prof. G. Ascia
The DLX Assembly
1
DLX Instruction Set Architecture
Prof. G. Ascia
„ Concetti architetturali:
ƒ Semplicità del load/store IS
ƒ Semplicità nella decodifica (istruzioni a lunghezza fissa)‫‏‬
„ Caratteristiche
ƒ 32 General Purpose Registers
ƒ 32 Floating Point Registers a singola precisione
(condivisi con 16 FPRs a doppia precisione)‫‏‬
ƒ La lunghezza di una word è di 32 bit.
ƒ Indirizzamento della memory a byte, Big Endian, indirizzi
di 32
2
1
Registri
Prof. G. Ascia
L’ISA del DLX contiene 32 (R0-R31) general-purpose
registers da 32 bit
ƒ I registri R1-R31 sono dei reali GP registers
ƒ R0 contiene sempre il valore 0 e non può essere
modificato
ƒ R31 è utilizzato per conservare l’indirizzo di ritorno per le
istruzioni JAL e JALR
ƒ
3
Registri
Prof. G. Ascia
I bit dei registri sono numerati come 0-31, da sinistra a
destra (0 è il bit più significativo, 31 è quello meno
significativo).
ƒ L’ordinamento dei byte è fatto in modo simile
ƒ
0
7 8
15 16
23 24
31
BYTE 0 BYTE 1 BYTE 2 BYTE 3
ƒ
Un registro può essere caricato con
8 un byte (8-bit)‫‏‬
8 un halfword (16-bit)‫‏‬
8 una fullword (32-bit)‫‏‬
4
2
Registri Floating-Point
Prof. G. Ascia
32 registri da 32 bit a singola precisione (F0, F1, .., F31)‫‏‬
Condivisi con16 registri da 64 bit a doppia precisione
(F0, F2, ..., F30)‫‏‬
ƒ La più piccola unità indirizzabile è in un FPR è 32 bit
ƒ
ƒ
Single-Precision
Floating Point
Registers
F0
F1
F2
F3
...
F30
F31
F0
F2
...
Double-Precision
Floating Point
Registers
F30
5
Registri speciali
Prof. G. Ascia
„ Ci sono tre registri speciali
ƒ PC, Program Counter, contiene l’indirizzo
dell’istruzione dal leggere dalla memoria (32 bit)‫‏‬
ƒ IAR, Interrupt Address Register, mantiene l’indirizzo
di ritorno di 32 bit del programma interrottoquando
una istruzione TRAP viene eseguita (32 bit)‫‏‬
ƒ FPSR, Floating-Point Status Register, utilizzato nei
conditional branch per valutare il risultato di una
operazione FP (1 bit)‫‏‬
6
3
Classi di Istruzioni
Prof. G. Ascia
„ Il DLX contiene 92 istruzioni divise in 6 classi
8 load & store instructions
8 move instructions
8 arithmetic and logical instructions
8 floating-point instructions
8 jump & branch instructions
8 special instructions
7
Tipi di istruzioni
Prof. G. Ascia
„ Tutte le istruzioni DLX sono di 32 bit e devono
essere allineate in memoria a word.
„ Esistono 3 formati delle istruzioni:
ƒ
ƒ
ƒ
I-type (Immediate): manipolano dati forniti da un
campo di 16 bit;
R-type (Register): manipolano dati forniti da uno o
due registri;
J-type (Jump): per specificare l’indirizzo di salto non
un registro;
8
4
I-type Instructions (1 of 3)‫‏‬
Prof. G. Ascia
ƒload/store (word, u/s halfword, u/s byte)‫‏‬
ƒoperazioni ALU con operando immediato
ƒtutte le istruzioni di salto condizionato (branch)‫‏‬
ƒJR, JALR
0
5 6
10 11
15 16
31
Opcode
rs1
rd
immediate
6
5
5
16
9
I-type Instructions (2 of 3)‫‏‬
Prof. G. Ascia
0
ƒ
ƒ
ƒ
ƒ
56
10 11
15 16
31
Opcode
rs1
rd
immediate
6
5
5
16
Opcode: istruzione DLX da eseguire
rs1: sorgente per l’ALU, indirizzo base per le Load/Store, registro
da testare per i conditional branches, indirizzo destinazione per
JR & JALR
rd: destinazione per la Load e le operazioni ALU operations,
sorgente per la store. (Non usato per conditional branches, JR e
JALR)‫‏‬
immediate: spiazzamento per calcolare l’indirizzo delle load e
delle store, operando per l’ALU, spiazzamento esteso in segno da
sommare al PC per calcolare l’indirizzo destinazione di un
conditional branch. (non usato per JR e JALR)‫‏‬
10
5
I-type Instructions (3 of 3)‫‏‬
Prof. G. Ascia
0
56
10 11
15 16
31
Opcode
rs1
rd
immediate
6
5
5
16
lw r3, 6(r2)
; rd=r3, rs1=r2, imm=6 ;
r3=Mem[est_segno(6)+r2];
sw -7(r4),r3
; rd=r3, rs1=r4, imm=7 ;
Mem[est_segno(-7)+r4]=r3;
addi r1,r2,5
; rd=r1, rs1=r2, imm=5 ;
r1=r2+est_segno(5);
beqz r1,target
; rs1=r1, imm=target
if(r1==0) PC=PC+est_segno(target)‫‏‬
jr
r1
PC=r1
; rs1=r1
;
;
11
R-type Instructions
Prof. G. Ascia
ƒ
Sono usate per istruzioni che hanno come operandi dell’ALU
solo registri, per leggere e scrivere su e da registri speciali (IAR
e FPSR), e per spostare valori tra i GPR e/o i FPR
0
56
10 11
15 16
20 21
25 26
R-R ALU
rs1
rs2
rd
unused
6
5
5
5
5
add
31
func
6
r1,r2,r3 ;rd=r1, rs1=r2, rs2=r3
0
56
10 11
15 16
20 21
25 26
31
R-R FPU
rs1
rs2
rd
unused
func
6
5
5
5
6
5
addf f1,f2,f3 ;rd=f1, rs1=f2, rs2=f3
12
6
J-type Instructions
Prof. G. Ascia
ƒ
Include jump (J), jump & link (JAL), TRAP e return from
exception (RFE)‫‏‬
0
5 6
Opcode
6
ƒ
31
name
26
name: spiazzamento con segno di 26 bit che è sommato
all’indirizzo (PC+4) per generare l’indirizzo di destinazione. Per
le TRAP esso specifica un indirizzo assoluto senza segno di 26
bit.
j
target;
PC=PC+est_segno(target)‫‏‬
13
Load & Store GPR
Prof. G. Ascia
ƒ
ƒ
ƒ
ƒ
LB (Load Byte), LBU (Load Byte Unsigned),
LH (Load Half word), LHU (Load Half word Unsigned),
LW (Load Word),
SB (Store Byte), SH (Store Half word), SW (Store Word)‫‏‬
LB/LBU/LH/LHU/LW
SB/SH/SW
rd,immediate(rs1)‫‏‬
immediate(rs1),rd
14
7
Load & Store FPR
Prof. G. Ascia
ƒ
ƒ
LF (Load Float), LD (Load Double),
SF (Store Float), SD (Store Double)‫‏‬
LF/LD
SF/SD
Fd,immediate(rs1)‫‏‬
immediate(rs1),Fd
15
Arithmetic and Logical Instructions
Prof. G. Ascia
„ Quattro categorie:
ƒ
ƒ
ƒ
ƒ
aritmetiche
logiche
shift
set-on-comparison
„ Operano con valori con segno/senza segno memorizzati
nei GPR e con immediato
„ Formato: R-type e I-type
16
8
Arithmetic Instructions
Prof. G. Ascia
„ ADD (add r1,r2,r3), SUB (sub r1,r2,r3),
9 tratta il contenuto dei registri sorgente con segno
9 overflow exception
„ ADDU (addu r1,r2,r3), SUBU (subu r1,r2,r3),
9 tratta il contenuto dei registri sorgente senza segno
„ ADDI, SUBI, ADDUI, SUBUI (addi r1,r2,17)‫‏‬
9 come prima ma con un operando immediato
„ MULT,MULTU,DIV,DIVU (mult r1,r2,r3)‫‏‬
17
Logical Instructions
„ AND, OR, XOR (and r1,r2,r3)‫‏‬
9 operazione logica tra il contenuto di due registri
Prof. G. Ascia
„ ANDI, ORI, XORI (andi r1,r2,16)‫‏‬
9 operazione logica tra il contenuto di un registro e un
immediato zero-extended
„ LHI (Load High Immediate) (lhi r1,0xff00)‫‏‬
9 Piazza i 16 bit dell’immediate nella porzione più significativa
del registro destinazione e riempie la parte restante con '0'
9 Permette di creare una costante di 32 bit in un registro GPR
reg con due istruzioni (LHI seguita da ADDI)‫‏‬
18
9
Shift Instructions
Prof. G. Ascia
„ SLL, SRL
(sll r1,r2,r3 ; r1 = r2 << r3 )‫‏‬
9 Fa lo shift di una quantità specificata dal valore di un
registro GP
„ SLLI, SRLI
(slli r1,r2,3 ; r1 = r2 << 3)‫‏‬
9 Fa lo shift di una quantità specificata dal valore immediato
„ Solo cinque bit vengono considerati
19
Arithmetic and Logical Instructions
Set-On-Comparison Instructions
Prof. G. Ascia
„ SLT, SGT, SLE, SGE, SEQ, SNE
(slt r1,r2,r3
(sle r1,r2,r3
(seq r1,r2,r3
if (r2<r3) r1=1 else r1=0)‫‏‬
if (r2<=r3)r1=1 else r1=0)‫‏‬
if (r2==r3)r1=1 else r1=0)‫‏‬
9 Pone il registro destinazione a valore 1 se il risultato del
confronto è 'true‘, al valore 0 altrimenti.
„ SLTI, SGTI, SLEI, SGEI, SEQI, SNEI
(sgei r1,r2,5 if (r2 >= 5) r1=1 else r1=0)‫‏‬
9 Come prima ma con un argomento immediato (esteso in
segno)‫‏‬
20
10
Branch Instructions
Prof. G. Ascia
„ BEQZ, BNEZ (I-type)
beqz r1,target
if(r1==0)
PC=PC+4+est_segno(target)‫‏‬
bnez r1,target
if(r1==1)
PC=PC+4+est_segno(target)‫‏‬
8
L’indirizzo destinazione è calcolato sommando all’immediato
esteso in segno il PC+4.
21
Move Instructions
„ Sono tutte nel formato R-type
Prof. G. Ascia
MOVI2S, MOVS2I: GPR ↔ IAR (non implementata)‫‏‬
✓
ƒ
ƒ
movi2s rd,rs1 ;rd∈
∈SR, rs1∈
∈GPR
movs2i rd,rs1 ;rd∈
∈GPR, rs1∈
∈SR
„ MOVF, MOVD: FPR ↔ FPR
ƒ movf rd,rs ;rd,rs∈
∈FPR
ƒ movd rd,rs ;rd,rs∈
∈FPR (indici pari)‫‏‬
„ MOVFP2I, MOVI2FP: GPR ↔ FPR
ƒ movfp2i rd,rs ;rd∈GPR, rs∈FPR
ƒ movi2fp rd,rs ;rd∈FPR, rs∈GPR
22
11
Floating-Point Instructions
Arithmetic instructions
Prof. G. Ascia
„ ADDF, SUBF, MULTF, DIVF
9 addf f0,f1,f2
9
9
9
subf f3,f4,f5
multf f1,f2,f3
divf f1,f2,f3
„ ADDD, SUBD, MULTD, DIVD
9 addd f0,f2,f4
9
9
9
(float)‫‏‬
(double)‫‏‬
subd f2,f4,f6
multd f4,f6,f8
divd f6,f8,f10
23
Floating-Point Instructions
Prof. G. Ascia
„ Tre categorie
8 aritmetiche
8 conversione
8 Set-on-comparison
„ Tali istruzioni operano con valori FP memorizzati in un solo
registro (per singola precisione) o in una coppia di registri
(per doppia precisione) FP
„ Sono tutte nel formato R-type
24
12
Floating-Point Instructions
Convert Instructions
Prof. G. Ascia
„ CVTF2D (cvtf2d f6,f3) converte un float (f3) in double (f6)‫‏‬
„ CVTF2I (cvtf2i f5,f3)
converte un float (f3) in integer (f5)‫‏‬
„ CVTD2F (cvtd2f f3,f4) converte un double (f4) in float (f3)‫‏‬
„ CVTD2I (cvtd2i f1,f4) converte un double (f4) in integer (f1)‫‏‬
„ CVTI2F (cvti2f f1,f3) converte un integer (f3) in float (f1)‫‏‬
„ CVTI2D (cvti2d f4,f1) converte un integer (f1) in double (f4)‫‏‬
25
Floating-Point Instructions
Set-On-Comparison Instructions
Prof. G. Ascia
„ LTF Fa,Fb; LTD Da,Db;
Less Than Float/Double
„ (if( Fa<Fb) FPSR=1; else FPSR=0;)‫‏‬
„ GTF Fa,Fb; GTD Da,Db;
„ LEF Fa,Fb; LED Da,Db;
Greater Than Float/Double
Less Than or Equal To Float/Double
„ GEF Fa,Fb; GED Da,Db; Greater Than or Equal To Float/Double
„ EQF Fa,Fb; EQD Da,Db;
Equal To Float/Double
„ NEF Fa,Fb; NED Da,Db;
Not Equal To Float/Double
26
13
Branch Instructions
Prof. G. Ascia
„ BFPT, BFPF (I-type)
bfpt label
if (fpsr==1)
PC=PC+4+ est_segno(label)
bfpf label
if (fpsr==0)
PC=PC+4+ est_segno(label)
8
L’indirizzo destinazione è calcolato sommando all’immediato
esteso in segno il PC+4.
27
Jump Instructions
Prof. G. Ascia
„ J, JR, JAL, JALR
j target;
PC=PC+4+est_segno(target)‫‏‬
jr r1;
PC=r1
jal label;
r31=PC+4; PC=PC+4+est_segno(label)‫‏‬
jal
r1;
r31=PC+4; PC= r1
28
14
Procedure
Prof. G. Ascia
„ La chiamata ad una procedura avviene mediante
jal indirizzo_procedura;
„ Questa istruzione salva sul registro r31 l’indirizzo
dell’istruzione successiva alla jal ( indirizzo di ritorno) e
assegna a PC il valore dell’indirizzo della procedura
„ Al termine della procedura si ritorna all’istruzione successiva
a quella chiamante la procedura mediante
jr r31;
„ Questa istruzione salta all’indirizzo di ritorno contenuto in r31
29
Procedure che chiamano altre procedure
Prof. G. Ascia
„ Nel caso di una procedure A che chiama una procedure B,
prima di chiamare B è necessario salvare sullo stack il
valore del registro r31 ovvero l’indirizzo di ritorno di A.
„ Senza il salvataggio di r31 la chiamata di B mediante jal
renderebbe irrecuperabile l’indirizzo di ritorno del
chiamante di A.
„ Al termine della procedura B viene ripristinato il valore
dell’indirizzo di ritorno di A copiando in r31 il valore in cima
allo stack.
„ L’indirizzo della cima dello stack è conservato nel registro
r29.
30
15
Esempio di chiamata di una procedura
Prof. G. Ascia
A: …
jal B;
B: …
addi r29, r29,4;
sw 0(r29),r31;
jal C;
lw r31, 0(r29);
subi r29, r29, 4;
…
jr r31;
C: …
jr r31;
31
Passaggio dei parametri di una procedure
Prof. G. Ascia
„ Il passaggio dei parametri avviene mediante i registri
r2,r3,r4,r5;
„ Se la procedura chiamata deve modificare il valore dei
registri, essi devono essere salvati sullo stack prima di
eseguire le istruzioni della procedure e, al termine della
procedure, i valori originali dei registri vengono ripristinati
leggendoli dalla cima allo stack.
32
16
Programmazione Assembly
Prof. G. Ascia
‰ Funzioni dell’Assemblatore
ƒ Traduzione da linguaggio mnemonico a linguaggio
macchina (Produzione del modulo oggetto)‫‏‬
ƒ Analisi sintattica
‰ Tipi di Istruzioni dell’Assemblatore
ƒ Istruzioni macchina (relative alla fase di esecuzione)‫‏‬
ƒ Istruzioni per l’Assemblatore (direttive: relative alla fase
di traduzione).
33
Traduzione del codice Assembler
Prof. G. Ascia
ß
ß
La traduzione viene realizzata in due passate consecutive.
Nella prima passata l’assembler raccoglie tutte le etichette
Inizio : Istruzione
e calcola l’indirizzo di memoria ad esse corrispondente.
ß In questa prima passata costruisce la tabella dei
simboli, associando ad ogni simbolo l’indirizzo di
memoria ad esso associato.
ß
Nella seconda passata le istruzioni avviene la sostituzione
di valori numerici al posto dei simboli:
à Propri del linguaggio (codici operativi, registri, etc.)‫‏‬
à Definiti dal programmatore (indirizzi e costanti)‫‏‬
34
17
Traduzione del codice Assembler
Prof. G. Ascia
ß
La necessità di una doppia passata è dovuta alla possibilità di
riferimenti in avanti ( uso di una etichetta prima della sua
definizione).
ß
Il file prodotto dall’assembler è chiamato file oggetto. Esso può
contenere dei riferimenti irrisolti a sottoprogrammmi o dati definiti
in altri file.
ß
Un’etichetta è esterna se l’oggetto che l’etichetta indica può
essere nominata anche in file diversi da quello in cui l’etichetta è
definita. (talvolta esse vengono chiamate globali).
Un’etichetta è locale se può essere usata solo nel file in cui è
definita.
ß
ß
L’assembler è in grado di risolvere solo le etichette locali.
ß
Il compito di risolvere i riferimenti esterni è demandato al linker.
35
Il Linker
Prof. G. Ascia
† Il Linker (detto anche Loader) deve:
ß Costruire l’eseguibile a partire dai vari moduli oggetto
ß Segnalare gli errori di linking (simboli mancanti e/o
duplicati)‫‏‬
ß Creare una mappa della memoria (Opzionale)‫‏‬
36
18
Direttive per l’assembler
Prof. G. Ascia
„ Le direttive per l’assembler iniziano con il simbolo .
„ . data <ind> Il codice generato dopo questa direttiva
viene allocato nel segmento dei dati.
„ Se specificato l’indirizzo (facoltativo) ind, l’allocazione inizia a
partire dall’indirizzo ind.
„ . text <ind> Il codice generato dopo questa direttiva
viene allocato nel segmento testo.
„ In questa sezione possono essere presenti solo istruzioni
macchina e word allocate mediante la direttiva .word.
37
Direttive
Prof. G. Ascia
„ .word w1, w2, .., wn Memorizzazione dei valori a 32
„
„
„
„
bit w1, w2, .., wn in locazioni di memoria consecutive.
.half h1, h2, .., hn Memorizzazione dei valori a 16
bit h1, h2, .., hn in locazioni di memoria consecutive.
.byte b1, b2, .., bn Memorizzazione dei valori a 8
bit b1, b2, .., bn.
.float f1, f2, .., fn Memorizzazione dei numeri
reali a singola precisione f1, f2, .., fn in locazioni di
memoria consecutive.
.double d1, d2, .., dn Memorizzazione dei numeri
reali a doppia precisione d1, d2, .., dn in locazioni di
memoria consecutive.
38
19
Direttive
Prof. G. Ascia
„ .align n Allineamento dei dati da scrivere in memoria
all’indirizzo modulo 2n immediatamente successivo.
„ .ascii str Memorizzazione della sequenza di caratteri
ASCII corrispondenti alla stringa str, senza inserire il
carattere terminale 0.
„ .asciiz str Memorizzazione della sequenza di caratteri
ASCII corrispondenti alla stringa str, terminandola con il
carattere 0.
„ .space n Allocazione di n byte di spazio nel segmento dati.
39
Direttive
Prof. G. Ascia
„ .global label Rende la label disponibile per riferimenti
provenienti da istruzioni macchina relativo ad altri moduli
40
20
Traps - The System Interface (1 of 2)‫‏‬
Prof. G. Ascia
„ Le trap costituiscono l’interfaccia tra i programmi DLX
e il sistema di I/O.
„ Sono definite cinque trap in WinDLX
„ Esse sono:
8
8
8
8
8
8
Trap #0: Termina un programma
Trap #1: Apre un File
Trap #2: Chiude File
Trap #3: Legge un blocco da File
Trap #4: Scrive un blocco su File
Trap #5: Output formattato per lo Standard-Output
41
Traps - The System Interface (2 of 2)‫‏‬
Prof. G. Ascia
„ Per tutte le trap:
8 Esse corrispondono alle funzioni C open(), close(),
read(), write() e printf()‫‏‬
8 i descrittori di file 0,1 ad 2 sono riservati per stdin,
stdout e stderr
8 L’indirizzo dei parametri per la chiamata di sistema
deve essere caricato nel registro R14
8 Tutti i parametri devono essere di 32 bit
8 I risultato è restituito nel registro R1
42
21
Trap 1 apertura di un file
Prof. G. Ascia
„
Parameter
1. filename: Address of a zero-terminated string, that contains the path of the file to be opened.
2. mode, to open the file. Following modes can be combined using logical or-operation:
0x0001
O_RDONLY
(read only)
0x0002
O_WRONLY
(write only)
0x0004
O_RDWR
(read and write)
0x0100
O_CREATE
(create file)
0x0200
O_TRUNC
(truncate file)
0x0400
O_EXCL
(open file exclusively (with SHARE))
0x0800
O_APPEND
(append to file)
0x4000
O_TEXT
(Convert CR/LF)
0x8000
O_BINARY
(No conversion of CR/LF)
3. Additional Flags:
0x0000
S_IFREG
0x0100
S_IREAD
0x0080
S_IWRITE
0x0040
S_IEXEC
„
(Normal file, no directory etc.)
(read access permission)
(write access permission)
(execute permission)
43
The file descriptor is returned in register R1.
Trap 1 esempio di apertura di un file
Prof. G. Ascia
.data
FileName:
.asciiz "D:\\Temp\\Dati.DAT"
.align 2
Par:
;*** Parameters for Trap1 (OPEN)‫‏‬
.word FileName
;create for R/W:
.word 0x0104
;R/W-access permission:
.word 0x0180
FileDescr:
.space
4
.text
addi r14,r0,Par;
trap 1
sw FileDescr,R1
44
22
Trap 2 Chiusura di un file
Prof. G. Ascia
ƒParameter:
1. File descriptor of the file to be closed.
ƒZero is returned in register R1, if it was successful, -1 otherwise.
.data
FileName:
.asciiz "D:\\Temp\\dati.DAT”
.align 2
Par:
.word FileName, 0x0104, 0x0180
FileDescr:
.space
4
.text
addi r14,r0,FileDescr
trap 2
45
Trap 3 Lettura da file
Prof. G. Ascia
ƒA file block or a line from stdin can be read with this trap.
ƒParameter:
1. File descriptor of the file
2. Address, for the destination of the read operation
3. Size of block (bytes) to be read
ƒThe actual number of bytes read is returned in register R1.
46
23
Trap 3 Esempio di lettura da file
Prof. G. Ascia
.data
buffer: .space 50
FileName:
.asciiz "D:\\Temp\\dati.DAT”
.align 2
Par:
.word FileName, 0x0001, 0x0100
FileDescr:
.space
4
.word buffer
.word 50
.text
addi r14,r0,Par;
trap 1
sw FileDescr,R1
;read
addi r14,r0,FileDescr
trap 3
;
47
Trap 3 – Lettura da stdin
Prof. G. Ascia
Non serve aprire esplicitamente lo stdin mediante la trap 1
Parametro:
8
Descrittore dello stdin : 0
8
Indirizzo,per la destinazione dell’operazione di lettura
8
Numero di blocchi (byte) da leggere
„ Il numero di byte è restituito R1
„
„
.data
buffer: .space 64
FileDesc: .word 0, buffer, 64
.text
addi
trap
trap
r14,r0,FileDesc
3
0
48
24
Trap 4 Scrittura su file
Prof. G. Ascia
A block can be written to the memory or the standard output.
Parameter:
1. File descriptor of file
2. Address of block to be written
3. Size of the block (bytes)
The actual number of bytes written is returned in register R1.
49
Trap 4 Scrittura su file
Prof. G. Ascia
.data
buffer: .space 50
FileName: .asciiz “D:\\Temp\\dati.DAT”
.align 2
Par:
.word FileName, 0x0104, 0x0180
FileDescr: .space 4
.word buffer
.word 50
.text
addi r14,r0,Par;
trap 1
sw FileDescr,R1
addi r14,r0,FileDescr;
trap 4
50
25
Trap 5 - Formatted Output to Standard Out
„ Parametro:
Prof. G. Ascia
Stringa formattata: guardare la funzione C printf()‫‏‬
ƒ Argomenti: in accordo alla stringa di formato
„ Il numero di byte trasferiti allo stdout è restituito in R1
ƒ
.data
msg: .asciiz "Hello World!\nreal:%f, integer:%d\n"
.align 2
msg_addr: .word
msg
.double 1.23456
.word
123456
.text
addi r14,r0,msg_addr
trap 5
trap 0
51
Esempio: Input Unsigned (C code)‫‏‬
Prof. G. Ascia
„ Legge una stringa dal stdin e la converte in decimale
int InputUnsigned(char *PrintfPar)‫‏‏‬
{
char ReadPar[80];
int i, n;
char c;
printf(“%s”, PrintfPar);
scanf(“%s”, ReadPar);
i = 0;
n =0;
while (ReadPar[i] != '\n') {
c = ReadPar[i] - 48;
n = (n * 10) + c;
i++
}
return n;
}
52
26
Esempio: Input Unsigned
Prof. G. Ascia
„ Legge una stringa dal stdin e la converte in decimale
;expect the address of a zero;terminated prompt string in R1
;returns the read value in R1
;changes the contents of registers R1,R13,R14
.data
;*** Data for Read-Trap
ReadBuffer: .space
80
ReadPar: .word
0,ReadBuffer,80
;*** Data for Printf-Trap
PrintfPar:
.space
4
SaveR2:
SaveR3:
SaveR4:
SaveR5:
.space
.space
.space
.space
4
4
4
4
53
Esempio: Input Unsigned
Prof. G. Ascia
.text
.global
InputUnsigned
InputUnsigned:
;*** save register contents
sw
SaveR2,r2
sw
SaveR3,r3
sw
SaveR4,r4
sw
SaveR5,r5
;*** Prompt
sw
PrintfPar,r1
addi r14,r0,PrintfPar
trap 5
;*** call Trap-3 to read line
addi r14,r0,ReadPar
trap 3
;*** determine value
addi r2,r0,ReadBuffer
addi r1,r0,0
addi r4,r0,10
;Dec system
Loop:
;*** reads digits
lbu
r3,0(r2)‫‏‏‬
seqi r5,r3,10
bnez r5,Finish
subi r3,r3,48
multu r1,r1,r4
add
r1,r1,r3
addi r2,r2,1
j
Loop
to end of line
;LF -> Exit
;´0´
;Shift decimal
;inc pointer
Finish:
;*** restore old regs contents
lw
r2,SaveR2
lw
r3,SaveR3
lw
r4,SaveR4
lw
r5,SaveR5
jr
r31
; Return
54
27
Esempio: Fattoriale (1/2)‫‏‬
Prof. G. Ascia
.data
Prompt: .asciiz
"A value >1: "
PrintfFormat: .asciiz "Factorial = %g\n\n"
.align
2
PrintfPar: .word PrintfFormat
PrintfValue:
.space
8
.text
.global main
main:
;*** Read from stdin into R1
addi
r1,r0,Prompt
jal
InputUnsigned
55
Esempio: Fattoriale (2/2)‫‏‬
Prof. G. Ascia
;*** init
movi2fp
cvti2d
addi
movi2fp
cvti2d
movd
values
f10,r1
f0,f10
;D0..Count register
r2,r0,1
f11,r2
f2,f11
;D2..result
f4,f2 ;D4..Constant 1
Loop: ;*** Break loop if D0 = 1
led
f0,f4 ;D0<=1 ?
bfpt Finish
;*** Multiplication and next loop
multd f2,f2,f0
subd
f0,f0,f4
j
Loop
Finish:
;*** write result to stdout
sd
PrintfValue,f2
addi
r14,r0,PrintfPar
trap
5
trap
0
56
28
Somma tra gli elementi di un vettore (1)‫‏‬
.data
Prof. G. Ascia
vett:
msg_lett:
msg_somma:
.space 20
.asciiz "\nInserire un numero\n"
.asciiz "\nLa somma e' %d"
.align
2
msg_sm_addr: .word msg_somma
somma:
.space 4
.text
.global main
main:
loop_lett:
addi r3,r0,5
addi r2,r0, 0
addi r1,r0,msg_lett
jal InputUnsigned
sw vett(r2), r1
addi r2,r2,4
subi r3,r3,1
bnez r3, loop_lett
57
Somma tra gli elementi di un vettore (2)‫‏‬
Prof. G. Ascia
calcolo:
loop_somma:
addi r3,r0,5
addi r2,r0,0
addi r4,r0,0
lw r5,vett(r2)‫‏‬
subi r3,r3,1
add r4,r4,r5
addi r2,r2,4
bnez r3,loop_somma
stampa:
sw somma(r0),r4
addi r14,r0, msg_sm_addr
trap 5
fine:
trap 0
58
29
Esempio: Minimo (1/4)‫‏‬
Prof. G. Ascia
.data
vett: .space 20
msg_lettura: .asciiz "\nInserire un numero"
msg_stampa: .asciiz "\nIl minimo e' %d e si trova in posizione %d"
.align 2
msg_stampa_addr: .word msg_stampa
minimo:
posmin:
.space 4
.space 4
59
Esempio: Minimo (2/4)‫‏‬
Prof. G. Ascia
.text
.global main
main:
addi r2,r0,0
loop_lettura:addi r1,r0,msg_lettura
jal InputUnsigned
sw vett(r2), r1
addi r2, r2,4
slti r3,r2,20
bnez r3, loop_lettura
60
30
Esempio: Minimo (3/4)‫‏‬
Prof. G. Ascia
calcolo_min:
addi r2,r0,0
addi r3,r0,5
addi r6,r0,0
lw r5, vett(r2)
loop_min:
addi r2,r2,4
subi r3,r3,1
lw r4, vett(r2)‫‏‏‬
if_Vi_min:
slt r15, r4,r5
beqz r15, fine_ciclo_min
add r5,r0,r4
srli r6,r2,2
fine_ciclo_min:
bnez r3, loop_min
61
Esempio: Minimo (4/4)‫‏‬
Prof. G. Ascia
stampa:
sw minimo(r0),r5
sw posmin(r0), r6
addi r14,r0,msg_stampa_addr
trap 5
fine:
trap 0
62
31
Scarica

The DLX Assembly