Hallo.
Ich bin dabei mich auf Assembler vorzubereiten und habe folgenden
Aufgaben vor mir. Im Internet werde ich nicht wirklich fündig um diese
Aufgaben wenigstens Teilweise zu beantworten. Habt ihr Tips für mich wo
ich nachsehen kann oder vllt ein Buch was mir da helfen würde ?
gruß, Karl
Habe mal die Aufgaben hier:
Die unten genannten Register der AM 188 CPU (8 Bit externer Datenbus)
enthalten die Werte
ax:19h, bp:F3h, cx:37h, dx41h, di:20h, cs:9FF7h, ds:AFF9h. Programm und
Daten liegen im externen RAM. Per Default wird ds als
Datensegment-Register verwendet. Die nächste auszuführende Anweisung
lautet: mov cl, ds:(bp + di -3). Die Anweisung wird Übersetz in den
OP-Code 8A6BFD.
a) Auf welche physikalische(n) Adresse(n) greift der Controller mit der
genannten Anweisung zu?
b) Wie viele externe Lesezyklen werden durch das Laden des Befehls
ausgelöst?
c) Wie viele externe Lesezyklen werden durch die Befehlsausführung
ausgelöst?
----> Ist b und c nicht das gleiche Ergebnis ?
d) Wo und wann findet die Adressberechnung für den Speicherzugriff
statt?
e) Wie nennt man die Art der verwendeten Adressierung?
f) Der Befehl mov cl, es:[bp di -3] wird zu 268A6BFDh übersetzt.
Erläutern Sie den Unterschied der beiden gezeigten OP-Codes!
g) In beiden OP-Codes ist das letzte Byte jeweils FDh warum? Was
bedeutet das hier (Fachbegriff)?
Karl.M. schrieb:> Die unten genannten Register der AM 188 CPU (8 Bit externer Datenbus)> enthalten die Werte> ax:19h, bp:F3h, cx:37h, dx41h, di:20h, cs:9FF7h, ds:AFF9h. Programm und> Daten liegen im externen RAM. Per Default wird ds als> Datensegment-Register verwendet. Die nächste auszuführende Anweisung> lautet: mov cl, ds:(bp + di -3). Die Anweisung wird Übersetz in den> OP-Code 8A6BFD.> a) Auf welche physikalische(n) Adresse(n) greift der Controller mit der> genannten Anweisung zu?
Ach komm.
Das ist ein bischen Hex-Rechnen
> b) Wie viele externe Lesezyklen werden durch das Laden des Befehls> ausgelöst?
Findest du im Datenblatt. Wenn ein Befehl aus x Bytes besteht, wieviele
Lesezyklen braucht es dann um den Befehl zu lesen?
> c) Wie viele externe Lesezyklen werden durch die Befehlsausführung> ausgelöst?
Findest du ebenfalls im Dantblatt. Bei der Beschriebung des MOV
Befehles.
>> ----> Ist b und c nicht das gleiche Ergebnis ?
Nein.
Wenn du ein Buch lesen willst, brauchst du 1 Handbewegung um das Buch
zur Hand zu nehmen, du brauchst aber viele Handbewegungen wenn du dann
tstsächlich liest.
>> d) Wo und wann findet die Adressberechnung für den Speicherzugriff> statt?
Datenblatt
> e) Wie nennt man die Art der verwendeten Adressierung?> f) Der Befehl mov cl, es:[bp di -3] wird zu 268A6BFDh übersetzt.> Erläutern Sie den Unterschied der beiden gezeigten OP-Codes!> g) In beiden OP-Codes ist das letzte Byte jeweils FDh warum? Was> bedeutet das hier (Fachbegriff)?
Hör mal, das sind alles Fragen, wie sie in einem Kurs vorkommen. Hast du
nicht aufgepasst in deiner Klasse?
Ich beginne damit ab März und habe mir vom Server schon einmal die
Übungsaufgaben geladen. Wollte einfach schon vorarbeiten (:
Da werde ich mir erst einmal das Datenblatt besorgen.
Peter Bünger schrieb:> Nö, passt nicht.>> Sieh Dir doch erst einmal an, wie aus Segment und Offset die 20Bit> Speicheradresse gebildet wird.>> Peter
Adresse = (Segmentnummer·16) + Offset
AFF90000 (4 Bit verschoben, deswegen die 4 Nullen?)
F3 + 20 - 3 = 110
Ergibt zusammen AFF90110h ?
>Ich beginne damit ab März und habe mir vom Server schon einmal die>Übungsaufgaben geladen. Wollte einfach schon vorarbeiten (:
Vorarbeiten lassen, oder? Wie willst Du was lernen? Ohne selbst zu
denken? Oder: Du willst nix lernen.
Ich glaub jetzt hab ich`s:
AFF90
110
-----
B00A0
> b) Wie viele externe Lesezyklen werden durch das Laden des Befehls> ausgelöst?> Findest du im Datenblatt. Wenn ein Befehl aus x Bytes besteht, wieviele> Lesezyklen braucht es dann um den Befehl zu lesen?
--> Da es sich um ein 8 BIT Datenbus handelt, wird ein Befehl wohl 1
Byte haben. Also 4 Lesezyklen für mov cl, ds:(bp + di -3)
cl
ds
bp
di
Dazu finde ich gar nichts im Datenblatt.
> c) Wie viele externe Lesezyklen werden durch die Befehlsausführung> ausgelöst?> Findest du ebenfalls im Dantblatt. Bei der Beschriebung des MOV> Befehles.
--> Auf jedenfall einen Zyklus mehr da es aus dem Speicher geladen
werden muss.
> B00A0
Hatte ich auch errechnet.
> --> Da es sich um ein 8 BIT Datenbus handelt, wird ein Befehl wohl 1> Byte haben. Also 4 Lesezyklen für mov cl, ds:(bp + di -3)
Du bist aber echt schwer von Begriff! In der Aufgabe ist doch der Opcode
bereits genannt, Du musst doch nur noch die Bytes zählen.
> --> Auf jedenfall einen Zyklus mehr da es aus dem Speicher geladen> werden muss.
Überlege, wie breit das zu ladende CL-Register ist und wieviele 8Bit
Lesezyklen der Prozessor dafür braucht.
Peter
Karl Meyer schrieb:> --> Da es sich um ein 8 BIT Datenbus handelt, wird ein Befehl wohl 1> Byte haben. Also 4 Lesezyklen für mov cl, ds:(bp + di -3)>> cl> ds> bp> di>> Dazu finde ich gar nichts im Datenblatt.
Der Prozessor liest doch nicht den Text "mov cl, ds:(bp + di - 3)" um
ihn auszuführen!
Der Assembler liest den Text und übersetzt ihn zu
8A 6B FD
Das ist das, was sich der Prozessor holt. Für den Prozessor sind Befehle
einfach nur Zahlen. In einem Computer ist ausnahmslos alles einfach nur
eine Zahl. Je nachdem wie die Zahl verwendet wird, bedeutet sie etwas
anderes. Hier wird die Zahl vom Prozessor als Code für einen Befehl
aufgefasst. Warum? Weil der Prozessor laufend den Zyklus ausführt 'Hole
Befehl aus dem Speicher, dekodiere ihn, führe ihn aus'. Also holt er
sich die nächste Zahl(en) aus dem Speicher und fasst sie als Befehl auf.
Und in diesem Fall besteht ein kompletter Befehl eben aus mehreren
Zahlen. Der Prozessor holt sich die erste, stellt fest, dass da noch was
fehlt und holt die nächsten Bytes um den Befehl vollständig zu haben.
Also: Wieviele Bytes sind das, wieviele Bytes müssen daher aus dem
Speicher geholt werden, bis der Befehl komplett gelesen wurde und
wieviele Lesezyklen sind das daher?
>>> c) Wie viele externe Lesezyklen werden durch die Befehlsausführung>> ausgelöst?>>> Findest du ebenfalls im Dantblatt. Bei der Beschriebung des MOV>> Befehles.>> --> Auf jedenfall einen Zyklus mehr da es aus dem Speicher geladen> werden muss.
Was macht denn der MOV Befehl?
Wiviele Datentransfers aus dem Speicher in den Prozessor sind notwendig,
damit der MOV Befehl das tut, was der Befehl dem Prozessor vorschreibt.
Karl Heinz Buchegger schrieb:> Karl Meyer schrieb:> Der Prozessor liest doch nicht den Text "mov cl, ds:(bp + di - 3)" um> ihn auszuführen!> Der Assembler liest den Text und übersetzt ihn zu>> 8A 6B FD>> Also: Wieviele Bytes sind das, wieviele Bytes müssen daher aus dem> Speicher geholt werden, bis der Befehl komplett gelesen wurde und> wieviele Lesezyklen sind das daher?
--> 3 Bytes
>>> c) Wie viele externe Lesezyklen werden durch die Befehlsausführung>>> ausgelöst?>>>>> Findest du ebenfalls im Dantblatt. Bei der Beschriebung des MOV>>> Befehles.>>>> --> Auf jedenfall einen Zyklus mehr da es aus dem Speicher geladen>> werden muss.>> Was macht denn der MOV Befehl?> Wiviele Datentransfers aus dem Speicher in den Prozessor sind notwendig,> damit der MOV Befehl das tut, was der Befehl dem Prozessor vorschreibt.
--> Der mov Befehl kopiert den Inhalt des einen Registers in das andere.
(Auch wenn ich eher verschieben gedacht hätte wegen move :P)
Also ein Befehl um das (Quell-)Register zu finden und einen zum
lesen(weitergeben). (2 Lesezyklen mehr)
Karl.M. schrieb:> [...] AM 188 CPU
Der AM188 ist ein x86-Prozessor. Du kannst also alle Aufgaben mit Deinem
PC nachvollziehen. In diesem Fall ist das Programm DEBUG.EXE gut
geeignet. Allerdings ist dort die Schreibweise etwas anders.
> enthalten die Werte> ax:19h, bp:F3h, cx:37h, dx41h, di:20h, cs:9FF7h, ds:AFF9h. Programm und> Daten liegen im externen RAM. Per Default wird ds als> Datensegment-Register verwendet. Die nächste auszuführende Anweisung> lautet: mov cl, ds:(bp + di -3). Die Anweisung wird Übersetz in den> OP-Code 8A6BFD.> a) Auf welche physikalische(n) Adresse(n) greift der Controller mit der> genannten Anweisung zu?
Stichwort: Berechnung einer physikalischen 20-Bit-Adresse mithilfe des
Segmentregisters (DS):
1) (bp + di - 3) = (F3h + 20h - 3) = 110h (h="hexadezimal")
1) ds=AFF9h - Physikalisch: AFF90h (eine '0' hinten drangehängt)
3) Addieren: 110h + AFF90h = B00A0h
Die physikalische Adresse ist B00A0h, in x86-Schreibweise: B000:00A0
oder
B00A:0000 oder ...
> b) Wie viele externe Lesezyklen werden durch das Laden des Befehls> ausgelöst?
Opcode 8A6BFD bedeutet 3 Bytes. Da der Prozessor einen 8-Bit-Bus hat und
dementsprechend nur ein Byte auf einmal lesen kann, braucht er drei
Lesezyklen zum Laden des Befehls.
> c) Wie viele externe Lesezyklen werden durch die Befehlsausführung> ausgelöst?
Da nur ein Byte gelesen wird: ein Lesezyklus.
> ----> Ist b und c nicht das gleiche Ergebnis ?
Nein. "Laden des Befehls" bedeutet: Die Bytefolge für den Befehl aus dem
Speicher holen. "Ausführen des Befehls" heißt hier: Ein Byte aus dem
Speicher holen und in CL ablegen. "Lesezyklus" ist nicht gleichbedeutend
mit "Prozessortakt".
> d) Wo und wann findet die Adressberechnung für den Speicherzugriff> statt?
In der CPU und dort in der "Execution Unit" (siehe Blockdiagramm im
Datenblatt). Ob für die Adressberechnung die ALU in Anspruch genommen
wird, ist prozessorspezifisch, kurz: warte ab, was der Dozent sagt.
Genau dasselbe für den Zeitpunkt der Berechnung.
> e) Wie nennt man die Art der verwendeten Adressierung?
Based Indexed with Displacement (laut Datenblatt)
> f) Der Befehl mov cl, es:[bp di -3] wird zu 268A6BFDh übersetzt.> Erläutern Sie den Unterschied der beiden gezeigten OP-Codes!
Stichwort: Segment Override. Aus irgendeinem Grund ist der Dozent der
Meinung das mov cl, ds:(bp + di -3) vom Assembler ohne Segment Override
übersetzt wird. Auf die Schnelle behaupte ich, dass die physikalische
Adresse defaultmäßig mithilfe des SS-Registers gebildet wird, so dass
der Segment Override (ds:) vom Assembler berücksichtigt wird und der
Opcode eigentlich 3E8A4BFDh sein sollte.
> g) In beiden OP-Codes ist das letzte Byte jeweils FDh warum? Was> bedeutet das hier (Fachbegriff)?
Beide Befehle haben dasselbe Displacement (minus 3).
viele grüße
ralph
Karl Meyer schrieb:> --> Der mov Befehl kopiert den Inhalt des einen Registers in das andere.
Nicht in diesem Fall.
"ds:(bp + di - 3)" ist keine Angabe eines Registers, sondern
spezifiziert eine Adresse im Speicher (darum dreht sich doch die ganze
AUfgabe vom ersten Wort bis hier her! Um das Lesen aus dem Speicher. Und
dann sagst du ein Datentransfer von Register nach Register. Bischen
mitdenken, bitte!)
> Also ein Befehl um das (Quell-)Register zu finden und einen zum> lesen(weitergeben). (2 Lesezyklen mehr)
Erstens falsch. Denn wenn das ein Register nach Register Transfer wäre,
würde überhaupt kein externer Datentransfer notwendig sein. Der Befehl
würde komplett innerhalb des Prozessors ablaufen.
Zweitens: kein 'mehr'. Die Frage lautet nicht "Wieviele kommen noch
dazu", sondern "Wieviele externe Transfers laufen bei abarbeiten des
Befehls an". Etwas mehr Genauigkeit, sonst wirst du ganz schnell auf die
Schnauze fallen. Ganz besonders in der Assembler-Programmierung.
Drittens, gibt es beim MOV viele verschiedene Arten, welche Daten von wo
nach wohin transferiert werden. Register nach Register ist nur eine
davon. Memory nach Register oder Register nach Memory gibt es auch noch.
WObei es dann verschiedene Möglichkeiten gibt, wie man die Adresse im
Memory festlegt, von der gelesen/auf die geschrieben werden soll.
ALso: Was macht in diesem Fall der Befehl MOV?
Danke Ralph, dass du dem TO das Denken abnimmst.
Das sind Dinge, die muss er selbst begreifen. ER muss die Lösung zu
den Aufgaben finden! Gib ihm Hilfestellung, winke mit dem Zaunpfahl aber
bete ihm das nicht vor. Hier geht es darum, dass er die Systematik
lernen muss, die Denkweise, das Schema das da abläuft.
Karl Heinz Buchegger schrieb:> Danke Ralph, dass du dem TO das Denken abnimmst.
Ob er sich das Denken bzw. Lernen abnehmen lässt, ist seine Sache. Ich
versuche nur, ihm das Rätselraten zu erleichtern.
viele grüße
ralph
> ALso: Was macht in diesem Fall der Befehl MOV?
mov cl, ds:(bp + di -3)
Es wird der Inhalt der Physikalischen Adresse (die vorher berechnet
wird) nach cl kopiert. So stell ich mir das jedenfalls vor.
Danke an Ralph. Und natürlich will ich das verstehen, wenn es neue
Aufgaben gibt steh ich sonst wieder dumm da ;)
> g) In beiden OP-Codes ist das letzte Byte jeweils FDh warum? Was> bedeutet das hier (Fachbegriff)?> Beide Befehle haben dasselbe Displacement (minus 3).
Laut der Liste hier http://www.tealdragon.net/humor/defs/assemblr.htm
ist FD = Forget Data. Gibts da jetzt wieder Unterschiede und woher finde
ich das richtige ?.
Um noch einmal auf meinen ersten Post einzugehen: Gibt es ein
Empfehlenswertes Buch das alle diese Themen aufgreift und verständlich
erklärt ?
Karl Meyer schrieb:> Laut der Liste hier http://www.tealdragon.net/humor/defs/assemblr.htm> ist FD = Forget Data. Gibts da jetzt wieder Unterschiede und woher finde> ich das richtige ?.
Dir ist aber schon klar dass
* diese Seite Satire ist
* wir hier von einem Hex-Byte sprechen, das Teil eines Opcodes ist
* die Seite Satire ist
FD ist die 2-er Komplement SChreibweise für -3
Wie kommt das zu Stande? (Bitte zeigen! 2-er Komplement ist wichtig für
Assembler-Programmierer)
Vielleicht solltest du dir erst mal diese Seite ab der Stelle die ich
verlinkt habe, reinziehen
http://www.mikrocontroller.net/articles/AVR-Tutorial:_Arithmetik8#8-Bit_Arithmetik_ohne_Ber.C3.BCcksichtigung_eines_Vorzeichens
damit du nicht so auf verlorenem Posten stehst, wenn es um Bits und
Bytes geht.
Von Binärzahlen auf Hex-Schreibweise macht dir aber hoffentlich keine
Probleme?
> Gibt es ein Empfehlenswertes Buch das alle diese Themen aufgreift> und verständlich erklärt ?
empfehlenswert wäre vor allen Dingen, wenn du deine Vorlesung abwarten
würdest und deinem Dozenten zuhörst.
Im Grunde ist das nämlich alles nicht wirklich schwer (sonst könnte man
es nämlich nicht einer Maschine beibringen). Nur musst du systematisch
durch die einzelnen Problemkreise geführt werden. Und das geht nicht
wirklich gut durch ein Fragen und Antwort Spielchen in einem Forum.
Danke für den Link.
FD = 11111101
11111101
00000010 invertiert
1 1 addieren
--------
00000011 --> 0b00000011
Korrekt ?
Das mit der Seite für die Codes ist mir später auch aufgefallen, hatte
nicht die anderen gelesen sondern nur nach dem FD gesucht :D
Mal was anderes, gibt es so etwas wie einen Software Logic Analyzer ?
Würde mir das gern einmal anschauen. Denn aus dem am188 Datenblatt werde
ich nicht ganz schlau wann /wr /r /cs etc. zum Einsatz kommt (Am
Assembler Code erkenn ich das (noch) nicht. Da aber viele meinen das
Fach sei schwer wollt ich mich schon gut vorbereiten.
gruß