Menu Close

Rechnerarchitektur (Praktikum 5)

Ziele:

Verständnis für STACK Befehle und deren Nutzung bei Unterprogrammen. Ziel ist es Programme mit möglichst geringer Codegröße zu implementieren, sowie der Umgang mit einem Debugger/Simulator.

Arbeitsverzeichnis:

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.

Vorbereitung

Arbeiten Sie sich in folgende Befehle des ARM-Prozessors und in den ARM Procedure Call Standard (APCS) ein:

Instruktion := Bedeutung
STMFD R13, {R1-R4, LR} := Speichert die Registerwerte R1 bis R4 sowie LR (=R14) an die Adresse, die in R13 (=SP) steht, als voll absteigender Stack

LDMFD R13, {R1-R4, PC} := Lädt den Speicherinhalt von der Adresse, die in R13 (=SP) steht, in Form eines voll absteigenden Stacks in die Register R1 bis R4 sowie PC (=R15)

Aufgabe 1:

In folgenden Tabellen ist jeweils ein Speicherauszug gezeigt. Welche Werte stehen in den Registern nach Ausführung des Blocktransferbefehls? R9 = 0x8000

LDMDA R9, {R1, R2, R6}
R1: 4
R2: 5
R6: 6

LDMFD R9, {R1, R2, R6}
R1: 6
R2: 7
R6: 8
// 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

Aufgabe 2:

Schreiben Sie ein beliebiges, kleines Programm in ARM Assembler, das durch Unterprogramme strukturiert wird. Folgende Anforderungen werden an das Programm gestellt:

  • Die APCS Konvention wird eingehalten
  • Das Programm benutzt (mindestens) drei Unterprogramme (UP):
    • UP1 benutzt nur Scratchregister und stellt keine Blattroutine dar (ruft somit weitere Unterprogramme auf)
    • UP2 benutzt nur Scratchregister und stellt eine Blattroutine dar (ruft somit keine weiteren Unterprogramme auf)
    • UP3 benutzt Nicht-Scratchregister und stellt keine Blattroutine dar
// 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 -> pc zurück laden

.Lfe1:
.size main,.Lfe1-main

// End of File

Aufgabe 3:

Schreiben Sie das Programmbeispiel aus Termin 2 (selbst modifizierender Code )in ARM7-Assembler und testen Sie dieses. Beobachten Sie die sich ändernden Speicherstellen/Befehle. Beschäftigen Sie sich mit den Problemen, welches dieses Programm machen kann.

Warum funktioniert das Programm im Simulator?

  • Das Programm funktioniert, da innerhalb des Simulators alle Programme im RAM stehen.

Wie groß dürfte die Werteliste werden?

// 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, [r0]

Add_instr: // Add_instr

ADR r2, Table
LDR r3, [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

Aufgabe 4:

Berichtigen Sie das Programm nun so, dass der Programmcode (kein sich selbst
modifizierenden Code) im ROM (Read Only Memory) und die sich ändernden Daten im RAM (Random Acces Memory) stehen.

// 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, [r3] // Laden des Wertes der Zähl-Variable

loop:
LDR r2, [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 >=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

Schreiben Sie einen Kommentar

Ihre E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahren Sie, wie Ihre Kommentardaten verarbeitet werden.

Index