Assembler ... ein paar Fragen

Hallo zusammen, ich hoffe das ist der richtige Baum.

Ich lerne momentan für die Klausuren. Ein teil einer Klausur beinhaltet Assemblerprogrammierung, wo ich wirklich nicht gut bin. Ich habe mich noch mal richtig dran gesetzt, um wenigstens ein paar Punkte abzugreifen. Einige Fragen bleiben aber offen…

Diese entstanden beim lösen Klausurvorbereitender Aufgaben.

1: Wie kann ich denn die Bitzahl eines Wertes herauskriegen?
Es sollten in die Register a,b,c,d die Hexa - Werte 10,11,13,17 eingelesen werden. Das müssten ja vom Prinzip bei jeder 8 bit sein (z.B: 10 --> 0001 0000 -> 8Bit)

Aber ich soll das ja nicht einfach hinschreiben, sondern schon vom Programm herausfiltern lassen… wie stellt man das an?

2: Wie zähle ich wie oft ein Interrupt ausgelöst wurde, und wie kann ich ihn so „programmieren“ das er ein zweites mal ausgelöst wird?

3: Was genau bedeutet „Das Programm soll auf einen realen System lauffähig sein“?

Danke schonmal im Vorraus…

MFG Bio

Hallo

Ich lerne momentan für die Klausuren. Ein teil einer Klausur
beinhaltet Assemblerprogrammierung, wo ich wirklich nicht gut
bin. Ich habe mich noch mal richtig dran gesetzt, um
wenigstens ein paar Punkte abzugreifen. Einige Fragen bleiben
aber offen…

Welcher Assemblerdialekt, welche Opcodes möglich?
Intel/MASM oder GNU-ASM (AT&T syntax)?
Oder noch was anderes?

1: Wie kann ich denn die Bitzahl eines Wertes herauskriegen?
Es sollten in die Register a,b,c,d die Hexa - Werte
10,11,13,17 eingelesen werden. Das müssten ja vom Prinzip bei
jeder 8 bit sein (z.B: 10 --> 0001 0000 -> 8Bit)
Aber ich soll das ja nicht einfach hinschreiben, sondern schon
vom Programm herausfiltern lassen… wie stellt man das an?

Kommt auf die möglichen Opcodes an.

2: Wie zähle ich wie oft ein Interrupt ausgelöst wurde, und
wie kann ich ihn so „programmieren“ das er ein zweites mal
ausgelöst wird?

Kommt auf die möglichen Opcodes und auf die Architektur an.

3: Was genau bedeutet „Das Programm soll auf einen realen
System lauffähig sein“?

Du sollst mit einem Assembler-Programm aus Deinem
Programmtext ein Objektmodul „kompilieren“, dieses
soll in eine Exe eingebunden werden, diese soll dann
wirklich laufen und ggf. ein Ergebnis liefern.

Wenn es möglich ist, den „Inline-Assembler“ eines
großen Compilers (MS- Visual C++ oder GNU gcc) zu
nutzen, ist der letzte Teil simpel.

Grüße

CMБ

Danke schonmal für die schnelle Antwort :smile:

Also wir benutzten einen 8085 Simulator. Ich hoffe das ist die Information die du wolltest.

Hallo Bio,

1: Wie kann ich denn die Bitzahl eines Wertes herauskriegen?
Es sollten in die Register a,b,c,d die Hexa - Werte
10,11,13,17 eingelesen werden. Das müssten ja vom Prinzip bei
jeder 8 bit sein (z.B: 10 --> 0001 0000 -> 8Bit)

Aber ich soll das ja nicht einfach hinschreiben, sondern schon
vom Programm herausfiltern lassen… wie stellt man das an?

Ob deine Register überhaupt a,b,c,a genannt werden und wie Breit sie sind, legt der Hersteller der CPU fest. Zur CPU gibt es eine entsprechende technische Dokumentation des Herstellers. Die Vorhandenen Befehle, deren binäre Codierung und die genaue Wirkungsweise werden auch vom Hersteller festgelegt und dokumentiert.
Der Hersteller des Assemblers hält sich an diese Nomenklatur oder auch nicht. Auf alle Fälle dokumentiert er „seinen“ Assembler.

2: Wie zähle ich wie oft ein Interrupt ausgelöst wurde, und
wie kann ich ihn so „programmieren“ das er ein zweites mal
ausgelöst wird?

Dies ist teilweise die Aufgabe des Interrupt-Controllers. Des weiteren benötigt man noch weitere Hardware, z.B. einen Timerbaustein oder einen Schalter. Auch hier gibt es entsprechende Dokumentation der entsprechenden Hersteller. Meist benötigt man auch den Schaltplan, man muss ja wissen was wie verschaltet wurde.

3: Was genau bedeutet „Das Programm soll auf einen realen
System lauffähig sein“?

Scheinbar habt ihr mit einer virtuellen CPU gearbeitet, welche nirgends käuflich erhältlich ist und allenfalls als Simulation auf einem Computer läuft.
Ein reales System ist der Computer auf welchem ich gerade schreibe. Dabei muss ich auch noch die Vorgaben des Betriebssystems berücksichtigen.
Ich habe hier auch Platinen mit CPU, Speicher und Peripherie herumliegen, welche kein Betriebssystem haben. Da muss man das Programm erst in eine EPROM schreiben und dann den Baustein auf der Platine einsetzen, ist auch ein reales System.

MfG Peter(TOO)

1: Wie kann ich denn die Bitzahl eines Wertes herauskriegen?
Es sollten in die Register a,b,c,d die Hexa - Werte
10,11,13,17 eingelesen werden. Das müssten ja vom Prinzip bei
jeder 8 bit sein (z.B: 10 --> 0001 0000 -> 8Bit)

Seh ich nicht so. 10 -> 1010 -> 4 Bit. Oder 17 -> 1 0001 -> 5 Bit. Und die ermittelst du, indem du den Wert nach links shiftest und feststellst, wann es dabei erstmals zu einem Überlauf kommt. Wenn du die Registerbreite nicht kennst, kannst du zunächst ein Register mit 1 laden und wie oben shiften und kommst so auf die Breite als Referenzwert.

Gruß

Hallo

2: Wie zähle ich wie oft ein Interrupt ausgelöst wurde, und
wie kann ich ihn so „programmieren“ das er ein zweites mal
ausgelöst wird?

Diese Frage sagt mir, Du weißt nicht genau, was ein Interrupt ist.
Auslösung:
Hardware(z.B. Busleitung ansprechen) oder Software(Jump an Adresse mittels Interrupt-Befehl), auch beides möglich
Interrupts zählen:
Im Ram-Speicher aufaddieren, wie sonst?
„Interrupts programmieren“:
Manche oder die meisten lassen sich mit entsprechenden Befehlen an oder abschalten.
Hängt von der CPU ab.
MfG

1: Wie kann ich denn die Bitzahl eines Wertes herauskriegen?
Das müssten ja vom Prinzip bei
jeder 8 bit sein (z.B: 10 --> 0001 0000 -> 8Bit)

Seh ich nicht so. 10 -> 1010 -> 4 Bit. Oder 17 -> 1
0001 -> 5 Bit. Und die ermittelst du, indem du den Wert
nach links shiftest und feststellst, wann es dabei erstmals zu
einem Überlauf kommt. Wenn du die Registerbreite nicht kennst,
kannst du zunächst ein Register mit 1 laden und wie oben
shiften und kommst so auf die Breite als Referenzwert.

Der Erklärung kann ich zustimmen, dem Verfahren nicht:
Zum einen ist es einfacher, so lange nach rechts zu shiften (wobei von links nur Nullen nachkommen dürfen), bis der Wert des Registers 0 ist.
Zum anderen wäre es schon seltsam, wenn in der Definition der Anzahl der Bits einer (natürlichen) Zahl eine Registerbreite vorkäme, bei der Komplementdarstellung negativer Zahlen ist das allerdings anders…

1 Like