FB18 - Das Forum für Informatik

fb18.de / Bachelorstudieng / PM Technische Informatik

Aufgabe 2.2.2

Aufgabe 2.2.2 2006-02-17 09:31
Anonymer User
hi. kann mir einer bei aufgabe 2.2.2 die 2. und 3. zeile erklären?

2. zeile: subl %edx, 4(%eax). das ziel ist mir klar (0x104), aber wie kommt man auf den wert 0xAB. ich soll doch von den 0x104 noch %edx abziehen oder nicht?

3. zeile: imull $16,(%eax,%edx). wie ich auf die adresse ist mir klar (0x10c). aber warum nehme ich dann die 98700 mal 10 und nich mal 16? die 98700 ist doch auch im hexadezimalsystem. warum nimmt man dann die 16 ins dezimalsyst. ? wegen dem $ ?

danke schonmal. mfg


Re: Aufgabe 2.2.2 2006-02-17 11:56
Fred
2. zeile: subl %edx, 4(%eax). das ziel ist mir klar (0x104), aber wie kommt man auf den wert 0xAB. ich soll doch von den 0x104 noch %edx abziehen oder nicht?
0x104 ist eine Adresse. Du rechnest mit dem Wert, der ab 0x104 im Speicher steht.

warum nimmt man dann die 16 ins dezimalsyst. ? wegen dem $ ?
Das $-Zeichen steht einfach für einen immediate-Wert. Dieser imul Befehl ohne $ würde gar keinen Sinn machen.

Und in welchem System man die Zahlen im Quelltext darstellt ist doch egal, intern rechnet die CPU sowieso binär.

Re: Aufgabe 2.2.2 2006-02-17 12:57
Anonymer User
0x104 ist eine Adresse. Du rechnest mit dem Wert, der ab 0x104 im Speicher steht.

ja aber ich soll doch noch c von AB abziehen. warum ist das ergebnis dann auch AB?

Und in welchem System man die Zahlen im Quelltext darstellt ist doch egal

versteh ich nicht. wenn da eine 16 steht hätte ich doch 16x98700 .
das ergebnis ist aber 987000 weil 98700 mal 10 genommen wird, da 16 hex 10 dez ist.

Re: Aufgabe 2.2.2 2006-02-17 13:22
Fred
0x104 ist eine Adresse. Du rechnest mit dem Wert, der ab 0x104 im Speicher steht.
ja aber ich soll doch noch c von AB abziehen. warum ist das ergebnis dann auch AB?
Ach so, von AB. Eben meintest Du ja noch von der Adresse. Tja, das kann ich ohne den Aufgabenzettel jetzt leider nicht nachvollziehen. Kannst Du mir einen Link dazu geben?

Und in welchem System man die Zahlen im Quelltext darstellt ist doch egal
versteh ich nicht.
Ich meine damit, dass die folgenden Befehle identisch sind:

imul $16, …
imul $0x10, …

Sie kompilieren zu exakt denselben Binärcodes.

da 16 hex 10 dez ist.
Wie bitte?

Re: Aufgabe 2.2.2 2006-02-17 13:37
Anonymer User
hier der link zur aufgabe: http://tams-www.informatik.uni-hamburg.de/lehre/ws2005/vorlesungen/RS/aufgaben/aufgabenblatt_02.pdf

Re: Aufgabe 2.2.2 2006-02-17 13:56
Fred
0x104 ist eine Adresse. Du rechnest mit dem Wert, der ab 0x104 im Speicher steht.
ja aber ich soll doch noch c von AB abziehen.
Richtig, das Ergebnis ist also 0x9F.

warum ist das ergebnis dann auch AB?
Wer sagt denn das bzw. wo steht das? Musterlösung? Dann ist die falsch.

Re: Aufgabe 2.2.2 2006-02-17 14:06
Anonymer User
http://tams-www.informatik.uni-hamburg.de/lehre/ws2005/vorlesungen/RS/aufgaben/ML_a02.pdf

jo dann ist die "musterlösung" mal wieder falsch. dann hatte ich das doch verstanden. aber für die 3. zeile (das mit imull) könntest du vielleicht nochmal die rechnung erklären. danke :)

Re: Aufgabe 2.2.2 2006-02-17 14:06
TriPhoenix
Jo das ist ein Fehler in der Musterlösung, da bin ich schon bei Korrekturen drüber gestolpert.

Re: Aufgabe 2.2.2 2006-02-17 14:34
Fred
aber für die 3. zeile (das mit imull) könntest du vielleicht nochmal die rechnung erklären. danke :)
Klar, kein Problem.

Zunächst sollte man sich klarmachen, dass die auf dem Aufgabenzettel gewählte Repräsentation der Registerinhalte, Adressen und Werte (nämlich: hexadezimal) völlig willkürlich ist. Man hätte genau so gut oktal, binär, dezimal oder jedes andere Zahlensystem verwenden können. Das ändert nichts an der Semantik der Befehle. Klar? Gut.

Der erste Operand des imul-Befehls ist hier $16. Das $-Zeichen weist darauf hin, dass es sich um einen Immediate-Wert handelt. Da ansonsten keine weiteren Präfixe oder Postfixe verwendet werden, ist die angegebene Zahl dezimal zu verstehen, sprich: drei Hände und noch ein Daumen dazu [img]http://www.fb18.de/gfx/25.gif[/img]

Dies ist aber lediglich eine Erleichterung für den Programmierer! Beim kompilieren wird daraus die binäre 00010000. Genau so als hätte man $0x10 oder $020 geschrieben. Alles kompiliert zu exakt denselben Bitketten! Es macht (intern) keinen Unterschied für die Rechnung, in welchem Zahlensystem man die Zahlen darstellt, da der Computer sowieso alles binär rechnet.

Wenn man jetzt als Mensch diese Rechnung durchführen macht es dagegen einen Unterschied. Die auf dem Zettel angegebenen Werte sind alle hexadezimal angegeben. Also ist es sinnvoll, die dezimale 16 als hexadezimale 10 zu verstehen, weil man dann nur noch eine 0 anhängen muss. Und genau das hast Du ja auch gemacht. Noch Fragen?

Re: Aufgabe 2.2.2 2006-02-17 14:42
Anonymer User
super danke. nun ist alles klar!