Technische Grundlagen der Informatik SS 2020
Übungsblatt 2
Abgabe bis spätestens 5.06.2020 in StudIP
Organisatorisches
Gebt Euren Lösungsvorschlag zu diesem Übungsblatt bis 23:59 Uhr MESZ am 5.06.2020 als PDF- Dokument in StudIP ab. Benennt das PDF-Dokument nach der in der Vorlesung vorgestellten Konvention und nennt in der Abgabe alle Gruppenmitglieder mit ihrem Namen.
Eure Ansätze und der gewählte Lösungsweg sollen nachvollziehbar sein. Achtet insofern auf eine saubere Dokumentation. Fügt, wo sinnvoll, Abbildungen ein. Benennt Eure Quellen.
Aufgabe 1
Arbeitet Kapitel 2 und 7 der RISC-V-Spezifikation1 durch. Legt Euer Augenmerk dabei auf die Spezifikationen für XLEN=32 und IALIGN=32, alle Ausnahmeregelungen für das 16-Bit- Alignment können ignoriert werden.
a) Erläutert die Optimierungen für die vier Kernformate R, I, S und U. Warum wurden sie vorgenommen, was bewirken sie? (1 P.)
b) Warum enthält der Basis-Instruktionssatz keine Instruktion für das Umkopieren eines Registerinhalts in ein anderes Register? Wie kann diese Funktionalität in einem Programm dennoch mit einer einzigen Basis-Instruktion realisiert werden? (1 P.)
Aufgabe 2
Wir haben in der Vorlesung und in den Tutorien Beispiele in RISC-V-Assembler betrachtet. Der RISC-V-Simulator „RARS“ ist zu finden unter https://github.com/TheThirdOne/rars und sollte, da in Java geschrieben, auf allen Systemen laufen. Wir verwenden die Version 1.4.2 Orientiert Euch an den Beispielen und an den Assembler-Vorgaben in StudIP. Das RARS-Wiki3 und die Online-Hilfe geben euch eine Übersicht über Befehlssatz, Register und Systemaufrufe sowie weitere Funktionen des Simulators. Eine Übersicht über die wesentlichen RISC-V-Instruktionen findet Ihr unter https://github.com/jameslzhu/riscv-card/raw/master/riscv-card.pdf. Interessant hier vor allem RV32I Base Integer Instructions und RV32M Multiply Extension.
Ein Systemaufruf in RARS wird mit der Instruktion ecall ausgelöst. Zuvor muss die Nummer des gewünschten Systemaufrufs in das Register a7 geladen werden. Je nach Art des Aufrufs müssen weitere Parameter angegeben werden. Die mit der Taste F1 erreichbare Onlinehilfe von RARS verrät euch unter dem Reiter „Syscalls“, welche Register entsprechend zu befüllen sind.
a) Eure Aufgabe ist es, ein Programm in RISC-V-Assembler zu entwickeln, das 32-Bit- Integer-Zahlen einliest und im Datensegment hintereinander abspeichert. Legt dazu mit der Direktive .space 32 im Datensegment einen Bereich von 32 Bytes an. Das Einlesen
1A. Waterman, K. Asanović (Eds.): The RISC-V Instruction Set Manual, Volume I: Unpriviliged ISA. 13.12.2019. Online verfügbar unter https://riscv.org/specifications/isa-spec-pdf/, zuletzt zugegriffen am 18.05.2020.
2https://github.com/TheThirdOne/rars/releases/download/v1.4/rars1_4.jar 3 https://github.com/TheThirdOne/rars/wiki
RARS中的系统调用由指令ecall触发。 所需系统调用的编号必须首先加载到寄存器a7中。 根据调用的类型,必须指定其 他参数。 通过F1键可以访问RARS的在线帮助,该帮助会在“系统调用”选项卡下告诉您必须相应填充的寄存器。
1
您的任务是在RISC-V汇编器中开发一个程序,该程序读取32位整数并将它们一个接一个地存储在数据段中。 为此,请使用.space 32伪指令在数据段中创建一个32字节的范围。 当保留区已满或输入负值时,应完成对数字的读取。
der Zahlen soll beendet sein, wenn der reservierte Bereich gefüllt ist oder ein negativer Wert eingegeben worden ist. (1 P.)
b) Berechnet den Durchschnitt aller eingegebenen Zahlen als Festkommazahl und gebt das Ergebnis als Dezimalzahl aus (auf zwei Nachkommastellen gerundet). Die Verwendung der Float-Erweiterungen ist nicht erlaubt. (2 P.)
c) Ermittelt analog zu Aufgabenteil b) den Median der eingegebenen Zahlenwerte und gebt ihn dezimal auf zwei Nachkommastellen gerundet aus. Der Median sei hier definiert als
22
median(a) = a[⌊ l+1 ⌋]+a[⌈ l+1 ⌉] , wobei a eine geordnete Liste von Zahlen ist, und die Anzahl
2
der Elemente in a sei l. a[i] sei das i-te Element der Liste.4 (2 P.)
与任务部分b)类似地确定输入数值的中位数,并将其输出十进制舍入到小数点后两位。 其中a是数字的有序列表,而a中的元素数是l。a[i]是列表的第i个元素。
Aufgabe 3
Entwickelt mit RARS ein Programm in RISC-V-Assembler, das in einer Schleife Textzeilen („Strings“) einliest und die eingegebenen Zeichen als 7-Bit-ASCII-Zeichen interpretiert entspre- chend Aufgabe 4 von Übungsblatt 1 in Zahlen im Siebzehnersystem abbildet. Die numerischen Werte für jede Eingabe sollen entsprechend des folgenden Beispiels formatiert ausgegeben werden.
Eine leere Zeile beendet die Eingabe. (2 P.)
Bitte gib Deinen Namen ein: Guenter
43 6f 5g 68 6e 5g 6c
Bitte gib Deinen Namen ein:
Hinweis: Für die Eingabe müsst Ihr eine maximale Pufferlänge (z. B. 40) vorsehen. Wenn diese erreicht ist, endet die Eingabe automatisch, ansonsten wird die Eingabe durch Drücken der Enter- Taste beendet. In diesem Fall befindet sich am Ende der Zeile das eingebene Newline-Zeichen, das nicht mit ausgegeben werden soll. In beiden Fällen endet die Zeichenkette mit einem Nullbyte. Mögliche Fehlerfälle sollen in Eurer Lösung antizipiert und behandelt werden.
Aufgabe 4
Entwickelt in RARS eine rekursiv arbeitende Implementierung der folgenden Funktion. Die Übergabe des Parameters n und die Rückgabe des Ergebnisses erfolgen jeweils im Register a0. Für den rekursiven Aufruf muss das aktuelle Zwischenergebnis jeweils auf dem Stack gespeichert werden.
(1 P.)
在带有RARS的RISC-V-Assembler中开发一个程序,该程序循环读取文本行(“字 符串”),并根据练习表1的练习4中的数字在17个系统中将输入的字符解释为7位 ASCII字符。 每个输入的数值应根据以下示例进行格式化输出。 空行结束输入。
注意:您必须为该条目提供最大粉末⻓度(例如40)。 如果达到此目的,则输入自动结束,否则按Enter键结束输入。 在这种情况下,在行 的末尾输入了换行符,该字符不应包含在输出中。 在这两种情况下,字符串都以零字节结尾。 解决方案中应该预期并处理可能的错误。
在RARS中开发以下功能的递归工作实现。 传递参数n并将结果返回到寄存器a0中。 对于递归调用,当前的临时结果必须 保存在堆栈中。
1 für n = 0
f(n) =
f(n−1)·3n fürn>0
Fragen zur Wiederholung
Diese Fragen dienen für euch zur Wiederholung und Vorbereitung auf das Fachgespräch. Hierzu ist keine Abgabe erforderlich. Es besteht das Angebot, mögliche Antworten auf diese Fragen im Tutorium zu diskutieren.
4Nach Wikipedia: Median. Online unter https://en.wikipedia.org/wiki/Median letzter Zugriff 18.05.2020. Über- setzung von mir.
将所有输入数字的平均值计算为定点数,并将结果输出为十进制 数(四舍五入到小数点后两位)。 不允许使用float扩展名。
2
1. Wie geht eine CPU bei der schrittweisen Abarbeitung eines Programms in etwa vor?
2. Wie ist eine Maschineninstruktion grundsätzlich aufgebaut?
3. Welche (drei) Befehlsklassen stellt eine CPU zumeist bereit? Nenne je ein Beispiel.
4. Wozu dient das Befehlsregister (IF) in einer CPU?
5. Wozu dient der Program-Counter (PC) in einer CPU?
6. Wie werden „Verzweigungen“ realisiert, woher kommen die Informationen für die Entschei-
dung?
7. Wozu dient die indirekte Adressierung beim Zugriff auf eine Speicherstelle?
8. Was ist ein Pointer? Wie kann ein Assemblerprogramm mit Hilfe von Pointern über eine null-terminierte Zeichenkette iterieren?
9. Was ist eine Assemblersprache? Was ist der Unterschied zu einer Hochsprache, z. B. C++?
10. Was ist der Unterschied zwischen einem Compiler und einem Interpreter?
11. Wie werden Parameter und lokale Variablen einer Funktion auf dem Call Stack verwaltet?
12. Das folgende (vereinfachte) Code-Fragment findet sich am Anfang bzw. Ende zahlreicher Assemblerfunktionen. Wozu dient es?
addi sp,sp,-4
sw ra,0(sp)
…
lw ra,0(sp)
addiu sp,sp,4
jr ra
13. Welche Bedeutung hat die Byte-Order einer Prozessorarchitektur? In welchen Anwendungs- fällen spielt sie eine Rolle?
14. Was ist Alignment im Hinblick auf die Speicherung von Daten im Hauptspeicher?
3