Grundlegende Befehle: Unterschied zwischen den Versionen

Aus C und Assembler mit Raspberry
Die Seite wurde neu angelegt: „ Assembler-Befehle (auch als Instruktionen oder Maschinenbefehle bezeichnet) für ARM-Prozessoren wie die ARM Cortex-A76 oder den Broadcom BCM2712 (der auf ARM-Technologie basiert) basieren auf der ARMv8-A Architektur. Hier sind einige grundlegende Befehle, die in der ARMv8-A Assembler-Programmierung verwendet werden: Datenverarbeitungsbefehle ADD (Addieren) Copy ADD X0, X1, X2 ; X0 = X1 + X2 SUB (Subtrahieren) Copy SUB X0, X1, X2 ; X0 = X1 - X2 M…“
 
KKeine Bearbeitungszusammenfassung
Zeile 1: Zeile 1:
 
== Grundlegende Befehle für 64-BitAssembler ==


Assembler-Befehle (auch als Instruktionen oder Maschinenbefehle bezeichnet) für ARM-Prozessoren wie die ARM Cortex-A76 oder den Broadcom BCM2712 (der auf ARM-Technologie basiert) basieren auf der ARMv8-A Architektur. Hier sind einige grundlegende Befehle, die in der ARMv8-A Assembler-Programmierung verwendet werden:
Assembler-Befehle (auch als Instruktionen oder Maschinenbefehle bezeichnet) für ARM-Prozessoren wie die ARM Cortex-A76 oder den Broadcom BCM2712 (der auf ARM-Technologie basiert) basieren auf der ARMv8-A Architektur. Hier sind einige grundlegende Befehle, die in der ARMv8-A Assembler-Programmierung verwendet werden:


Datenverarbeitungsbefehle
=== Datenverarbeitungsbefehle ===
ADD (Addieren)
'''ADD''' (Addieren)
 
<syntaxhighlight lang="asm">
Copy
ADD X0, X1, X2  ; X0 = X1 + X2
ADD X0, X1, X2  ; X0 = X1 + X2
SUB (Subtrahieren)
</syntaxhighlight>


Copy
'''SUB''' (Subtrahieren)
<syntaxhighlight lang="asm">
SUB X0, X1, X2  ; X0 = X1 - X2
SUB X0, X1, X2  ; X0 = X1 - X2
MUL (Multiplizieren)
</syntaxhighlight>


Copy
'''MUL''' (Multiplizieren)
<syntaxhighlight lang="asm">
MUL X0, X1, X2  ; X0 = X1 * X2
MUL X0, X1, X2  ; X0 = X1 * X2
DIV (Dividieren)
</syntaxhighlight>


Copy
'''DIV''' (Dividieren)
<syntaxhighlight lang="asm">
UDIV X0, X1, X2  ; X0 = X1 / X2 (unsigned)
UDIV X0, X1, X2  ; X0 = X1 / X2 (unsigned)
SDIV X0, X1, X2  ; X0 = X1 / X2 (signed)
SDIV X0, X1, X2  ; X0 = X1 / X2 (signed)
Logische Befehle
</syntaxhighlight>
AND (Bitweises UND)


Copy
=== Logische Befehle ===
'''AND''' (Bitweises UND)
<syntaxhighlight lang="asm">
AND X0, X1, X2  ; X0 = X1 & X2
AND X0, X1, X2  ; X0 = X1 & X2
ORR (Bitweises ODER)
</syntaxhighlight>


Copy
'''ORR''' (Bitweises ODER)
<syntaxhighlight lang="asm">
ORR X0, X1, X2  ; X0 = X1 | X2
ORR X0, X1, X2  ; X0 = X1 | X2
EOR (Exklusives ODER)
</syntaxhighlight>


Copy
'''EOR''' (Exklusives ODER)
<syntaxhighlight lang="asm">
EOR X0, X1, X2  ; X0 = X1 ^ X2
EOR X0, X1, X2  ; X0 = X1 ^ X2
LSL (Logisches Schieben nach links)
</syntaxhighlight>


Copy
'''LSL''' (Logisches Schieben nach links)
<syntaxhighlight lang="asm">
LSL X0, X1, #2  ; X0 = X1 << 2
LSL X0, X1, #2  ; X0 = X1 << 2
LSR (Logisches Schieben nach rechts)
</syntaxhighlight>


Copy
'''LSR''' (Logisches Schieben nach rechts)
<syntaxhighlight lang="asm">
LSR X0, X1, #2  ; X0 = X1 >> 2
LSR X0, X1, #2  ; X0 = X1 >> 2
Speicherzugriffsbefehle
</syntaxhighlight>
LDR (Laden)


Copy
=== Speicherzugriffsbefehle ===
'''LDR''' (Laden)
<syntaxhighlight lang="asm">
LDR X0, [X1]  ; Lade den Wert aus der Speicheradresse, die in X1 gespeichert ist, in X0
LDR X0, [X1]  ; Lade den Wert aus der Speicheradresse, die in X1 gespeichert ist, in X0
STR (Speichern)
</syntaxhighlight>


Copy
'''STR''' (Speichern)
<syntaxhighlight lang="asm">
STR X0, [X1]  ; Speichere den Wert aus X0 in die Speicheradresse, die in X1 gespeichert ist
STR X0, [X1]  ; Speichere den Wert aus X0 in die Speicheradresse, die in X1 gespeichert ist
Bedingte Befehle
</syntaxhighlight>
B (Bedingungsloser Sprung)


Copy
=== Bedingte Befehle ===
'''B''' (Bedingungsloser Sprung)
<syntaxhighlight lang="asm">
B label  ; Springe zu einer bestimmten Marke (label)
B label  ; Springe zu einer bestimmten Marke (label)
BL (Bedingungsloser Sprung mit Link)
</syntaxhighlight>


Copy
'''BL''' (Bedingungsloser Sprung mit Link)
<syntaxhighlight lang="asm">
BL label  ; Springe zu einer bestimmten Marke (label) und speichere die Rücksprungadresse
BL label  ; Springe zu einer bestimmten Marke (label) und speichere die Rücksprungadresse
CBZ (Vergleiche und springe, wenn null)
</syntaxhighlight>


Copy
'''CBZ''' (Vergleiche und springe, wenn null)
<syntaxhighlight lang="asm">
CBZ X0, label  ; Springe zu einer bestimmten Marke (label), wenn X0 null ist
CBZ X0, label  ; Springe zu einer bestimmten Marke (label), wenn X0 null ist
CBNZ (Vergleiche und springe, wenn nicht null)
</syntaxhighlight>


Copy
'''CBNZ''' (Vergleiche und springe, wenn nicht null)
<syntaxhighlight lang="asm">
CBNZ X0, label  ; Springe zu einer bestimmten Marke (label), wenn X0 nicht null ist
CBNZ X0, label  ; Springe zu einer bestimmten Marke (label), wenn X0 nicht null ist
Vergleichsbefehle
</syntaxhighlight>
CMP (Vergleichen)


Copy
=== Vergleichsbefehle ===
'''CMP''' (Vergleichen)
<syntaxhighlight lang="asm">
CMP X0, X1  ; Vergleiche X0 und X1 und setze die Statusflags entsprechend
CMP X0, X1  ; Vergleiche X0 und X1 und setze die Statusflags entsprechend
CSEL (Bedingte Auswahl)
</syntaxhighlight>


Copy
'''CSEL''' (Bedingte Auswahl)
<syntaxhighlight lang="asm">
CSEL X0, X1, X2, EQ  ; Wenn die Bedingung EQ (Equal) erfüllt ist, dann X0 = X1, sonst X0 = X2
CSEL X0, X1, X2, EQ  ; Wenn die Bedingung EQ (Equal) erfüllt ist, dann X0 = X1, sonst X0 = X2
Spezielle Befehle
</syntaxhighlight>
NOP (No Operation)


Copy
=== Spezielle Befehle ===
'''NOP''' (No Operation)
<syntaxhighlight lang="asm">
NOP  ; Führt keine Operation aus, nützlich für Timing oder Platzhalter
NOP  ; Führt keine Operation aus, nützlich für Timing oder Platzhalter
BRK (Breakpoint)
</syntaxhighlight>


Copy
'''BRK''' (Breakpoint)
<syntaxhighlight lang="asm">
BRK #0  ; Erzeugt eine Debugging-Breakpoint-Ausnahme
BRK #0  ; Erzeugt eine Debugging-Breakpoint-Ausnahme
Beispielcode
</syntaxhighlight>
 
=== Beispielcode ===
Hier ist ein einfacher ARMv8-A Assembler-Programmcode, der zwei Zahlen addiert und das Ergebnis speichert:
Hier ist ein einfacher ARMv8-A Assembler-Programmcode, der zwei Zahlen addiert und das Ergebnis speichert:
 
<syntaxhighlight lang="asm">
Copy
.section .data
.section .data
value1: .word 5
value1: .word 5
Zeile 107: Zeile 125:
     STR X4, [X1]    ; Speichere das Ergebnis in result
     STR X4, [X1]    ; Speichere das Ergebnis in result
     BRK #0          ; Beende das Programm
     BRK #0          ; Beende das Programm
</syntaxhighlight>

Version vom 2. September 2024, 10:04 Uhr

Grundlegende Befehle für 64-BitAssembler

Assembler-Befehle (auch als Instruktionen oder Maschinenbefehle bezeichnet) für ARM-Prozessoren wie die ARM Cortex-A76 oder den Broadcom BCM2712 (der auf ARM-Technologie basiert) basieren auf der ARMv8-A Architektur. Hier sind einige grundlegende Befehle, die in der ARMv8-A Assembler-Programmierung verwendet werden:

Datenverarbeitungsbefehle

ADD (Addieren)

ADD X0, X1, X2  ; X0 = X1 + X2

SUB (Subtrahieren)

SUB X0, X1, X2  ; X0 = X1 - X2

MUL (Multiplizieren)

MUL X0, X1, X2  ; X0 = X1 * X2

DIV (Dividieren)

UDIV X0, X1, X2  ; X0 = X1 / X2 (unsigned)
SDIV X0, X1, X2  ; X0 = X1 / X2 (signed)

Logische Befehle

AND (Bitweises UND)

AND X0, X1, X2  ; X0 = X1 & X2

ORR (Bitweises ODER)

ORR X0, X1, X2  ; X0 = X1 | X2

EOR (Exklusives ODER)

EOR X0, X1, X2  ; X0 = X1 ^ X2

LSL (Logisches Schieben nach links)

LSL X0, X1, #2  ; X0 = X1 << 2

LSR (Logisches Schieben nach rechts)

LSR X0, X1, #2  ; X0 = X1 >> 2

Speicherzugriffsbefehle

LDR (Laden)

LDR X0, [X1]  ; Lade den Wert aus der Speicheradresse, die in X1 gespeichert ist, in X0

STR (Speichern)

STR X0, [X1]  ; Speichere den Wert aus X0 in die Speicheradresse, die in X1 gespeichert ist

Bedingte Befehle

B (Bedingungsloser Sprung)

B label  ; Springe zu einer bestimmten Marke (label)

BL (Bedingungsloser Sprung mit Link)

BL label  ; Springe zu einer bestimmten Marke (label) und speichere die Rücksprungadresse

CBZ (Vergleiche und springe, wenn null)

CBZ X0, label  ; Springe zu einer bestimmten Marke (label), wenn X0 null ist

CBNZ (Vergleiche und springe, wenn nicht null)

CBNZ X0, label  ; Springe zu einer bestimmten Marke (label), wenn X0 nicht null ist

Vergleichsbefehle

CMP (Vergleichen)

CMP X0, X1  ; Vergleiche X0 und X1 und setze die Statusflags entsprechend

CSEL (Bedingte Auswahl)

CSEL X0, X1, X2, EQ  ; Wenn die Bedingung EQ (Equal) erfüllt ist, dann X0 = X1, sonst X0 = X2

Spezielle Befehle

NOP (No Operation)

NOP  ; Führt keine Operation aus, nützlich für Timing oder Platzhalter

BRK (Breakpoint)

BRK #0  ; Erzeugt eine Debugging-Breakpoint-Ausnahme

Beispielcode

Hier ist ein einfacher ARMv8-A Assembler-Programmcode, der zwei Zahlen addiert und das Ergebnis speichert:

.section .data
value1: .word 5
value2: .word 10
result: .word 0

.section .text
.global _start

_start:
    LDR X1, =value1  ; Lade die Adresse von value1 in X1
    LDR X2, [X1]     ; Lade den Wert von value1 in X2
    LDR X1, =value2  ; Lade die Adresse von value2 in X1
    LDR X3, [X1]     ; Lade den Wert von value2 in X3
    ADD X4, X2, X3   ; Addiere die Werte und speichere das Ergebnis in X4
    LDR X1, =result  ; Lade die Adresse von result in X1
    STR X4, [X1]     ; Speichere das Ergebnis in result
    BRK #0           ; Beende das Programm