• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

Wie Assemblersprache programmieren und ausführen?

Cyberratchet

Luxemburger Triumph
Registriert
31.10.07
Beiträge
496
Erstmal danke, das ihr euch in ein Thema mit so einem schwierigen(?) Thema getraut habt.

Für meine Schule müssen wir ein Referat zu einer beliebigen Programmiersprache halten und der ganze Spaß in 2-3er Gruppen. Meine 2 Kollegen haben aus Leichtsinn, anderes kann ich mir das nicht erklären, das Thema Assembler gewählt o_O.
Neben theroretischen Informationen sollen wir auch ein paar praktische Beispiele zeigen und da fängt das Problem an. Bis jetzt hatte ich nur Erfahrungen mit Java und etwas Phyton und jetzt soll ich etwas in Assembler programmieren, tolle Sache.
Irgendwie werde ich das schon hinbekommen, aber ehrlich gesagt habe ich keine Ahnung wie ich das eigentlich programmieren und ausführen soll.


Deswegen habe ich ein paar Fragen an Leute die sich mit dem Thema etwas besser auskennen als ich^^:

1) Unter welchem Betriebssystem soll ich das Programm programmieren?
Zur Auswahl habe ich neben Mac OSX 10.6 auch Windows7 Professional. Stimmt es das Assemblerprogramme welche in OSX geschrieben werden, nicht in Windows ausführbar sind?
Dann fällt OSX für mich schon flach, da in meiner Schule wohl an Windowsanteil >90% herscht^^.

2)Welchen Assembler empfehlt ihr für einen Einsteiger?
Welche gibt es für Windows und/oder OSX.

3)Ich habe auch gelesen, dass man einen Linker braucht. Für was benötige ich diesen?
Für Windows habe ich ALINK gefunden, wenn ich in OSX programmiere sollte, welchen gibt es für dieses Betriebssystem?

4)Den Code kann man anscheinend in jedem beliebigen Texteditor schreiben.
Kennt ihr aber Texteditoren, welche fürs programmieren mit Assembler angepasst sind, sprich mit farbiger Hervorhebung etc, um die Übersichtlichkeit dieser seeeehhr unübersichtlichen Programmiersprache zu erhöhen?
Hier wieder die Frage, welche für Windows, welche für OSX?

5)Ganz dumme Frage, aber wie führe ich solche Programme eigentlich aus?
Das wird wohl von Assembler zu Assembler unterschiedlich sein, denke ich einmal.
Aber wird das grundsetzlich in einer grafischen Oberfläche abgewickelt oder über die Eingabeaufforderung (so heißt doch das "DOS-Fenster"?^^) bzw das Terminal?


Ich hoffe das ihr mir in meiner schlimmen Lage helfen könnt^^.
Mfg Cyberratchet.
 

Berzerk

Golden Delicious
Registriert
07.07.08
Beiträge
8
Schön, da habt Ihr euch mal direkt das schwerste ausgesucht was es gibt :) Ich hatte vor über 20 Jahren mal einen Assemblerkurs und weiss praktisch nur noch, dass es schwer war. Ihr werdet mit diesem Projekt sicherlich niemanden beeindrucken können der nicht tief in der Materie drin ist, denn Ihr könnt froh sein, wenn Ihr ein simples "Hello World" auf den Bildschirm zaubern werdet.

Bei Assembler wird (jetzt verkürzt) quasi direkt mit dem Befehlssatz des jeweiligen Prozessors programmiert. Deshalb ist es auch sehr Prozessorabhängig und unterscheidet sich von Proz. zu Proz.

Aber bevor ich jetzt hier wiederhole, was auch in Wikipedia steht: Lies Dir doch erst mal den Artikel dort durch. Unten sind auch ne Menge weiterführender Links und sogar Einführungen.

Viel Spaß und lass uns wissen, was dabei rausgekommen ist :)

Bye,

Berzerk
 

Rais

Englischer Kantapfel
Registriert
23.12.03
Beiträge
1.094
Ähem....Wie alt ist euer Lehrer?

Nun, Assemblerprogrammierung hat mit den heutigen PCs nichts mehr zu tun, sondern findet sich im Mikroprozessorbereich (Gerätesteuerung) noch. Zu Zeiten eines Apple //e war es noch möglich, den 65C02 direkt zu programmieren, indem man die Prozessorbefehle kannte, und eine eigene übersichtliche Speicherverwaltung im Kopf hatte. Zu Zeiten der heutigen 64bit Prozessoren, hochkomplexen Betriebssystemen und grafischen Benutzeroberflächen ist eine Assemblerbeherrschung....sagen wir mal...ineffektiv. Ein heutiger PC-Prozessor gibt sich nicht mehr mit dem direktren Verändern von Speicherzuständen zufrieden, sondern ist eigentlich nur noch mehr am Abarbeiten von Betriebssystemroutinen.....

dennoch, ein nettes Thema - nur im EDV-Unterricht nicht mehr up-to-date...deswegen die Frage nach dem Alter des Lehrers. Denn vor 25 Jahren war Assemblerprogrammierung tatsächlich noch ein Thema.

Wie programmiert man? Nun, dazu muss man die ganzen Prozessorbefehle kennen..beim 6502 war das noch einfach, die Addresszeiger und Datenzeiger waren 2 Byte groß, die Befehle recht übersichtlich

mit den einfachen Operationen:

JMP #### lies man die Abarbeitung der Befehle auf eine phys. Speicherstelle springen
END beendete die Abarbeitung
JSR #### lies die Abarbeitung in eine Subroutine an Speicherstelle #### springen und dort lies der Befehl
RTS die programmabarbeitung wieder zurückkehren zum Punkte des JSR.

Rechenoperationen wie

INC liesen den Datenzähler um eins steigen
DEC um eins Abnehmen
LDx #### lies den Datenzähler aus einer Speicheraddresse holen und
WRT #### ihn dorthin schreiben

dann gabs noch viele operationen, die jetzt Datenzähler, Addresszähler Stapel etc bearbeiten (auch relativ, d.h. ohne Kenntnis der "echten" Speicheraddresse.
Rechenoperationen wie AND NOR NOT IS lassen einfache Bearbeitung der Daten zu und das Programm entscheiden (also verzweigen).

Wichtig (sogar lebensnotwendig) ist in Assemblerprogrammierung ein absolut korrekter programmablauf. Dazu gehören die Programmskizzen (Fließdiagramme).

Ein einfaches Programm, welches den Wert im Speicherplatz 0320 solange erhöht, bis er den Wert 7F enthält, kann aussehen:

0300 LDA 0320 Lies Register A aus Speicherstelle 0320
0303 INC A Addiere zum Wert in A 1
0304 STA 0320 Schreibe Register in Speicherstelle 0320
0307 CPA #7F Vergleiche Register A mit dem absoluten Wert 7F
0309 BNQ 0300 Falls Register A nicht gleich 7F springe zu Adresse 0300 (d.h. wiederhole das programm)
030C RTS Beende die Routine hier
..
0320 00 In Adresse 0320 steht momentan der Wert 00 (dieser wird ja bearbeitet)




da die Assemblersprache absolut an den prozessortyp gebunden ist und dessen Umgebung, würde sich die programmierweise mit jedem neuen Prozessortyp ändern, deswegen wurden die "Computersprachen" entwickelt, um ein Programm eher verständlicher zu entwickeln, und dann erst durch einen Compiler für den prozessor übersetzen; denn im Endeffekt kann der Rechner nur Zahlen bearbeiten.

Auch Assembler ist eine Programmiersprache (wenn auch sehr einfach) denn im Speicher würde das Programm (! ich weiss die Codes leider nicht mehr, nehmen wir an LDA= 80, INC A= F7, STA = 40, CPA= 47, BNQ= A2, RTS=2F so aussehen:

0300: 80 20 03
0303: F7
0304: 40 20 03
0307: 47 7F
0309: A2 00 03
030C: 2F

und direkt dann

0300: 80 20 03 F7 40 20 03 47 7F A2 00 03 2F

und wer kann das (ausser ein prozessor) noch lesen und verstehen?
 

Scotch

Bittenfelder Apfel
Registriert
02.12.08
Beiträge
8.044
Das ist nicht ganz ohne, was ihr euch da vorgenommen habt. Zuerst mal muesst ihr euch darueber klar werden, dass Assembler nichts mit "den ueblichen" Hochsprachen wie C/C++, Pascal, Fortran usw. zu tun hat und schon gar nichts mit Makro- oder Skriptsprachen.

Zusaetzlich ist Assembler nicht nur Systemspezifisch (MacOS, Windows, Linux...), sondern auch noch prozessorspezifisch (Assembler auf einem PPC "geht anders" als auf einem Intel, und ein Single Core "geht anders" als ein Multicore, Intel "geht anders" als AMD usw.). D.h. neben Grundkenntnissen in Assembler (der "Programmiersprache") braucht ihr auch ein paar Grundlagen ueber die Funktionsweise des Zielprozessors (die "Maschinensprache" - fuer eure Zwecke wird es reichen, sich in die Grundlagen der Registernutzung einzulesen; die Prozessordokumentation kann man sich beim Hersteller 'runterladen).

Ihr solltet euch da dringend erst mal einlesen - verschwendet keine Zeit mit der Suche nach Tools, die sind das kleinste Problem.

Ein paar weitere links, die euch weiterhelfen koennten:
http://nasmac.bloggeria.net/
http://personal.denison.edu/~bressoud/cs281-s07/Assembler.pdf

Und hier gibt's die volle Breitseite:
http://developer.apple.com/mac/libr.../Assembler/000-Introduction/introduction.html

Viel Erfolg!

Gruss,
Dirk
 

Rais

Englischer Kantapfel
Registriert
23.12.03
Beiträge
1.094
Hello World hätte so aussehen können:


0300: LDX#00 Schreibe eine 0 ins Register X

0302: INC X Erhöhe Register X um 1
0303: LDA 03F0,x Lade Register A aus der Speicherstelle 03F0+x
0306: STX 0400 Schreibe Register A in Speicheraddresse 0400+X
0309: CPX 0A Vergleiche Wert von Register X mit Wert aus Addresse 03F0
030B: BNQ 0302 Springe zu Addresse 0302 falls das Ergebnis aus vorangegangenen Befehls nicht TRUE ist
030E: RTS Beende Routine und spring in Hauptprogramm zurück

03F0: 0B "H" "E" "L" "L" "O" 20 "W" "O" "R" "L" "D" Data (die Daten bestehen aus dem ersten Wert, der die Länge des Strings angibt (0A) und den eigentlichen Daten


Dazu ist jedoch das Wissen notwendig, wie der Apple //e seinen Speicher, insbesondere Grafikspeicher verwaltet: Der Addressraum 0300 ist z.B. für kleine Programmcodes zugelassen. Der Addressraum 0400 (ohne Gewähr) ist für die Grafikdarstellung von ASCII Zeichen am Monitor bestimmt. Jeder Wert dort wird als ASCII zeichen an den Monitorpositionen dargestellt, beginnend von der ersten Zeile mit 40 Zeichen bei 0400.

Das Programm holt aus seinem Datenspeicher die dort hinterlegten Zeichen und schreibt sie direkt in den Grafikspeicher, was eine Ausgabe in der ersten Bildzeile veranlasst.

Es ist eine schöne Weise, zu verstehen wie ein Prozessor (nicht ein Computer) arbeitet, aber wie gesagt, nicht mehr wirklich praxisrelevant.

in BASIC hätte es so aussehen können:

PRINT "HELLO WORLD"
END.
 

Cyberratchet

Luxemburger Triumph
Registriert
31.10.07
Beiträge
496
Danke für die ganzen Rückmeldungen.
Wie gesagt, ich war von Anfang an gegen dieses Thema und unsere Lehrer meinte das wir jetzt dabei bleiben sollen. Wie alt unsere Lehrer ist weiß ich nicht genau, aber auf jeden Fall hat er das Assembler-Zeitalter aktiv miterlebt, vielleicht ist er etwas sentimental wenn er daran denk und wir müssen es deswegen machen :D .
Bei dem Anblick der Programme werde ich mich wohl auf ein Programm wie "Hello World" beschränken, damit soll man nur grob die Syntax erklären, unterschiede zu bekannten Hochsprachen soetwas. Ich denke für das wird dieses Programm reichen.

Weil ich hier immer von Prozessortyp höhre, wie strickt ist das den eingeteilt?
Damit meine ich das man zB ein Programm explizit für einen Intel C2D T9400 programmieren muss oder ob alle C2Ds den selben Befehlssatz haben?

Werde mich dann am Abend weiter ins Thema einlesen und das mit meinen Referatpartner besprechen.
Wegen dem OS muss ich mal schauen, es soll nur präsentiert werden, da könnt ichs auch mit OSX programmieren, ich werde mir erstmal die Anleitungen anschauen und vergleichen welches OS mir eine "einfache" programmierung erlaubt.

Mfg Cyberratchet.
 

Scotch

Bittenfelder Apfel
Registriert
02.12.08
Beiträge
8.044
Damit meine ich das man zB ein Programm explizit für einen Intel C2D T9400 programmieren muss oder ob alle C2Ds den selben Befehlssatz haben?

Innerhalb einer Baureihe haben die Prozessoren schon weitgehend den gleichen Befehlssatz, aber wie bereits gesagt: Man kann schon nicht mehr davon ausgehen, dass ein C2D und ein CD den gleichen Befehlssatz haben. Allerdings sind Prozessoren i.d.R. abwaertskompatibel, d.h. was auf einem CD laeuft, tut's i.d.R. auch auf einem C2D. Nur umgekehrt kann man davon nicht ausgehen.

Bei Hochsprachen ist das uninteressant, da die Compiler den Prozessortyp erkennen und automatisch den richtigen (und meistens sogar noch einen optimierten) Maschinencode erzeugen (Hochsprachencompiler sparen sich ueblicherweise den Umweg ueber Assembler). Wenn du direkt Assembler programmierst, musst du dich selbst um diese Dinge kuemmern.

BTW: In dem "erst mal Lesen" link von mir kannst du Hello World sehr schoen in der Intel und PPC version nebeneinaner sehen (bzw. untereinander): Auch ohne Assemblerkenntnisse ist leicht zu erkennen, dass das nicht der gleiche Code ist.

Gruss,
Dirk
 

sumpfmonsterjunior

Morgenduft
Registriert
17.03.05
Beiträge
167
Also grundsätzlich läuft ein x86 Assemblerprogramm auf jedem x86 kompatiblen Processor, egal ob Intel,AMD,Cyrix etc. Die ganzen CPU spezifischen Sachen für SIMD/Virtualisierung etc werdet Ihr für Euer Projekt eh nicht nutzen.

Meine aktive Assemblerzeit liegt lange zurück, aber mit 32bit asm unter Windows kann ich Euch sicher helfen.
Meine Empfehlung wäre, ein C/C++ Projekt unter VisualStudio zu starten für das ganze drumherum.
Es ist nämlich recht einfach, in einer C-Routine mittels Prärozessoranweisung in den Assembler zu schalten (unter VS war es glaube ich #asm). Dann braucht Ihr Euch nicht ums Linken etc kümmern und eine evtl GUI in der Hochsprache machen. Viel Erfolg!

SMJ
 

Scotch

Bittenfelder Apfel
Registriert
02.12.08
Beiträge
8.044
Also grundsätzlich läuft ein x86 Assemblerprogramm auf jedem x86 kompatiblen Processor, egal ob Intel,AMD,Cyrix etc. Die ganzen CPU spezifischen Sachen für SIMD/Virtualisierung etc werdet Ihr für Euer Projekt eh nicht nutzen.

Ich fasse das mal zusammen: Grundsätzlich läuft ein x86 Assemblerprogramm auf jedem x86 kompatiblem Prozessor, solange man die prozessorspezifischen Sachen nicht nutzt ;)

Dem ist nichts hinzuzufügen, aber ich hätte schwören können, dass wir das in diesem thread bereits erklärt hatten :)

Gruss,
Dirk
 

User 50673

Gast
Statt direkt für einen realen Prozessor zu programmieren, kann man auch Beispielrechnerprogramme benutzen. Hier kann man mit vorgegebenen Befehlen (die den üblichen Befehlen entsprechen) eine CPU simulieren und den Code dann auch debuggen, indem das virtuelle Speicherabbild in echtzeit dargestellt wird und auch ausführen. So einen hatten wir mals fürs Studium benutzt. Allerdings war dieser Simulator von unserem Prof selbst geschrieben und nur an uns herausgegeben worden.

Ich schätze jedoch, dass es im Netz freie Alternativen gibt. Das würde euer Vorhaben doch arg erleichtern.
 

Hairy

Sonnenwirtsapfel
Registriert
07.08.07
Beiträge
2.397
Also an der Uni haben wir mit MARS gearbeitet, das ist ein MIPS-Assembler-Simulator. Vorteil: ist ein Java-Programm, läuft folglich auf jeder Plattform. Außerdem zeigt es direkt an, was in den Registern steht etc.
Um die Funktionsweise von Assembler zu demonstrieren, sollte das ausreichen.
 

naich

Pomme d'or
Registriert
22.11.08
Beiträge
3.082
Genau, ich würde auch dringend empfehlen, einen Emulator / Simulator zu benutzen.

Ich habe mit Emu8086 gearbeitet, der einen alten 16-Bit Prozessor emuliert. Da kann man sich dann noch gut auf das wesentliche konzentrieren.

Den vorgeschlagenen MIPS-Simulator würde ich nicht empfehlen, da die Assemblerbefehle deutlich anders dort als bei einem "normalen" Intel-Prozessor, bei bei 8086 sind.
 

Cyberratchet

Luxemburger Triumph
Registriert
31.10.07
Beiträge
496
Die Simulation MARS hört sich wirklich sehr interessant an, wenn das dann noch unter Java läuft hätten wir das Plattform Problem auch gelöst :D. Die Methode mit VisualStudio, welches ich gratis von der Schule beziehen könnte, klingt auch interessant, aber ich denke, dass das zu viel für unsere Vorhaben ist.

Ich danke nocheinmal allen die hier gepostet haben, ich werde mich morgen einmal mit MARS auseinadersetzen.

Mfg Cyberratchet.