0 Daumen
435 Aufrufe

Ich habe Schwierigkeiten ein Assembler-Programm zu schreiben, der positive Zahlen der Grösse nach sortieren soll.

Also:

LDA (15)
...
END
Avatar von

Assembler ist nicht so standardisiert wie höhere Programmiersprachen es sind. Es gibt für jede Prozessorarchitektur eine eigene Assemblersprache (mindestens).

Was für eine Assemblersprache verwendest du?

Ok also wir hatten mit den von neumann rechner begonnen. Ist es das?:)

Das ist es nicht. In der Kursbeschreibung oder in deinen Unterlagen müsste stehen, welche Assemblersprache verwendet wird und optimalerweise auch, wo ihr euch ein Programm für die Übersetzung in Maschinencode herunterladen könnt.

Um das Problem noch mal zu verdeutlichen: "Hello World!" in 19 verschiedenen Assemblersprachen.

1 Antwort

0 Daumen

Antwort mit KI erzeugt

Für diese Antwort erstelle ich ein exemplarisches Assembler-Programm, das eine Liste von positiven Zahlen sortiert. Ich gehe davon aus, dass du mit einem hypothetischen Assembler arbeitest, da du keine spezifische Architektur oder Assemblersprache angegeben hast.

Das Programm verwendet den Bubble-Sort-Algorithmus, welcher einfach zu verstehen und zu implementieren ist, allerdings nicht sehr effizient bei großen Zahlenlisten. Der Algorithmus vergleicht wiederholt benachbarte Elemente und tauscht sie, wenn sie in der falschen Reihenfolge sind. Dieser Prozess wiederholt sich, bis keine Tausche mehr nötig sind, was bedeutet, dass die Liste sortiert ist.

Annahmen:
- Wir sortieren eine statisch definierte Liste von Zahlen.
- Die Liste ist im Speicher direkt nach den Befehlen gespeichert.
- Das Ende der Liste wird durch eine sehr große Zahl markiert, z.B. 0xFFFF.
- Dein Assembler unterstützt Basisbefehle wie LDA (Lade Akkumulator), STA (Speichere Akkumulator), JMP (Springe zu Adresse), sowie bedingte Sprünge und Vergleichsbefehle.

Programm:

assembly
    LDX #0          ; X-Register als Schleifenzähler für die Durchläufe
OuterLoop:
    LDA #0          ; A-Register initialisieren
    LDY #0          ; Y-Register als Index für die Liste
InnerLoop:
    LDA numbers,Y   ; Lade das aktuelle Element
    CMP numbers+1,Y ; Vergleiche es mit dem nächsten
    BCS NoSwap      ; Springe weiter, wenn in Ordnung (Current <= Next)
    ; Austauschen der Elemente, wenn das aktuelle Element größer als das nächste ist
    STA TEMP        ; Temporäres Speichern des aktuellen Elements
    LDA numbers+1,Y ; Laden des nächsten Elements
    STA numbers,Y   ; Speichern an aktueller Position
    LDA TEMP        ; Laden des gespeicherten (ehemals aktuellen) Elements
    STA numbers+1,Y ; Speichern an der nächsten Position
    
NoSwap:
    INY             ; Erhöhe den Index für das nächste Element
    LDA numbers+1,Y ; Prüfe, ob das Ende der Liste erreicht ist
    CMP #0xFFFF     ; Vergleiche mit der Markierung für das Listenende
    BNE InnerLoop   ; Wenn nicht am Ende, weiter im inneren Loop
    
    INX             ; Erhöhe den Zähler für den äußeren Durchlauf
    CPX #LENGTH     ; Vergleiche mit der Anzahl der Elemente in der Liste
    BNE OuterLoop   ; Wenn noch nicht genug Durchläufe, wiederhole den äußeren Loop

    ; Liste sortiert
    BRK             ; Programmende

; Daten
TEMP    .BYTE 0         ; Temporärer Speicher
numbers .BYTE 5,3,7,1,2,0xFFFF ; Unsere zu sortierende Liste, mit Endmarkierung
LENGTH  .EQU 5           ; Länge der Liste (ohne Endmarkierung)


Wichtig: Dies ist ein sehr generischer und simplifizierter Code, basierend auf den Annahmen über den Assembler, den du verwendest. In der realen Welt müsstest du den Code an die Spezifikationen und Syntax deiner spezifischen Assembler-Sprache anpassen, einschließlich der verwendeten Direktiven, Registerbezeichnungen und Befehlen.
Avatar von 2,9 k

Ein anderes Problem?

Stell deine Frage

Willkommen bei der Stacklounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community