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
 
(3 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
 
<!-- Hier wird nur eine Auswahl von den wichtigsten Befehle gezeigt. Unter [[ARMv8-Übersicht]] werden mehr Informationen zum ARMv8 gegeben.
-->
== 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">
add x0, x1, x2  ; x0 = x1 + x2
</syntaxhighlight>


Copy
'''sub''' (Subtrahieren)
ADD X0, X1, X2 ; X0 = X1 + X2
<syntaxhighlight lang="asm">
SUB (Subtrahieren)
sub x0, x1, x2 ; x0 = x1 - x2
</syntaxhighlight>


Copy
'''mul''' (Multiplizieren)
SUB X0, X1, X2 ; X0 = X1 - X2
<syntaxhighlight lang="asm">
MUL (Multiplizieren)
mul x0, x1, x2 ; x0 = x1 * x2
</syntaxhighlight>


  Copy
'''div''' (Dividieren)
MUL X0, X1, X2 ; X0 = X1 * X2
<syntaxhighlight lang="asm">
DIV (Dividieren)
udiv x0, x1, x2 ; x0 = x1 / x2 (unsigned)
sdiv x0, x1, x2 ; x0 = x1 / x2 (signed)
</syntaxhighlight>


Copy
=== Logische Befehle ===
UDIV X0, X1, X2  ; X0 = X1 / X2 (unsigned)
'''and''' (Bitweises UND)
SDIV X0, X1, X2 ; X0 = X1 / X2 (signed)
<syntaxhighlight lang="asm">
Logische Befehle
and x0, x1, x2 ; x0 = x1 & x2
AND (Bitweises UND)
</syntaxhighlight>


Copy
'''orr''' (Bitweises ODER)
AND X0, X1, X2 ; X0 = X1 & X2
<syntaxhighlight lang="asm">
ORR (Bitweises ODER)
orr x0, x1, x2 ; x0 = x1 | x2
</syntaxhighlight>


Copy
'''eor''' (Exklusives ODER)
ORR X0, X1, X2 ; X0 = X1 | X2
<syntaxhighlight lang="asm">
EOR (Exklusives ODER)
eor x0, x1, x2 ; x0 = x1 ^ x2
</syntaxhighlight>


Copy
'''lsl''' (Logisches Schieben nach links)
EOR X0, X1, X2 ; X0 = X1 ^ X2
<syntaxhighlight lang="asm">
LSL (Logisches Schieben nach links)
lsl x0, x1, #2 ; x0 = x1 << 2
</syntaxhighlight>


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


Copy
=== Speicherzugriffsbefehle ===
LSR X0, X1, #2 ; X0 = X1 >> 2
'''ldr''' (Lade Register)
Speicherzugriffsbefehle
<syntaxhighlight lang="asm">
LDR (Laden)
ldr x0, [x1] ; Lade den Wert aus der Speicheradresse, die in x1 gespeichert ist, in x0
</syntaxhighlight>


Copy
'''str''' (Speicher Register)
LDR X0, [X1]  ; Lade den Wert aus der Speicheradresse, die in X1 gespeichert ist, in X0
<syntaxhighlight lang="asm">
STR (Speichern)
str x0, [x1]  ; Speichere den Wert aus x0 in die Speicheradresse, die in x1 gespeichert ist
</syntaxhighlight>


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


Copy
'''bl''' (Bedingungsloser Sprung mit Link)
B label  ; Springe zu einer bestimmten Marke (label)
<syntaxhighlight lang="asm">
BL (Bedingungsloser Sprung mit Link)
bl label  ; Springe zu einer bestimmten Marke (label) und speichere die Rücksprungadresse
</syntaxhighlight>


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


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


Copy
=== Vergleichsbefehle ===
CBNZ X0, label ; Springe zu einer bestimmten Marke (label), wenn X0 nicht null ist
'''cmp''' (Vergleichen)
Vergleichsbefehle
<syntaxhighlight lang="asm">
CMP (Vergleichen)
cmp x0, x1 ; Vergleiche x0 und x1 und setze die Statusflags entsprechend
</syntaxhighlight>


Copy
'''csel''' (Bedingte Auswahl)
CMP X0, X1 ; Vergleiche X0 und X1 und setze die Statusflags entsprechend
<syntaxhighlight lang="asm">
CSEL (Bedingte Auswahl)
csel x0, x1, x2, EQ ; Wenn die Bedingung EQ (Equal) erfüllt ist, dann x0 = x1, sonst x0 = x2
</syntaxhighlight>


Copy
=== Spezielle Befehle ===
CSEL X0, X1, X2, EQ  ; Wenn die Bedingung EQ (Equal) erfüllt ist, dann X0 = X1, sonst X0 = X2
'''nop''' (No Operation)
Spezielle Befehle
<syntaxhighlight lang="asm">
NOP (No Operation)
nop  ; Führt keine Operation aus, nützlich für Timing oder Platzhalter
</syntaxhighlight>


Copy
'''brk''' (Breakpoint)
NOP ; Führt keine Operation aus, nützlich für Timing oder Platzhalter
<syntaxhighlight lang="asm">
BRK (Breakpoint)
brk #0 ; Erzeugt eine Debugging-Breakpoint-Ausnahme
</syntaxhighlight>


Copy
=== Beispielcode ===
BRK #0  ; Erzeugt eine Debugging-Breakpoint-Ausnahme
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 99: Zeile 119:


_start:
_start:
     LDR X1, =value1  ; Lade die Adresse von value1 in X1
     ldr x1, =value1  ; Lade die Adresse von value1 in x1
     LDR X2, [X1]    ; Lade den Wert von value1 in X2
     ldr x2, [x1]    ; Lade den Wert von value1 in x2
     LDR X1, =value2  ; Lade die Adresse von value2 in X1
     ldr x1, =value2  ; Lade die Adresse von value2 in x1
     LDR X3, [X1]    ; Lade den Wert von value2 in X3
     ldr x3, [x1]    ; Lade den Wert von value2 in x3
     ADD X4, X2, X3   ; Addiere die Werte und speichere das Ergebnis in X4
     add x4, x2, x3   ; Addiere die Werte und speichere das Ergebnis in x4
     LDR X1, =result  ; Lade die Adresse von result in X1
     ldr x1, =result  ; Lade die Adresse von result in x1
     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>

Aktuelle Version vom 26. September 2024, 07:15 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 (Lade Register)

ldr x0, [x1]  ; Lade den Wert aus der Speicheradresse, die in x1 gespeichert ist, in x0

str (Speicher Register)

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