CSIT Laboratory




Constantinescu Laurentiu
Staverescu Iulian
Vicovan Ionut

Procesor DLX

Capitolul 2 - Implementare

________________

[Inapoi la prima pagina] [Capitolul anterior] [Anexa]

Cuprins :


2.1 Setul de instructiuni ale procesorului DLX

Instructiuni Incarca/Memoreaza
Nr. Instructiunea Descriere COP
1 LB incarca octet 6'b000000
2 LBU incarca octet fara semn 6'b000001
3 LH incarca semicuvant 6'b000010
4 LHU incarca semicuvant fara semn 6'b000011
5 LW incarca cuvant 6'b000100
6 LF incarca float 6'b000101
7 LD incarca double float 6'b000110
8 LHI incarca imediat 6'b000111
9 SB momoreaza octet 6'b001000
10 SH memoreaza semicuvant 6'b001001
11 SW memoreaza cuvant 6'b001010
12 SF memoreaza float 6'b001011
13 SD memoreaza double 6'b001100
Instructiuni UAL cu operand imediat
Nr. Instructiunea Descriere COP
14 ADDI adunare cu operand imediat 6'b010000
15 SUBI scadere cu operand imediat 6'b010001
16 SII si logic imediat 6'b010010
17 SAUI sau imediat 6'b010011
18 XSAUI sau exclusiv imediat 6'b010100
19 SLLI shift logic stanga imediat 6'b010101
20 SRLI shift logic dreapta imediat 6'b010110
21 SRAI shift aritmetic dreapta imediat 6'b010111
22 ADDUI adunare fara semn imediata 6'b011110
23 SUBUI scadere fara semn imediata 6'b011111
Instructiuni SET cu operand imediat
Nr. Instructiunea Descriere COP
24 SLTI Set less than immediate 6'b011000
25 SGTI Set greater than immediate 6'b011001
26 SLEI Set less or equal immediate 6'b011010
27 SGEI Set greater or equal immediate 6'b011011
28 SEQI Set equal immediate 6'b011100
29 SNEI Set not equal immediate 6'b011101
Instructiuni de salt
Nr. Instructiunea Descriere COP
30 JMP salt la adresa specificata de imediat 6'b100000
31 JR return la adresa specificata de rs 6'b100001
32 JAL apelare rutina de la adresa imediat 6'b100010
33 JALR apelare rutina de la adresa rd 6'b100011
34 TRAP instructiunea TRAP 6'b100100
35 RET return la adresa din RG[31] 6'b100101
Instructiuni de ramificare (branch)
Nr. Instructiunea Descriere COP
36 BEQ branch if equal 6'b110000
37 BNE branch if not equal 6'b110001
Alte instructiuni
Nr. Instructiunea Descriere COP
38 NOP nici o operatie 6'b111101
39 R3 instructiuni care au nevoie de 3 registrii(extinse) 6'b111110
40 HALT instructiunea halt 6'b111111
Instructiuni extinse. Se foloseste formatul de instructiune R-R, iar COP=R3
Instructiuni UAL
Nr. Instructiunea Descriere func
41 ADD adunare cu semn 11'b00000000000
42 ADDU adunare fara semn 11'b00000000001
43 SUB scadere cu semn 11'b00000000010
44 SUBU scadere fara semn 11'b00000000100
45 MULT inmultire 11'b00000000101
46 MULTU inmultire fara semn 11'b00000000110
47 DIV impartire cu semn 11'b00000000111
48 DIVU impartire fara semn 1'b00000001000
49 SI si logic 11'b00000001001
50 SAU sau logic 11'b00000001010
51 XSAU sau exclusiv 11'b00000001011
52 SLL shift logic stanga 11'b00000001100
53 SRL shift logic dreapta 11'b00000001101
54 SRA shift aritmetic dreapta 11'b00000001110
Instructiuni in virgula mobila
55 ADDF adunare in virgula mobila (float) 11'b00000100000
56 ADDD adunare in virgula mobila (double) 11'b00000100001
57 SUBF scadere in vrigula mobila (float) 11'b00000100010
58 SUBD scadere in virgula mobila (double) 11'b00000100100
59 MULTF inmultire in virgula mobila (float) 11'b00000100101
60 MULTD inmultire in virgula mobila (double) 11'b00000100110
61 DIVF impartire in virgula mobila (float) 11'b00000100111
62 DIVD impartire in virgla mobila (double) 11'b00000101000
Instructiuni de setare pentru instructiuni cu 3 registre
63 SLT set less than 11'b00000110000
64 SGT set greater than 11'b00000110001
65 SLE set less or equal than 11'b00000110010
66 SGT set greater or equal 11'b00000110011
67 SEQ set equal 11'b00000110100
68 SNE set not equal 11'b00000110101
Instructiuni de transfer de date
69 MOVS2I muta de la registru special la RG 1'b00001000001
70 MOVI2S muta de la RG la registru special 11'b00001000000
71 MOV muta de la RG la RG 11'b00001000010
72 MOVF muta float 11'b00001000011
73 MOVD muta double 11'b00001000100


Exemplu de program pentru procesorul DLX :

000111_00 000_00011 11111111 11110001 // 0: lhi 0 3 -15 --- rg[3]=(-15)(c)<< 16
010111_00 011_00100 00000000 00010000 // 4: srai 3 4 16 --- rg[4]=rg[3]>>16(a)=-15(c)
000100_00 100_00010 00000000 00110111 // 8: lw 4 2 55 --- rg[2]=mem[55+rg[4]]=mem[40]=127=7fh
010000_00 010_00001 00000000 00010111 //12: addi 2 1 23 --- rg[1]=rg[2]+23=150=96h
001001_00 000_00001 00000000 01000000 //16: sh 0 1 64 --- mem[64+0]=rg[1]=98h -- scriere semicuv !!
001001_00 000_00010 00000000 01000100 //16: sh 0 2 68 --- mem[68+0]=rg[2]=7fh -- scriere semicuv !!
111110_00 010_00001 00011_000 00000101 //20: mult 2 1 3 --- rg[3],rg[4]=rg[2]*rg[1]
001010_00 000_00011 00000000 01001000 //24: sw 0 3 72 --- mem[72+0]=rg[3]=0h
001010_00 000_00100 00000000 01001100 //28: sw 0 4 76 --- mem[76+0]=rg[4]=4a6ah
111111_00 00000000 00000000 00000000 //32: halt
00000000 00000000 00000000 01111111 //40: 127

In urma incarcarii programului in memorie se va afla :

00011100_00000011_11111111_11110001
01011100_01100100_00000000_00010000
00010000_10000010_00000000_00110111
01000000_01000001_00000000_00010111
00100100_00000001_00000000_01000000
00100100_00000010_00000000_01000100
11111000_01000001_00011000_00000101
00101000_00000011_00000000_01001000
00101000_00000100_00000000_01001100
11111100_00000000_00000000_00000000
00000000_00000000_00000000_01111111

In urma rularii programului se obtine in memorie

00011100_00000011_11111111_11110001
01011100_01100100_00000000_00010000
00010000_10000010_00000000_00110111
01000000_01000001_00000000_00010111
00100100_00000001_00000000_01000000
00100100_00000010_00000000_01000100
11111000_01000001_00011000_00000101
00101000_00000011_00000000_01001000
00101000_00000100_00000000_01001100
11111100_00000000_00000000_00000000
00000000_00000000_00000000_01111111
xxxxxxxx_xxxxxxxx_xxxxxxxx_xxxxxxxx
xxxxxxxx_xxxxxxxx_xxxxxxxx_xxxxxxxx
xxxxxxxx_xxxxxxxx_xxxxxxxx_xxxxxxxx
xxxxxxxx_xxxxxxxx_xxxxxxxx_xxxxxxxx
xxxxxxxx_xxxxxxxx_xxxxxxxx_xxxxxxxx
xxxxxxxx_xxxxxxxx_00000000_10010110
xxxxxxxx_xxxxxxxx_00000000_01111111
00000000_00000000_00000000_00000000
00000000_00000000_01001010_01101010
xxxxxxxx_xxxxxxxx_xxxxxxxx_xxxxxxxx
xxxxxxxx_xxxxxxxx_xxxxxxxx_xxxxxxxx
xxxxxxxx_xxxxxxxx_xxxxxxxx_xxxxxxxx

Codul sursa al programului

Codul sursa al programului este prea mare pentru a putea fi listat in acest template.
Pentru vizualizare in alta fereastra click aici. (daca folositi Netscape click aici.)
[Inapoi la prima pagina] [Sus] [Capitolul anterior] [Anexa]