Assembler Befehle lernen? MMIX?

5 Antworten

Das Problem ist, daß es Assembler für jede Architektur gibt und dann auch noch unterschiedliche Dialekte, z.B. die Parameterreihenfolge.

Ohne also zu wissen, was da vorliegt, wird es schwer.

Anhand dem, was man sieht, scheint die Reihenfolge Ziel,Quelle zu sein, da ein set $0,4 nur Sinn ergibt, wenn die Konstante die Quelle ist.

Es ist durchaus auch denkbar, daß es eine Art RTL ist.


Pro1234Pro 
Beitragsersteller
 19.12.2018, 15:41

Es ist MMIX

KarlRanseierIII  19.12.2018, 15:48
@Pro1234Pro

Ah, okay, also eher eine RTL.

MMIX ist (IMHO) eine der Sachen, bei denen Knuth kein ganz so glückliches Händchen bewiesen hat.

Aber dann hast Du jetzt ja einen Anhaltspunkt. Die Mnemocis helfen Dir übrigens in der Regel beim Lesen. SET (setzen) CMP - compare - vergleichen).

Die Assemblerbefehle sind leider für jeden Prozessortyp unterschiedlich oft gibt es sogar mehrere Assembler, die unterschiedliche Befehle für den gleichen Prozessortyp haben. Ihr müsstet also eine Anleitung gekriegt haben, wo genau drinsteht, welcher Befehl was auslöst oder zumindest, für welchen Prozessortyp diese Anweisungen gelten.


Pro1234Pro 
Beitragsersteller
 19.12.2018, 15:21

Könnte es MMIX sein? Weiß nicht wie das zuzuordnen ist.

daCypher  19.12.2018, 15:44
@Pro1234Pro

Ja, das sieht ziemlich plausibel aus.

Mal schauen...

res IS $5 - Das ist eine Konstante für den Assembler. Die heißt eigentlich nur "Überall, wo res steht, denk dir stattdessen ein $5 hin"

LOC #100 - Schreibe die folgenden Anweisungen in Speicherposition 100

Main - Nur ein Label, damit du siehst, dass es hier mit dem eigentlichen Quelltext losgeht

SET $0, 4 - Setze Register 0 auf den Wert 4
SET $1, 15 - Setze Register 1 auf den Wert 15
SET $2, 95 - Setze Register 2 auf den Wert 95
SET res, $0 - Setze res (Register 5) auf den Wert aus Register 0

CMP $0, res, $1 - Vergleiche res mit Register 1 und schreibe das Ergebnis in das Register 0

CSN res, $0, $1 - Conditional Set Negative. So, wie ich das verstehe, wird res mit dem Wert aus Register 1 gefüllt, wenn Register 0 negativ ist.

CMP $0, res, $2 - Vergleiche res mit Register 2 und schreibe das Ergebnis in das Register 0

CSN res, $0, $2 - Wenn Register 0 negativ ist, schreibe den Wert aus Register 2 in res

TRAP 0, halt, 0 - Löst einen Interrupt aus. Wahrscheinlich wird damit einfach das Programm beendet.

Durchgehen und rauskriegen, was am Ende rauskommt, musst du leider selber. Auf der Seite http://mmix.cs.hm.edu/index.html ist der (virtuelle) Prozessor und der Assembler dazu sehr genau erklärt. Mit den Dokumentationen kann man sicherlich einige Tage verbringen.

Pro1234Pro 
Beitragsersteller
 19.12.2018, 15:49
@daCypher

Wie habe ich das bei CMP zu verstehen? Vergleichen und dann das Ergebnis (...) woher erhalte ich "das Ergebnis"?

daCypher  19.12.2018, 16:06
@Pro1234Pro

Laut der Seite, die ich verlinkt habe, hab ich das so verstanden:

Beispiel CMP $0, res, $1

Wenn res kleiner als Register 1 ist, wird in Register 0 eine -1 geschrieben
Wenn res und Register 1 gleich sind, wird in Register 0 eine 0 geschrieben
Wenn res größer als Register 1 ist, wird in Register 0 eine 1 geschrieben.

Der Wert in Register 0 wird halt jeweils im nächsten Schritt geprüft. Da prüft er in diesem Beispiel immer, ob Register 0 negativ ist, also ob res kleiner als Register 1 bzw. Register 2 ist.

Wenn ich mich nicht vertan hab, müsste am Ende in res also die 95 aus Register 2 stehen.

Pro1234Pro 
Beitragsersteller
 19.12.2018, 16:11
@daCypher

Jetzt ergibt es Sinn, Aufgabe ist gelöst. Besten Dank :)

Die Assemblersprache gibt es nicht. Deine "Sorte" Assembler kenne ich nicht.

Jede CPU hat ihren eigenen Befehlssatz. Assembler ist im Prinzip nur eine menschenlesbare Darstellung von dem, was der CPU zum Fraß vorgesetzt wird.

Dementsprechend kleinschrittig sind Assemblerschritte.

Letztenendes läuft jede andere Programmiersprache auf die Übersetzung nach Assembler hinaus.

Damit du Assembler verstehst, solltest du wissen, wie eine CPU eigentlich funktioniert und wie sie mit dem RAM hantiert. Ein Prozessor hat mehrere Register.

Und wenn du Assembler verstanden hast, dann hast du auch eine wage Vermutung, wie ein C-Programm in diesen "magischen Buchstabensalat" verwandelt wird, der in einer ausführbaren Datei steckt... und dass die Welten von C und ASM nicht soooo weit auseinander liegen :-).

Woher ich das weiß:Hobby

Ist doch bestimmt Schule oder? Dann wird es dazu garantiert Aufschriebe geben. Assembly gibt es zig Dialekte und Variationen.

Woher ich das weiß:Studium / Ausbildung – Informatikstudium

Pro1234Pro 
Beitragsersteller
 19.12.2018, 14:58

Studium und nein, wir haben in der Vorlesung bloß einige weniger Beispiele besprochen.

triopasi  19.12.2018, 15:00
@Pro1234Pro

Irgendwo wird stehen, welchen Dialekt ihr nutzt oder das ist genau definiert. So kann man da echt nichts sagen.

Pro1234Pro 
Beitragsersteller
 19.12.2018, 15:44
@triopasi

Könntest du anhand dessen die Aufgabe lösen? Irgendwie hilft mir die Seite nicht viel weiter.

triopasi  19.12.2018, 15:46
@Pro1234Pro

Scahu dir die Befehle an und gehe den Code Zeile für Zeile durch. Du solltest ja schon grob wissen, wie der Code ausgeführt wird. Da ist jetzt nichts dabei, was man von einem Studenten (?!) nicht erwarten kann.