<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Rechnerarchitektur Archive - Maximilian Krieg</title>
	<atom:link href="https://maximiliankrieg.de/category/studium/bachelor-of-science/1-semester-b-sc/rechnerarchitektur/feed/" rel="self" type="application/rss+xml" />
	<link>https://maximiliankrieg.de/category/studium/bachelor-of-science/1-semester-b-sc/rechnerarchitektur/</link>
	<description>Wissen, Technik &#38; Erfahrungen</description>
	<lastBuildDate>Sun, 01 Mar 2026 21:09:07 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://maximiliankrieg.de/wp-content/uploads/2026/05/cropped-20260524_logo_2_512-2-32x32.png</url>
	<title>Rechnerarchitektur Archive - Maximilian Krieg</title>
	<link>https://maximiliankrieg.de/category/studium/bachelor-of-science/1-semester-b-sc/rechnerarchitektur/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Rechnerarchitektur (Praktikum 6)</title>
		<link>https://maximiliankrieg.de/2011/12/rechnerarchitektur-praktikum-6/</link>
					<comments>https://maximiliankrieg.de/2011/12/rechnerarchitektur-praktikum-6/#respond</comments>
		
		<dc:creator><![CDATA[Maximilian]]></dc:creator>
		<pubDate>Thu, 22 Dec 2011 21:06:00 +0000</pubDate>
				<category><![CDATA[Rechnerarchitektur]]></category>
		<guid isPermaLink="false">https://maximiliankrieg.de/?p=1574</guid>

					<description><![CDATA[<p>Ziele: Algorithmen in Assemblerprogramme mit möglichst geringer Codegröße umzusetzen, sowie der&#160;Umgang Debugger und Simulator. Arbeitsverzeichnis: Kopieren Sie sich das Verzeichnis, welches Ihnen im Praktikum zur&#8230;</p>
<p>Der Beitrag <a href="https://maximiliankrieg.de/2011/12/rechnerarchitektur-praktikum-6/">Rechnerarchitektur (Praktikum 6)</a> erschien zuerst auf <a href="https://maximiliankrieg.de">Maximilian Krieg</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">Ziele:</h2>



<p class="wp-block-paragraph">Algorithmen in Assemblerprogramme mit möglichst geringer Codegröße umzusetzen, sowie der&nbsp;Umgang Debugger und Simulator.</p>



<h2 class="wp-block-heading">Arbeitsverzeichnis:</h2>



<p class="wp-block-paragraph">Kopieren Sie sich das Verzeichnis, welches Ihnen im Praktikum zur Verfügung gestellt wird, in Ihr&nbsp;persönliches Verzeichnis. Dort stehen Ihnen dann alle benötigten Dateien zur Verfügung.</p>



<h2 class="wp-block-heading">Vorbereitung</h2>



<p class="wp-block-paragraph">Überlegen Sie sich ein Unterprogramm (Funktion), welches eine Zeichenkette in einem Text suchen soll.&nbsp;Die Funktion bekommt die Anfangsadresse des zu durchsuchenden Textes und die Anfangsadresse der&nbsp;zu suchenden Zeichenkette in den Registern R0 und R1 übergeben. Im Register R0 soll zurückgegeben&nbsp;werden , wie oft die zu suchende Zeichenkette im Text gefunden wurde. Bei einer leeren zu suchenden&nbsp;Zeichenkette liefert &nbsp;die Funktion den Wert 0 zurück. Handelt es sich bei dem zu durchsuchenden Text&nbsp;um eine leere Zeichenkette, so liefert die Funktion den Wert 0 zurück.</p>



<h2 class="wp-block-heading">Mögliche Aufrufe:</h2>



<pre class="wp-block-code"><code>int searchStringInString(char*, char*);

int main (void)
{
int Anzahl;
char* Text="hallo Alles klar?";
char* Suchstring="ll";
char* Leerstring=““;
Anzahl = searchStringInString(Text, Suchstring);
Anzahl = searchStringInString(Text, Leersrtring);
Anzahl = searchStringInString(Leerstring, Suchstring);
Anzahl = searchStringInString(Leerstring, Leerstring);
return 0;
}</code></pre>



<p class="wp-block-paragraph">Überlegen Sie sich noch weitere Testfälle</p>



<h2 class="wp-block-heading">Aufgabe 1:</h2>



<p class="wp-block-paragraph">Schreiben Sie Ihr Programm und testen es bevor Sie es im Praktikum vorführen.</p>



<pre class="wp-block-code"><code>.file "searchStringInString.s"
.text
.align 2
.global searchStringInString
.type searchStringInString, %function
searchStringInString:
..
..
..</code></pre>



<h2 class="wp-block-heading">Lösung 1</h2>



<pre class="wp-block-code"><code>@ in R0 wird die Adresse des zu durchsuchenden Text erwartet.
@ in R1 wird die Adresse des zu suchendenn Text erwartet.
@ sollte R0 auf einen leeren String zeigen,
@ oder der gesuchte Text nicht gefunden werden,
@ so wird in R0 der Wert 0 zurueck geliefert.
@ zeigt R1 auf einen leeren String so wird in R0 der Wert 0 zurueck gegeben

.file "searchStringInString.S"
.text
.align 2
.global searchStringInString
.type searchStringInString, %function

searchStringInString:

stmfd sp!, {r4,r5,lr}

mov r4, r0 // Neues Register für den zu durchsuchenden Text

ldr r5,&#91;r0]
cmp r5,#0x0
mov r0,#0x0 // Zähler auf 0 setzen
ldmeqfd sp!, {r4,r5,pc}

mov r3, r1 // Neues Register für den zu suchenden Text
mov r5, r3 // Sicherung der Adresse des zu suchenden Textes

//ldrb r1,&#91;r3]
loop: // Schleife

LDRB r2, &#91;r4],#1 // Erstes bzw. nächstes Zeichen des zu durchsuchenden Strings laden

CMP r1,r2 // Vergleich zu suchendes Zeichen = Zeichen in Zeichenkette
LDREQB r1, &#91;r3],#1 // Wenn r1=r2 dann nächstes zu suchendes Zeichen laden

CMP r1,#0x0 // Vergleich ob r1 das letzte Zeichen war
ADDEQ r0,#0x1 // Zähler um 1 erhöhen
MOVEQ r3, r5 // r1 zurücksetzen

CMP r3, r5
LDREQB r1, &#91;r3],#1

CMP r2, #0x0 // Prüfen ob r2 das letzte Zeichen war

BNE loop // Schleifenaufruf, wenn r2 nicht fertig ist

ldmfd sp!, {r4,r5,pc}

.size searchStringInString, .-searchStringInString</code></pre>



<h2 class="wp-block-heading">Zusatzaufgabe:</h2>



<p class="wp-block-paragraph">Überlegen Sie sich ein Unterprogramm (Funktion), welches eine Zeichenkette in einem Text suchen soll.&nbsp;Die Funktion bekommt die Anfangsadresse des zu durchsuchenden Textes und die Anfangsadresse der&nbsp;zu suchenden Zeichenkette in den Registern R0 und R1 übergeben. Im Register R0 soll zurückgegeben&nbsp;werden , wie oft die zu suchende Zeichenkette im Text gefunden wurde. Bei einer leeren zu suchenden&nbsp;Zeichenkette liefert die Funktion die Länge des zu durchsuchenden Text zurück. Handelt es sich bei dem zu durchsuchenden Text um eine leere Zeichenkette, so liefert die Funktion den Wert 0 zurück.</p>



<h2 class="wp-block-heading">Lösung Zusatzaufgabe</h2>



<pre class="wp-block-code"><code>@ in R0 wird die Adresse des zu durchsuchenden Text erwartet.
@ in R1 wird die Adresse des zu suchendenn Text erwartet.
@ sollte R0 auf einen leeren String zeigen,
@ oder der gesuchte Text nicht gefunden werden,
@ so wird in R0 der Wert 0 zurueck geliefert.
@ zeigt R1 auf einen leeren String so wird in R0 der Wert 0 zurueck gegeben

.file "searchStringInString.S"
.text
.align 2
.global searchStringInString
.type searchStringInString, %function

searchStringInString:

stmfd sp!, {r4,r5,lr}

mov r4, r0 // Neues Register für den zu durchsuchenden Text

ldr r5,&#91;r0]
cmp r5,#0x0
mov r0,#0x0 // Zähler auf 0 setzen
ldmeqfd sp!, {r4,r5,pc}

mov r3, r1 // Neues Register für den zu suchenden Text
mov r5, r3 // Sicherung der Adresse des zu suchenden Textes

loop: // Schleife

LDRB r2, &#91;r4],#1 // Erstes bzw. nächstes Zeichen des zu durchsuchenden Strings laden

CMP r1,r2 // Vergleich zu suchendes Zeichen = Zeichen in Zeichenkette
LDREQB r1, &#91;r3],#1 // Wenn r1=r2 dann nächstes zu suchendes Zeichen laden

CMP r1,#0x0 // Vergleich ob r1 das letzte Zeichen war
ADDEQ r0,#0x1 // Zähler um 1 erhöhen
MOVEQ r3, r5 // r1 zurücksetzen

CMP r3, r5
LDREQB r1, &#91;r3],#1

CMP r2, #0x0 // Prüfen ob r2 das letzte Zeichen war

BNE loop // Schleifenaufruf, wenn r2 nicht fertig ist

ldmfd sp!, {r4,r5,pc}

.size searchStringInString, .-searchStringInString</code></pre>
<p>Der Beitrag <a href="https://maximiliankrieg.de/2011/12/rechnerarchitektur-praktikum-6/">Rechnerarchitektur (Praktikum 6)</a> erschien zuerst auf <a href="https://maximiliankrieg.de">Maximilian Krieg</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://maximiliankrieg.de/2011/12/rechnerarchitektur-praktikum-6/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Rechnerarchitektur (Praktikum 5)</title>
		<link>https://maximiliankrieg.de/2011/12/rechnerarchitektur-praktikum-5/</link>
					<comments>https://maximiliankrieg.de/2011/12/rechnerarchitektur-praktikum-5/#respond</comments>
		
		<dc:creator><![CDATA[Maximilian]]></dc:creator>
		<pubDate>Wed, 07 Dec 2011 20:43:00 +0000</pubDate>
				<category><![CDATA[Rechnerarchitektur]]></category>
		<guid isPermaLink="false">https://maximiliankrieg.de/?p=1569</guid>

					<description><![CDATA[<p>Ziele: Verständnis für STACK Befehle und deren Nutzung bei Unterprogrammen. Ziel ist es Programme mit&#160;möglichst geringer Codegröße zu implementieren, sowie der Umgang mit einem Debugger/Simulator.&#8230;</p>
<p>Der Beitrag <a href="https://maximiliankrieg.de/2011/12/rechnerarchitektur-praktikum-5/">Rechnerarchitektur (Praktikum 5)</a> erschien zuerst auf <a href="https://maximiliankrieg.de">Maximilian Krieg</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">Ziele:</h2>



<p class="wp-block-paragraph">Verständnis für STACK Befehle und deren Nutzung bei Unterprogrammen. Ziel ist es Programme mit&nbsp;möglichst geringer Codegröße zu implementieren, sowie der Umgang mit einem Debugger/Simulator.</p>



<h2 class="wp-block-heading">Arbeitsverzeichnis:</h2>



<p class="wp-block-paragraph">Kopieren Sie sich das Verzeichnis, welches Ihnen im Praktikum zur Verfügung gestellt wird, in Ihr&nbsp;persönliches Verzeichnis. Dort stehen Ihnen dann alle benötigten Dateien zur Verfügung.</p>



<h2 class="wp-block-heading">Vorbereitung</h2>



<p class="wp-block-paragraph">Arbeiten Sie sich in folgende Befehle des ARM-Prozessors und in den ARM Procedure Call Standard&nbsp;(APCS) ein:</p>



<p class="wp-block-paragraph">Instruktion := Bedeutung<br>STMFD R13, {R1-R4, LR} := Speichert die Registerwerte R1 bis R4 sowie LR&nbsp;(=R14) an die Adresse, die in R13 (=SP) steht, als&nbsp;voll absteigender Stack</p>



<p class="wp-block-paragraph">LDMFD R13, {R1-R4, PC} := Lädt den Speicherinhalt von der Adresse, die in&nbsp;R13 (=SP) steht, in Form eines voll absteigenden&nbsp;Stacks in die Register R1 bis R4 sowie PC (=R15)</p>



<h2 class="wp-block-heading">Aufgabe 1:</h2>



<p class="wp-block-paragraph">In folgenden Tabellen ist jeweils ein Speicherauszug gezeigt. Welche Werte stehen in den Registern&nbsp;nach Ausführung des Blocktransferbefehls? R9 = 0x8000</p>



<pre class="wp-block-code"><code>LDMDA R9, {R1, R2, R6}
R1: 4
R2: 5
R6: 6

LDMFD R9, {R1, R2, R6}
R1: 6
R2: 7
R6: 8</code></pre>



<pre class="wp-block-code"><code>// Aufgabe 1: Blocktransferbefehle"
// Name: Matrikelnummer: 
// Datum: 

.file "aufgabe1.S"
.text @ legt eine Textsection fuer PrgrammCode + Konstanten an
.align 2 @ sorgt dafuer, dass nachfolgende Anweisungen auf einer durch 4 teilbaren Adresse liegen
@ unteren 2 Bit sind 0
.global main @ nimmt das Symbol main in die globale Sysmboltabelle auf
.type main,function
main:
stmfd sp!, {r6, r9, lr}
ldr r9, =0x8000

ldmda r9, {r1, r2, r6}
ldmfd r9, {r1, r2, r6}

ldmfd sp!, {r6, r9, pc}
.Lfe1:
.size main,.Lfe1-main

// End of File</code></pre>



<h2 class="wp-block-heading">Aufgabe 2:</h2>



<p class="wp-block-paragraph">Schreiben Sie ein beliebiges, kleines Programm in ARM Assembler, das durch&nbsp;Unterprogramme strukturiert wird. Folgende Anforderungen werden an das Programm&nbsp;gestellt:</p>



<ul class="wp-block-list">
<li>Die APCS Konvention wird eingehalten</li>



<li>Das Programm benutzt (mindestens) drei Unterprogramme (UP):
<ul class="wp-block-list">
<li>UP1 benutzt nur Scratchregister und stellt keine Blattroutine dar (ruft somit weitere Unterprogramme auf)</li>



<li>UP2 benutzt nur Scratchregister und stellt eine Blattroutine dar (ruft somit keine weiteren Unterprogramme auf)</li>



<li>UP3 benutzt Nicht-Scratchregister und stellt keine Blattroutine dar</li>
</ul>
</li>
</ul>



<pre class="wp-block-code"><code>// Befehle = 19, Programmgröße = 19*4 Byte= 76 Byte
.file "aufgabe2.S"
.text @ legt eine Textsection fuer PrgrammCode + Konstanten an
.align 2 @ sorgt dafuer, dass nachfolgende Anweisungen auf einer durch 4 teilbaren
Adresse liegen
@ unteren 2 Bit sind 0
.global main @ nimmt das Symbol main in die globale Sysmboltabelle auf
.type main,function
main: // 5 Befehle
push {lr}
bl up1 // Unterprogramm 1 aufrufen
bl up2 // Unterprogramm 2 aufrufen
bl up3 // Unterprogramm 3 aufrufen
pop {pc}

// UP1 benutzt nur Scratchregister und stellt keine Blattroutine dar (ruft somit weitere Unterprogramme auf
up1: // 7 Befehle
push {lr}
MOV r0, #0x0 // r0=0
MOV r1, #0x1 // r1=1
bl up2 // Unterprogramm 2 aufrufen
MOV r1,#0x2
bl up2 // Unterprogramm 2 aufrufen
pop {pc}

// UP2 benutzt nur Scratchregister und stellt eine Blattroutine dar (ruft somit keine weiteren Unterprogramme auf)
up2: // 3 Befehle
push {lr}
ADD R0, R0, R1 // r0 und r1 addieren, Ergebnis nach r0 schreiben
pop {pc}

//UP3 benutzt Nicht-Scratchregister und stellt keine Blattroutine dar (ruft somit weitere Unterprogramme auf)
up3: // 4 Befehle
stmfd sp!, {r4, lr} // r4 und lr sichern
ADD r4, r4, #0x1 // r4 um 1 erhöhen
bl up2 // Unterprogramm 2 aufrufen
ldmfd sp!, {r4, pc} // r4 und lr -&gt; pc zurück laden

.Lfe1:
.size main,.Lfe1-main

// End of File
</code></pre>



<h2 class="wp-block-heading">Aufgabe 3:</h2>



<p class="wp-block-paragraph">Schreiben Sie das Programmbeispiel aus Termin 2 (selbst modifizierender Code )in ARM7-Assembler und testen Sie dieses. Beobachten Sie die sich ändernden Speicherstellen/Befehle.&nbsp;Beschäftigen Sie sich mit den Problemen, welches dieses Programm machen kann.</p>



<p class="wp-block-paragraph"><strong>Warum funktioniert das Programm im Simulator?</strong></p>



<ul class="wp-block-list">
<li>Das Programm funktioniert, da innerhalb des Simulators alle Programme im RAM stehen.</li>
</ul>



<p class="wp-block-paragraph"><strong>Wie groß dürfte die Werteliste werden?</strong></p>



<pre class="wp-block-code"><code>// Befehle = 16, Programmgröße = 16*4 Byte = 64 Byte

.file "aufgabe3.S"
.text @ legt eine Textsection fuer PrgrammCode + Konstanten an
.align 2 @ sorgt dafuer, dass nachfolgende Anweisungen auf einer durch 4 teilbaren
Adresse liegen
@ unteren 2 Bit sind 0
.global main @ nimmt das Symbol main in die globale Sysmboltabelle auf
.type main,function
main:

loop:
ADR r0, Total // Accumulate total
LDR r1, &#91;r0]

Add_instr: // Add_instr

ADR r2, Table
LDR r3, &#91;r2],#4

add r5, r1, r3 // Speichere r3 + r1 in r5
str r5, Total // Speichere r5 unter „Total“

LDR r3, Add_instr
add r3, r3,#4 //Speichere r3 + 4 in r3
str r3, Add_instr // Speichere r3 unter „Add_instr“

ldr r6, Count
subs r6,r6,#1 // Speichere r6 – 1 in r6, setze die Statusbits
str r6, Count // Speichere r6 unter „Count“
BGE loop
STR r5, Total // Speichere r5 unter „Total“
b Halt // STP ; Halt execution

Halt:
b Halt

Total: .word 0
One: .word 4
Count: .word 4
Table: .word 39, 25, 4, 98, 17

.Lfe1:
.size main,.Lfe1-main
// End of File
</code></pre>



<h2 class="wp-block-heading">Aufgabe 4:</h2>



<p class="wp-block-paragraph">Berichtigen Sie das Programm nun so, dass der Programmcode (kein sich selbst<br>modifizierenden Code) im ROM (Read Only Memory) und die sich ändernden Daten im RAM&nbsp;(Random Acces Memory) stehen.</p>



<pre class="wp-block-code"><code>// Befehle = 10  Programmgröße = 10 * 4 Byte = 40 Byte
.file "aufgabe4.S"
.text @ legt eine Textsection fuer PrgrammCode + Konstanten an
.align 2 @ sorgt dafuer, dass nachfolgende Anweisungen auf einer durch 4 teilbaren
Adresse liegen
@ unteren 2 Bit sind 0
.global main @ nimmt das Symbol main in die globale Sysmboltabelle auf
.type main,function

main:

LDR r1, =Table // Laden der Adresse von Table
MOV r0, #0x0 // Ergebnisregister auf 0 setzen
LDR r3, =Count // Laden der Adresse der Zähl-Variable
LDR r3, &#91;r3] // Laden des Wertes der Zähl-Variable

loop:
LDR r2, &#91;r1], #4 // Laden des ersten Wertes der Tabelle nach r2, inkrement danach
ADD r0, r2, r0 // Ergebniswert = Ergebniswert + Tabellenwert
SUBS r3, r3, #1 // Zählvariable dekrementieren mit Status
BPL loop // Solange r3 &gt;=0 ist wiederhole die Loop
STR r0, Total // r0 nach Total speichern

BX LR

.Lfe1:
.size main,.Lfe1-main

.data
Total: .word 0
Count: .word 4
Table: .word 39, 25, 4, 98, 17

// End of File</code></pre>
<p>Der Beitrag <a href="https://maximiliankrieg.de/2011/12/rechnerarchitektur-praktikum-5/">Rechnerarchitektur (Praktikum 5)</a> erschien zuerst auf <a href="https://maximiliankrieg.de">Maximilian Krieg</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://maximiliankrieg.de/2011/12/rechnerarchitektur-praktikum-5/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Rechnerarchitektur (Praktikum 4)</title>
		<link>https://maximiliankrieg.de/2011/11/rechnerarchitektur-praktikum-4/</link>
					<comments>https://maximiliankrieg.de/2011/11/rechnerarchitektur-praktikum-4/#respond</comments>
		
		<dc:creator><![CDATA[Maximilian]]></dc:creator>
		<pubDate>Wed, 23 Nov 2011 20:43:00 +0000</pubDate>
				<category><![CDATA[Rechnerarchitektur]]></category>
		<guid isPermaLink="false">https://maximiliankrieg.de/?p=1567</guid>

					<description><![CDATA[<p>Ziele: Verständnis für LOAD und STORE Befehle, bedingte Befehle und die verschiedenen Speicherbereiche. Ziel ist die Implementierung mit möglichst geringer Codegröße sowie der Umgang mit&#8230;</p>
<p>Der Beitrag <a href="https://maximiliankrieg.de/2011/11/rechnerarchitektur-praktikum-4/">Rechnerarchitektur (Praktikum 4)</a> erschien zuerst auf <a href="https://maximiliankrieg.de">Maximilian Krieg</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">Ziele:</h2>



<p class="wp-block-paragraph">Verständnis für LOAD und STORE Befehle, bedingte Befehle und die verschiedenen Speicherbereiche. Ziel ist die Implementierung mit möglichst geringer Codegröße sowie der Umgang mit einem Debugger/Simulator und der Entwicklungsumgebung.</p>



<h2 class="wp-block-heading">Arbeitsverzeichnis:</h2>



<p class="wp-block-paragraph">Kopieren Sie sich das Verzeichnis, welches Ihnen im Praktikum zur Verfügung gestellt wird, in Ihr persönliches Verzeichnis. Dort stehen Ihnen dann alle benötigten Dateien zur Verfügung.</p>



<h2 class="wp-block-heading">Vorbereitung</h2>



<p class="wp-block-paragraph">Arbeiten Sie sich in folgende Befehle des ARM-Prozessors ein:</p>



<p class="wp-block-paragraph">Instruktion := Bedeutung<br>ADDNE R1, R2, #1 R1 := R2 + 1, falls das Z-Bit im Prozessorstatuswort nicht gesetzt ist<br>LDR R1, [R2] R1 := mem32[R2]<br>LDREQ R1, [R2] R1 := mem32[R2], falls das Z-Bit im Prozessorstatuswort gesetzt ist<br>LDRB R1, [R2] R1 := mem8[R2]<br>STR R1, [R2] mem32[R2] := R1<br>STRB R1, [R2] mem8[R2] := R1<br>ADR R1, Marke R1:=PC+(Offset zur Marke)<br>B Marke PC wird auf Adresse der Marke gesetzt<br>BEQ Marke PC wird auf Adresse der Marke gesetzt, falls das Z-Bit im Prozessorstatuswort gesetzt ist<br>BNE Marke PC wird auf Adresse der Marke gesetzt, falls das Z-Bit imProzessorstatuswort nicht gesetzt ist</p>



<h2 class="wp-block-heading">Aufgabe 1:</h2>



<pre class="wp-block-code"><code>.file "aufgabe1.S"
.text @ legt eine Textsection fuer PrgrammCode + Konstanten an
.align 2 @ sorgt dafuer, dass nachfolgende Anweisungen auf einer durch 4 teilbaren Adresse liegen
@ unteren 2 Bit sind 0
.global main @ nimmt das Symbol main in die globale Sysmboltabelle auf
.type main,function
main:
// Hier bitte Ihren ProgrammCode einfuegen

mov r0, #0 // r0=0x0; r1=0x1ffff8 zu diesem Zeitpunkt
str r1, &#91;r0], #4 // Inhalt von r1 auf Adresse 0x00000000. Danach steht in r0 0x4
eor r0, r0, r0 // r0=0x0
str r1, &#91;r0, #4] // Inhalt von r1 auf Adresse 0x00000004, danach steht in r0 0x0
mov r0, #0 // r0=0x0
str r1, &#91;r0]! // Inhalt von r1 auf Adresse 0x00000000, danach steht in r0 0x0
sub r0, r0, r0 // r0=0x0
str r1, &#91;r0, #4]! // Inhalt von r1 auf Adresse 0x00000004, danach steht in r0 0x4
and r0, r0, #0 // r0=0x0
strb r1, &#91;r0, #1]! // Inhalt von r1 auf Adresse 0x00000001 (nur hintere 8bit), danach steht in r0 0x1
mov r1, #4 // r1=0x4
strb r1, &#91;r0, r1]! // Inhalt von r1 auf Adresse 0x00000005 (nur hintere 8 bit), danach steht in r0 0x5

bx lr
.Lfe1:
.size main,.Lfe1-main

// End of File</code></pre>



<h2 class="wp-block-heading">Aufgabe 2:</h2>



<p class="wp-block-paragraph">Bearbeiten Sie schriftlich die Zusatzfragen.</p>



<p class="wp-block-paragraph"><strong>a)</strong>&nbsp;Auf welche Weise kann man die Condition-Code-Flags NZCV (Bedingungsbits) des Prozessorstatuswort (CPSR) setzen?</p>



<p class="wp-block-paragraph"><strong>Lösung:&nbsp;</strong>Indem man an die ARM-Befehle ein „S“ anhängt (z.B. ADDS, SUBS …) oder die Befehle TST, TEQ, CMP oder CMN verwendet.</p>



<p class="wp-block-paragraph"><strong>b)&nbsp;</strong>Wie wird die Pseudoinstruktion “ADR R1, Marke” vom Assembler umgesetzt? Schreiben Sie&nbsp;hierzu den Befehl in einen der vorgegebenen Programmrahmen und schauen Sie ihn sich im&nbsp;Debugger in der Mixed-Darstellung an (rechts oben Source auswählen). → Vollziehen Sie die&nbsp;Umsetzung des Compiler nach und informieren Sie sich auch über Pipelining.</p>



<p class="wp-block-paragraph"><strong>Lösung</strong></p>



<p class="wp-block-paragraph">Ein Befehl kann in einem Zyklus gefetched werden. Wird er im nächsten Zyklus decoded, kann man bereits im selben Zyklus den nächsten Befehl fetchen.&nbsp;ADR wird entweder in ein ADD oder SUB umgesetzt, da ADR eigentlich keine Instruktion ist.</p>



<p class="wp-block-paragraph"><strong>In diesem Fall erzeugt ADR diesen Befehl:</strong><br>ADD r1, PC, 0x8</p>



<ul class="wp-block-list">
<li>PC steht für den Wert, nachdem das ADR ausgeführt wurde (somit nochmals um 8 erhöht wurde).</li>



<li>0x8 steht für die Distanz zu Marke vom PC, (4x Anzahl der Befehle zwischen PC und Marke)</li>
</ul>



<p class="wp-block-paragraph"><strong>Programm Aufgabe2</strong></p>



<pre class="wp-block-code"><code>.file "aufgabe2.S"
.text @ legt eine Textsection fuer PrgrammCode + Konstanten an
.align 2 @ sorgt dafuer, dass nachfolgende Anweisungen auf einer durch 4 teilbaren Adresse liegen
@ unteren 2 Bit sind 0
.global main @ nimmt das Symbol main in die globale Sysmboltabelle auf
.type main,function
main:

ADR r1, Marke // PC+0 = Fetch von ADR
mov r0,#0 // PC+4 = Decode von ADR
mov r0,#1 // PC +8 = Execute von ADR
mov r0,#2 // Execute +4
Marke: .word 0x00000000 // Execute +8
.Lfe1:
.size main,.Lfe1-main
// End of File</code></pre>



<p class="wp-block-paragraph"><strong>c)&nbsp;</strong>Das Prozessorstatuswort hat den Wert 0xa00013, wenn der Befehl “BNE Marke” ausgeführt&nbsp;wird. Würde dann der Sprung an die (symbolische) Adresse Marke ausgeführt? Weisen Sie Ihre&nbsp;Antwort mit einem Programm nach.</p>



<p class="wp-block-paragraph"><strong>Lösung:&nbsp;</strong>Ja, da BNE bedeutet, dass etwas ausgeführt wird, wenn das Zero-Bit nicht gesetzt ist. Zum Zeitpunkt des Befehls steht im CPSR 0x00a00013, somit ist das Zero-Bit 0 und der Sprung wird ausgeführt.</p>



<h2 class="wp-block-heading">Aufgabe 3:</h2>



<p class="wp-block-paragraph">Es ist ein Programm zu entwickeln, welches alle Werte einer Liste1 nach Liste2 kopiert. In den Listen&nbsp;steht an erster Stelle die Anzahl der Elemente der jeweiligen Liste. Liste1 ist, bis auf die erste Zahl&nbsp;(Anzahl der Elemente max. 255) eine Liste mit 8Bit großen vorzeichenbehafteten Zahlen (-128 bis +127).&nbsp;In Liste2 sollen die Zahlen aus Liste1, ausser die Anzahl der Elemente (die bleibt vorzeichelos), als 32Bit&nbsp;große vorzeichenbehaftete Zahlen abgelegt werden.</p>



<p class="wp-block-paragraph"><strong>Lösung</strong></p>



<ul class="wp-block-list">
<li>8 Bit Zahlen in Register laden</li>



<li>Zahlen mit 24 Bit Verschiebung in den Speicher schreiben</li>



<li>Vorzeichenwechsel mit ASR erzeugen (Laden, Verschieben, ASR mit 0/1 auffüllen lassen)</li>
</ul>



<h2 class="wp-block-heading">Aufgabe 4:</h2>



<p class="wp-block-paragraph">Nach dem Kopiervorgang soll in einem weiteren Schritt die Liste2 aufsteigend sortiert werden. Hierzu&nbsp;erweitern Sie Ihr Programm von Aufgabe 3. Es gibt verschiedene Sortieralgorithmen (z.B. Bubblesort).&nbsp;Denken Sie daran, dass die Länge der Liste an erster Stelle stehen bleiben muss.</p>



<p class="wp-block-paragraph"><strong>Lösung</strong></p>



<pre class="wp-block-code"><code>.file "aufgabe3.S"
.text @ legt eine Textsection fuer PrgrammCode + Konstanten an
.align 2 @ sorgt dafuer, dass nachfolgende Anweisungen auf einer durch 4 teilbaren Adresse liegen
@ unteren 2 Bit sind 0
.global main @ nimmt das Symbol main in die globale Sysmboltabelle auf
.type main,function
main:
stmfd sp!, {r4, r5, lr} @ Ruecksprungadresse und Register sichern
kopieren:
@ hier Ihr Programm zum Kopieren einer Byte-Tabelle (je 8Bit) in eine Word-Tabelle (je 32Bit) einfuegen

LDR r1, =Liste1 // Position von Liste1 bestimmen
ADR r2, TAB2 // Position von TAB2 bestimmen
LDR r2, &#91;r2] // Position der Werte für Tab2 bestimmten
LDRb r3, &#91;r1] // Zähler für Loop

loop0: // Schleife für Einlesen der Werte
LDRB r0, &#91;r1], #1 // Nächstes Element einlesen (8 Bit Zahl)

vorzeichen:
MOV r0, r0, LSL #24
MOV r0, r0, ASR #24

// Bereich für Speichern der Liste
STR r0, &#91;r2], #4 // Wert von r0 nach Liste2 speichern
sub r3, r3, #1 // Dekrementierung des "loop0"-Counters um 1
CMP r3, #0 // Vergleich ob r3-0=0 und Statusbits setzen

BNE loop0 // Sprung zu loop0, wenn r3 nicht null war
BEQ sortieren // Aufruf der "Sortieren"-Funktion, wenn r3 null war

sortieren: // hier Ihr Programm um die vorzeichenrichtige Zahlen in Liste2 zu sortieren

ADR r0, TAB2 // Position von TAB2 bestimmen
LDR r0, &#91;r0] // Position der Werte von TAB2 bestimmen (r0 ist die Laufvariable)

LDR r3, &#91;r0],#4 // Zähler (1. Element) für Schleifen laden und auf nächstes Element setzen
sub r3,r3,#2 // Zähler um 2 dekrementieren
mov r6,r0 // r0 nach r6 sichern

mov r1, r3 // Zähler für die äußere Schleife setzen

loop1: // Funktion der äußeren Schleife

mov r0,r6 // r0 auf die Position der Tabelle2 setzen
mov r2, r3 // Innere Schleife zurücksetzen

loop2: // Funktion für die innere Schleife
sub r2,r2,#1 // Zähler der inneren Schleife um 1 dekrementieren

LDR r4,&#91;r0] // Aktuelles Element laden nach r4
LDR r5,&#91;r0,#4]! // Folgendes Element laden nach r5

cmp r4,r5 // Vergleich: r4-r5
STRGT r5,&#91;r0,#-4] // Speichern von r5 an die Position von r4
STRGT r4,&#91;r0] // Speichern von r4 an die Position von r5

cmp r2,#0 // Vergleich: r2-0
bne loop2 // Aufruf der inneren Schleife, wenn r2 nicht null ist

sub r1, r1,#1 // Zähler der äußeren Schleife um 1 dekrementieren
cmp r1,#0 // Vergleich r1-0
bne loop1 // Aufruf der äußeren Schleife, wenn r1 nicht null ist
beq fertig // Ende des Sortierens und Aufruf von "fertig", wenn r1 null ist.

fertig:
ldmfd sp!, {r4, r5, pc} @ Ruecksprungadresse und Register

TAB2: .word Liste2 @ Beispiel um an Adressen aus anderen Segmenten zu kommen

.Lfe1:
.size main,.Lfe1-main

// .data-Section fuer initialisierte Daten
.data
// Erster Wert der Tabelle steht fuer die Anzahl (max. 64) der Werte der Tabelle
Liste1: .byte (Liste1Ende-Liste1), -7, 8, -9, 6, -5, 4, -3, 2, -1, 0, 127, 128 //128
Liste1Ende:

// .comm-Section fuer nicht initialisierte Daten
.comm Liste2, ((Liste1Ende-Liste1)*4) @ Speicherbereich mit der Groesse*4 von Liste1 reservieren

// End of File</code></pre>



<h2 class="wp-block-heading">Bericht</h2>



<p class="wp-block-paragraph">Der erforderliche Praktikumsbericht dient zu Ihrer Nachbereitung des Praktikums und wird&nbsp;stichprobenhaft überprüft. Er beinahltet auch den zeilenweisen kommentierten Quelltext. Haben Sie&nbsp;Ihre Berichte zu den Praktikumsterminen dabei.</p>
<p>Der Beitrag <a href="https://maximiliankrieg.de/2011/11/rechnerarchitektur-praktikum-4/">Rechnerarchitektur (Praktikum 4)</a> erschien zuerst auf <a href="https://maximiliankrieg.de">Maximilian Krieg</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://maximiliankrieg.de/2011/11/rechnerarchitektur-praktikum-4/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Rechnerarchitektur (Praktikum 3)</title>
		<link>https://maximiliankrieg.de/2011/11/rechnerarchitektur-praktikum-3/</link>
					<comments>https://maximiliankrieg.de/2011/11/rechnerarchitektur-praktikum-3/#respond</comments>
		
		<dc:creator><![CDATA[Maximilian]]></dc:creator>
		<pubDate>Wed, 09 Nov 2011 20:42:00 +0000</pubDate>
				<category><![CDATA[Rechnerarchitektur]]></category>
		<guid isPermaLink="false">https://maximiliankrieg.de/?p=1565</guid>

					<description><![CDATA[<p>Der Beitrag <a href="https://maximiliankrieg.de/2011/11/rechnerarchitektur-praktikum-3/">Rechnerarchitektur (Praktikum 3)</a> erschien zuerst auf <a href="https://maximiliankrieg.de">Maximilian Krieg</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<pre class="wp-block-code"><code>.file "aufgabe1.S"
.text
.align 2
.global main
.type main,function

main:
@ args = 0, pretend = 0, frame = 12
@ frame_needed = 1, uses_anonymous_args = 0

LDR R0, LittleEndian // Lesen des Wert unter LittleEndian

bl func

STR R0, BigEndian // Speichern des Ergebnis unter BigEndian

func:
push {lr}
MOV R1, R0, ROR#8
LDR R2, AWert
AND R0, R0, R2
AND R1, R1, R2
ORR R0, R1, R0, ROR#24
pop {pc}

AWert:
.word 0xFF00FF00

LittleEndian:
.word 0x12345678

BigEndian:
.word 0x0

.Lfe1:
.size main,.Lfe1-main</code></pre>



<pre class="wp-block-code"><code>.file "aufgabe2.S"
.text
.align 2
.global main
.type main,function
main:
@ args = 0, pretend = 0, frame = 12
@ frame_needed = 1, uses_anonymous_args = 0

MOV R0, #5 // Belegen des Registers R0 mit dem dezimalen Wert 5
RSB R3, R0, R0, LSL#4 // R3 = (R0*16)-R0
MOV R0, R3, LSL#4 // Multipliziere R3 mit 16 und schreibe das Ergebnis in R0

MOV R0, #5 // Belege Register R0 mit dem dezimalen Wert 5
RSB R0, R0, R0, LSL#9 // R0 = (R0*512)-R0

MOV PC, LR

.Lfe1:
.size main,.Lfe1-main</code></pre>
<p>Der Beitrag <a href="https://maximiliankrieg.de/2011/11/rechnerarchitektur-praktikum-3/">Rechnerarchitektur (Praktikum 3)</a> erschien zuerst auf <a href="https://maximiliankrieg.de">Maximilian Krieg</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://maximiliankrieg.de/2011/11/rechnerarchitektur-praktikum-3/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Rechnerarchitektur (Praktikum 2)</title>
		<link>https://maximiliankrieg.de/2011/10/rechnerarchitektur-praktikum-2/</link>
					<comments>https://maximiliankrieg.de/2011/10/rechnerarchitektur-praktikum-2/#respond</comments>
		
		<dc:creator><![CDATA[Maximilian]]></dc:creator>
		<pubDate>Wed, 26 Oct 2011 19:41:00 +0000</pubDate>
				<category><![CDATA[Rechnerarchitektur]]></category>
		<guid isPermaLink="false">https://maximiliankrieg.de/?p=1563</guid>

					<description><![CDATA[<p>Aufgabe1: Erweitern sie den Befehlssatz des MU0-2 Prozessors um die Befehle PUSH, POP, LDR und STR. Füllen&#160;Sie die Steuerungstabelle aus und malen Sie in die&#8230;</p>
<p>Der Beitrag <a href="https://maximiliankrieg.de/2011/10/rechnerarchitektur-praktikum-2/">Rechnerarchitektur (Praktikum 2)</a> erschien zuerst auf <a href="https://maximiliankrieg.de">Maximilian Krieg</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">Aufgabe1:</h2>



<p class="wp-block-paragraph">Erweitern sie den Befehlssatz des MU0-2 Prozessors um die Befehle PUSH, POP, LDR und STR. Füllen&nbsp;Sie die Steuerungstabelle aus und malen Sie in die Diagramme den jeweiligen Datenfluss.</p>



<p class="wp-block-paragraph"><strong>Befehlstabelle</strong></p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td><strong>Instruction&nbsp;&nbsp;&nbsp;</strong></td><td><strong>Effekt</strong></td></tr><tr><td>Reset</td><td>PC = 0</td></tr><tr><td>LDA S</td><td>A = [S]</td></tr><tr><td>STO S</td><td>[S] = A</td></tr><tr><td>ADD S</td><td>A = A + [S]</td></tr><tr><td>SUB S</td><td>A = A &#8211; [S]</td></tr><tr><td>JMP S</td><td>PC = S</td></tr><tr><td>JGE S</td><td>IF A&nbsp; ≥ 0 PC = S</td></tr><tr><td>JNE S</td><td>IF A ≠ 0 PC = S</td></tr><tr><td>STOP</td><td>stop</td></tr><tr><td>CALL S</td><td>SP = SP-1, [SP] = PC,&nbsp; PC = S</td></tr><tr><td>RETURN</td><td>PC = [SP],SP = SP + 1</td></tr><tr><td>PUSH</td><td>SP = SP-1, [SP] = A</td></tr><tr><td>POP</td><td>A = [SP], SP = SP + 1</td></tr><tr><td>LDR S</td><td>A = [[S]]</td></tr><tr><td>STR S</td><td>[[S]] = A</td></tr><tr><td>MOV PC</td><td>PC = A</td></tr><tr><td>MOV SP</td><td>SP = A</td></tr></tbody></table></figure>



<h2 class="wp-block-heading">PUSH</h2>



<ul class="wp-block-list">
<li>Der Befehl PUSH dekrementiert (SP=SP-1) den Stackpointer (Register SP) und speichert den aktuellen Akkumulatorinhalt (Register A) auf dem Stack.</li>
</ul>



<h2 class="wp-block-heading">POP</h2>



<ul class="wp-block-list">
<li>Der Befehl POP lädt den Wert auf den der Stackpointer zeigt in den Akkumulator und inkrementiert (SP=SP+1) den Stackpointer. </li>
</ul>



<h2 class="wp-block-heading">STR S</h2>



<ul class="wp-block-list">
<li>Der Befehl STR S speichert den Inhalt des Akkumulator auf die Adresse, auf den die Variable S zeigt.</li>
</ul>



<h2 class="wp-block-heading">LDR S</h2>



<ul class="wp-block-list">
<li>Der Befehl LDR S lädt den Akkumulator mit dem Inhalt der Adresse, auf die die Variable S zeigt.</li>
</ul>
<p>Der Beitrag <a href="https://maximiliankrieg.de/2011/10/rechnerarchitektur-praktikum-2/">Rechnerarchitektur (Praktikum 2)</a> erschien zuerst auf <a href="https://maximiliankrieg.de">Maximilian Krieg</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://maximiliankrieg.de/2011/10/rechnerarchitektur-praktikum-2/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
