6. Übung Informatik 1 Inhalte: Der DLX-Prozessor Lade/Speicher-Architektur Befehlssatz Adressierung Steuerung und Datenpfad DLX-Programmierung Der DLX-Simulator WinDLX
Aufgaben: 6.1 Erläutern Sie die 3 DLX-Befehlsformate an Hand der vorgegebenen Befehle und codieren Sie diese als binäre 32-Bit-Befehlswörter. ALU-Befehle add r3,r2,r1 andi r3,r4,0xff Verzweigebefehle bnez r3,loop j addr1 Lade/Speicher-Befehle lb r5,0x200(r4)
Hauptoperationscodes der DLX IR3..5 IR0..2 000 001 010 011 100 101 110 111 SPEZIAL J JAL BEQZ BNEZ ADDI ADDUI SUBI SUBUI ANDI ORI XORI LHI RFE TRAP JR JALR SLLI SRLI SRAI SEQI SNEI SLTI SGTI SLEI SGEI LB LH LW LBU LHU SB SH SW SEQUI SNEUI SLTUI SGTUI SLEUI SGEUI Erweiterte Operationscodes func im R-Befehlsformat der DLX(SPEZIAL) IR29..31 IR26..28 000 001 010 011 100 101 110 111 SLL SRL SRA TRAP SEQU SNEU SLTU SGTU SLEU SGEU ADD ADDU SUB SUBU AND OR XOR SEQ SNE SLT SGT SLE SGE MOVI2S MOVS2I
IR R -Type (Register) Operationscode R e g i s t e r 0 5 6 10 11 15 16 20 21 31 IR Operationscode R e g i s t e r opc rs1 rs2 rd func 000 000 00010 00001 00011 00000 100 000 ALU-Befehl add r3,r2,r1 ; r3 r2 + r1
Operationscode R e g i s t e r immediate/ displacement/ offset I -Type (Immediate) 0 5 6 10 11 15 16 31 Operationscode R e g i s t e r immediate/ displacement/ offset rs1 rd/rs2 001 100 00100 00011 0000 0000 1111 1111 000 101 00011 00000 offset von PC zu loop 100 000 00100 00101 0000 0010 0000 0000 IR (1) (2) (3) (1) ALU-Befehl andi r3, r4,0xff ; r3 r4 & 0xff (2) Verzweigebefehl bnez r3, loop ; PC PC + (IR1616 ## IR16…31) ; offset von PC+4 zu loop (mit VZ) (3) Lade/Speicher-Bef. lb r5, 0x200(r4) ; r5 M[r4 +0x200]024 ## M[r4 +0x200]
IR J-Type (Jump) Operationscode jump-offset 0 5 6 31 Operationscode jump-offset 000 010 26-bit-offset von PC zu addr1 IR Verzweigebefehl j addr1 ; PC PC + (IR66 ## IR6…31)
6.2 Ermitteln Sie den DLX-Code für folgende Anweisungen. a = b + c; d = e – f; a,b,c,d,e,f sind 32-Bit Worte im Speicher mit den Labels A,B,C,D,E,F Verwenden Sie dabei den nachstehend angegebenen Rahmen. .text 0x20000 start: lhi r1,0X10 ; Laden Adresse A nach R1 . . . . . . . . . . . ; . . . . . . . . . . . ; Laden a nach R2 . . . . . . . . . . . trap 0 ; steht hier für eine HALT-Anweisung, liefert ; Ausschrift “trap 0“ .data 0x102000 A: .word 0x..... B: .word 0x..... C: .word 0x..... D: .word 0x..... E: .word 0x..... F: .word 0x.....
.text 0x20000 start: lhi r1,0X10 ori r1,r1,0x2000 lw r2,4(r1) ; Laden b nach R2 lw r3,8(r1) add r3,r3,r2 sw 0(r1),r3 ; a = b + c lw r2,16(r1) lw r3,20(r1) sub r3,r2,r3 sw 12(r1),r3 trap 0 ; steht hier für HALT, liefert Ausschrift “trap 0“ .data 0x102000 A: .word 0x..... B: .word 0x..... C: .word 0x..... D: .word 0x..... E: .word 0x..... F: .word 0x.....
6.3 Gegeben ist folgender DLX-Code: addi r1,r0,0x18 lw r11,0xC(r1) addi r1,r0,4 label: sub r2,r11,r1 addi r2,r2,4 srli r1,r2,3 bnez r1,label . . . . . . . . . . . . . . . . . . . . . und die Speicherbelegung M[0x24] = 3210 Berechnen Sie Inhalt von R1 nach 1. und dem 2.Schleifendurchlauf
Befehl 1. Durchlauf 2.Durchlauf addi r1,r0,0x18 lw r11,0xC(r1) addi r1,r0,0x4 label: sub r2,r11,r1 addi r2,r2,4 srli r1,r2,3 bnez r1,label Speicherbelegung M[0x24] = 3210
Befehl 1. Durchlauf 2.Durchlauf addi r1,r0,0x18 r1 = 0x18 lw r11,0xC(r1) r11 = 3210 addi r1,r0,0x4 r1 = 4 label: sub r2,r11,r1 r2 = 3206 addi r2,r2,4 r2 = 3210 srli r1,r2,3 r1 = 401 bnez r1,label r1 = 401 Speicherbelegung M[0x24] = 3210
Befehl 1. Durchlauf 2.Durchlauf addi r1,r0,0x18 r1 = 0x18 lw r11,0xC(r1) r11 = 3210 addi r1,r0,0x4 r1 = 4 label: sub r2,r11,r1 r2 = 3206 r2 = 2809 addi r2,r2,4 r2 = 3210 r2 = 2813 srli r1,r2,3 r1 = 401 r1 = 351 bnez r1,label r1 = 401 Speicherbelegung M[0x24] = 3210
6.4 Zwei gleich große Datenfelder mit 32-Bit-Daten der Länge n sollen auf Gleichheit untersucht werden. .text start: ……… ……… .data adr_n: .byte ; Länge der Felder F1 und F2 ergebnis: .byte ; Ergebnis: 0 für ≠ , 1 für = .align 2 adr_F1: .word ; Adresse von Feld1 ………. adr_F2: .word ; Adresse von Feld2
; Test auf Gleichheit von 2 gleich großen Datenfeldern( mit 32-Bit Daten): .text start: lhi r5,adr_F1>>16 ori r5,r5,adr_F1&0xffff ; Adr. von F1 in r5 lhi r6,adr_F2>>16 ori r6,r6,adr_F2&0xffff ; Adr. von F2 in r6 lhi r7,adr_n>>16 ori r7,r7,adr_n&0xffff lb r7,0(r7) ; Länge der Felder in r7, Zähler für Test lhi r8,ergebnis>>16 ori r8,r8,ergebnis&0xffff loop: lw r9,0(r5) lw r10,0(r6) seq r10,r9,r10 beqz r10,store ; unterschiedliche Worte, Vergleichen beenden addi r5,r5,0x4 addi r6,r6,0x4 subi r7,r7,1 bnez r7,loop store: sb 0(r8),r10 trap 0