update
BIN
Writerside/images/image_477.png
Normal file
After Width: | Height: | Size: 35 KiB |
BIN
Writerside/images/image_478.png
Normal file
After Width: | Height: | Size: 35 KiB |
BIN
Writerside/images/image_479.png
Normal file
After Width: | Height: | Size: 48 KiB |
BIN
Writerside/images/image_480.png
Normal file
After Width: | Height: | Size: 11 KiB |
BIN
Writerside/images/image_481.png
Normal file
After Width: | Height: | Size: 50 KiB |
BIN
Writerside/images/image_482.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
Writerside/images/image_483.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
Writerside/images/image_484.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
Writerside/images/image_485.png
Normal file
After Width: | Height: | Size: 1.9 KiB |
BIN
Writerside/images/image_486.png
Normal file
After Width: | Height: | Size: 6.6 KiB |
BIN
Writerside/images/image_487.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
Writerside/images/image_488.png
Normal file
After Width: | Height: | Size: 39 KiB |
BIN
Writerside/images/image_489.png
Normal file
After Width: | Height: | Size: 6.2 KiB |
BIN
Writerside/images/image_490.png
Normal file
After Width: | Height: | Size: 5.1 KiB |
BIN
Writerside/images/image_491.png
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
Writerside/images/image_492.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
Writerside/images/image_493.png
Normal file
After Width: | Height: | Size: 35 KiB |
BIN
Writerside/images/image_494.png
Normal file
After Width: | Height: | Size: 5.5 KiB |
@ -59,6 +59,10 @@
|
|||||||
<toc-element topic="arm_befehle.md">
|
<toc-element topic="arm_befehle.md">
|
||||||
<toc-element topic="arm_adressierung.md"/>
|
<toc-element topic="arm_adressierung.md"/>
|
||||||
</toc-element>
|
</toc-element>
|
||||||
|
<toc-element toc-title="ARM Hochsprache">
|
||||||
|
<toc-element topic="arm_hochsprache_typen.md"/>
|
||||||
|
<toc-element topic="arm_hochsprache_strukturen.md"/>
|
||||||
|
</toc-element>
|
||||||
</toc-element>
|
</toc-element>
|
||||||
</toc-element>
|
</toc-element>
|
||||||
</toc-element>
|
</toc-element>
|
||||||
|
@ -35,7 +35,7 @@
|
|||||||
#### Kosten
|
#### Kosten
|
||||||
- Teuer in Produktion
|
- Teuer in Produktion
|
||||||
- Günstig in Verteilung/Reproduktion
|
- Günstig in Verteilung/Reproduktion
|
||||||
- erste Digitale Kopie hat einmaligen Aufwand an Fixkosten
|
- erste digitale Kopie hat einmaligen Aufwand an Fixkosten
|
||||||
- **First Copy Costs**
|
- **First Copy Costs**
|
||||||
- Stückkostendegression
|
- Stückkostendegression
|
||||||
- "The Winner takes it all!"
|
- "The Winner takes it all!"
|
||||||
|
@ -127,4 +127,32 @@
|
|||||||
## Beispiel Kopieren indiziert
|
## Beispiel Kopieren indiziert
|
||||||
- 
|
- 
|
||||||
- 
|
- 
|
||||||
-
|
|
||||||
|
|
||||||
|
## Load/Store - Befehlsformat
|
||||||
|

|
||||||
|
|
||||||
|
## Adressierungsarten übersicht
|
||||||
|
| Art | ARM-Beispiel | Alternativer Name |
|
||||||
|
|-----------------------------|----------------------------------------------------------------------------------|--------------------------------------------------------------------------|
|
||||||
|
| Immediate | `mov r0, #8` | Literal |
|
||||||
|
| Direkt | wird nicht unterstützt | Absolute |
|
||||||
|
| PC-relativ | `ldr r1, [pc, #offset]`<br/>Pseudobefehl, `label` in `.text`<br/>`ldr r1, label` | |
|
||||||
|
| Register | `mov r0, r1` | Register-to-Register<br/>Register Direct |
|
||||||
|
| Register-Indirect | `ldr r0, [r1]` | Indexed |
|
||||||
|
| Indiziert / Index | `ldr r0, [r1, #4]`<br/>`ldr r0, [r1, #4]!`<br/>`ldr r0, [r1], #4` | Pre-indexed<br/>Post-indexed,<br/>pre-incrementing<br/>post-incrementing |
|
||||||
|
| Basis-indizierte | `ldr r0, [r1, r0, LSL#2]` | |
|
||||||
|
| Basis-indizierte mit Offset | wird nicht unterstützt | |
|
||||||
|
|
||||||
|
|
||||||
|
## Blocktransfer-Befehle
|
||||||
|

|
||||||
|
- Register mit niedrigster Nummer wird geladen von/gespeichert nach der niedrigsten Adresse
|
||||||
|
- Reihenfolge der angegebenen Register im Befehl spielt keine Rolle
|
||||||
|
|
||||||
|
### Beispiel
|
||||||
|

|
||||||
|
|
||||||
|
## Stacks
|
||||||
|
- push {}
|
||||||
|
- pop {}
|
170
Writerside/topics/RA/arm_hochsprache_strukturen.md
Normal file
@ -0,0 +1,170 @@
|
|||||||
|
# ARM Hochsprache Strukturen
|
||||||
|
## Unterprogrammtechnik
|
||||||
|
- wird durch `bl Unterprogramm` aufgerufen
|
||||||
|
- _Unterprogramm_ muss zu dem Zeitpunkt bereits ein bekanntes Label sein
|
||||||
|
|
||||||
|
| Blatt-Routinen | Nicht-Blatt-Routinen |
|
||||||
|
|--------------------------------|--------------------------|
|
||||||
|
| rufen keine Unterprogramme auf | rufen Unterprogramme auf |
|
||||||
|
|
||||||
|
|
||||||
|
## Unterprogrammaufruf
|
||||||
|

|
||||||
|
|
||||||
|
## Indirekte Unterprogrammaufrufe
|
||||||
|
- Falls Adresse zur Compilezeit nicht bekannt ist
|
||||||
|
|
||||||
|
- Annahme: aufzurufende Programmadresse steht in r0
|
||||||
|
- `mov lr, pc`
|
||||||
|
- `mov pc, r0`
|
||||||
|
- Durch Pipelining entsteht im PC die aktuelle Bitadresse +8
|
||||||
|
- Da jeder Befehl Länge von 4 Byte hat
|
||||||
|
- Linkregister zeigt auf Rücksprungadresse
|
||||||
|
|
||||||
|
## ARM Procedure Calling Standard (APCS)
|
||||||
|
- Schnittstelle zwischen Programmteilen
|
||||||
|
- Wie werden Parameter an Unterprogramme übergeben
|
||||||
|
- Welche Register dürfen zerstört werden
|
||||||
|
- Wie werden Ereignisse zurückgegeben
|
||||||
|
- Wie sieht das Stackframe eines Unterprogramms aus
|
||||||
|
|
||||||
|
### Konvention zur Parameterübergabe von 32Bit-Daten
|
||||||
|
- 
|
||||||
|
- Parameter 1-4 werden in den Registern r0-r3 übergeben
|
||||||
|
- Rückgabewert von Funktionen steht im Register r0 oder r0/r1
|
||||||
|
- Register r0-r3 und Register ip sind Scratch Register
|
||||||
|
- Inhalt darf im Unterprogramm zerstört werden
|
||||||
|
- Informationen in r4-r10, fp, sp müssen erhalten werden
|
||||||
|
- Inhalt von lr wird zur Rückkehr ins aufrufende Programm benötigt
|
||||||
|
|
||||||
|
## Parameterübergabe bei anderen Prozessoren (CISC)
|
||||||
|
- 
|
||||||
|
- Übergabe in Registern typisch für Load/Store-Architekturen
|
||||||
|
- vermeidet Zugriffe auf Speicher
|
||||||
|
- Andere Prozessoren verwenden Stack
|
||||||
|
- Parameter
|
||||||
|
- Rücksprungadresse (PC)
|
||||||
|
- Ergebnis im ACC zurückgeben
|
||||||
|
|
||||||
|
## Blatt-Funktionen
|
||||||
|
- können lokale Variablen in Scratch-Registern speichern
|
||||||
|
- Rückkehradresse kann im Linkregister bleiben
|
||||||
|
- 
|
||||||
|
|
||||||
|
## Nicht-Blatt-Funktionen
|
||||||
|
- Linkregister wird durch neue Rücksprungadresse überschrieben
|
||||||
|
- vorher auf Stack retten
|
||||||
|
- Scratchregister dürfen durch neues Unterprogramm frei verwendet werden
|
||||||
|
- keine lokalen Variablen speichern
|
||||||
|
- Variablenregister verwenden
|
||||||
|
- von Anfang an auf Stack
|
||||||
|
- 
|
||||||
|
|
||||||
|
## Unterprogramm
|
||||||
|
- Unterprogrammaufruf mit Parameterübergabe
|
||||||
|
- Dokumentation
|
||||||
|
- Übergabewerte & lokale Variablen
|
||||||
|
- Eingangsprüfung Parameter
|
||||||
|
- ggf. Abbruch
|
||||||
|
- ggf. Register retten
|
||||||
|
- Initialisation Rückgabeparameter, lokale Variablen
|
||||||
|
- Programmkörper beachten
|
||||||
|
- Anweisungen, Schleifen, Verzweigungen: Grenzfälle der Indizes
|
||||||
|
- Speicherzugriffe passend zur Datengröße
|
||||||
|
- ggf. Register restaurieren
|
||||||
|
- Rückgabewert setzen
|
||||||
|
- Rücksprung
|
||||||
|
|
||||||
|
## Operanden in Ausdrücken
|
||||||
|
- Argument im Register
|
||||||
|
- Argument auf dem Stack
|
||||||
|
- Stackpointer
|
||||||
|
- Relative Adressierung
|
||||||
|
- Stackpointer + Offset
|
||||||
|
- Als Konstante im Literal-Bereich der Prozedur
|
||||||
|
- PC-relative Adressierung mit Offset
|
||||||
|
- Als lokale Variable
|
||||||
|
- liegt im Stack
|
||||||
|
- Zugriff relativ zum Stack-Pointer / Frame-Pointer mit LDR
|
||||||
|
- Als globale Variable
|
||||||
|
- liegt im statischen Datenbereich im Speicher
|
||||||
|
- Adresse liegt relativ zur statischen Basisadresse
|
||||||
|
- Zeiger
|
||||||
|
- Array
|
||||||
|
- Kurzschreibweise für Zeiger + Offset
|
||||||
|
|
||||||
|
|
||||||
|
## Kontrollfluss
|
||||||
|
### IF-ELSE
|
||||||
|

|
||||||
|
|
||||||
|
### Switch
|
||||||
|

|
||||||
|
```c++
|
||||||
|
int testswitch( int a, int* b, int c ) {
|
||||||
|
switch (a) {
|
||||||
|
case 0:
|
||||||
|
*b = 0;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
if ( c > 100 ) *b = 0;
|
||||||
|
else *b = 3;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
*b = 1;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
*b = 2;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### While
|
||||||
|

|
||||||
|
|
||||||
|
### Do-While
|
||||||
|

|
||||||
|
|
||||||
|
### For
|
||||||
|

|
||||||
|
```c++
|
||||||
|
void testfor( int a[]) {
|
||||||
|
for (int i = 0; i < 10; i++){
|
||||||
|
a[i] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Objekte, (virtuelle) Methoden
|
||||||
|
### Methodenaufrufe bei Objekten
|
||||||
|
- Methode bekommt als ersten Parameter immer einen Zeiger auf das betreffende Objekt (this)
|
||||||
|
- Zugriff auf Daten des Objektes gewährleistet
|
||||||
|
|
||||||
|
### Statischer Objektaufruf
|
||||||
|
- Falls Methoden einer Klasse nicht virtuell
|
||||||
|
- Compiler kann zur Compile-Zeit schon Klasse bestimmen und Adresse der Methode einsetzen
|
||||||
|
|
||||||
|
### Dynamischer Methodenaufruf
|
||||||
|
- 
|
||||||
|
|
||||||
|
## Beispiele Assemblerprogramme
|
||||||
|
### my_max
|
||||||
|
```c++
|
||||||
|
#include <stdlib.h>
|
||||||
|
void my_max(int a, int b, int* c) {}
|
||||||
|
if (a > b)
|
||||||
|
*c = a;
|
||||||
|
else
|
||||||
|
*c = b;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### my_max ohne Optimierung
|
||||||
|

|
||||||
|
|
||||||
|
#### my_max mit Optimierung
|
||||||
|

|
||||||
|
|
55
Writerside/topics/RA/arm_hochsprache_typen.md
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
# ARM Hochsprache Typen
|
||||||
|
## Abstraktion
|
||||||
|
- Assembler
|
||||||
|
- Programme auf Basis von
|
||||||
|
- Befehlen, Adressen, Register, Byte, Wort, ...
|
||||||
|
- Abstraktion
|
||||||
|
- wird durch Software erreicht
|
||||||
|
- keine explizite Sprachunterstützung
|
||||||
|
- Hochsprachen
|
||||||
|
- unterstützen besser das Denken in abstrakten Begriffen
|
||||||
|
- CPU-unabhängig
|
||||||
|
|
||||||
|
## Datentypen
|
||||||
|
- Kennzeichnen sich durch
|
||||||
|
- Anzahl benötigte Bits
|
||||||
|
- Anordnung der Bits
|
||||||
|
- Art der Verwendung der Bits
|
||||||
|
- Datentypen
|
||||||
|
- Positive/Negative Ganzzahlen
|
||||||
|
- binär, dezimal, hexadezimal, Wertbereiche
|
||||||
|
- Gleitkommazahlen
|
||||||
|
- [Zeichen](#zeichen)
|
||||||
|
|
||||||
|
## Zeichen
|
||||||
|
- Erste Mainframes
|
||||||
|
- Uneinheitliche Codierung von Buchstaben
|
||||||
|
- ASCII:
|
||||||
|
- 7Bit
|
||||||
|
- diverse ISO
|
||||||
|
|
||||||
|
## ANSI C Basisdatentypen
|
||||||
|
- Char
|
||||||
|
- Short Integer
|
||||||
|
- Integer
|
||||||
|
- Long Integer
|
||||||
|
- Float
|
||||||
|
- Double
|
||||||
|
- Long Double
|
||||||
|
- Aufzählungstypen
|
||||||
|
- Bitfelder
|
||||||
|
|
||||||
|
### Abgeleitete ANSI C Datentypen
|
||||||
|
- Arrays
|
||||||
|
- Funktionen
|
||||||
|
- Strukturen
|
||||||
|
- Zeiger/Pointer
|
||||||
|
- Varianten/Unions
|
||||||
|
|
||||||
|
## Gleitkommazahlen
|
||||||
|
### ISO IEEE754
|
||||||
|

|
||||||
|
|
||||||
|
- Beispiele
|
||||||
|
- 
|
||||||
|
|