2016-03-21 13 views
0

Ich habe in meinem Lehrbuch über das Kapitel zur Assemblersprache gearbeitet und bin zu einem Übungsproblem gekommen, das ich nicht verstehe (der Abschnitt über unäre und binäre Operationen ist ziemlich minimal, also bin ich ziemlich verloren).Unäre und binäre Operationen in Assembly

Hier sind zwei Anweisungen aus dem Praxis-Problem. Ich soll das Ziel und den Wert jeder Anweisung geben:

addq% RCX (% rax)

imulq $ 16, (% rax,% RDX, 8)

Wo Der Wert von% rax ist 0x100, der Wert von% rdx ist 0x3 und der Wert von% rcx ist 0x1.

Kann jemand im Detail erklären, wie man beide Anweisungen löst? Ich habe die Antwort auf der Rückseite des Buches, aber es gibt keine wirkliche Erklärung dafür. Vielen Dank.

+0

Fügen Sie keine nicht verwandten Tags hinzu! – Olaf

+0

Entschuldigung, meine Klasse konzentriert sich auf die Programmiersprache C (und damit auch auf das Lehrbuch), weshalb ich sie eingefügt habe. –

+0

Aber deine Frage ist nicht. – Olaf

Antwort

3

Sie müssen wissen, 1), wie effektiv Adressen 2) arbeiten, wie die Befehlssatz-Referenz verwenden, um herauszufinden, welche Anweisungen

tun

Kurz gesagt, ist disp(%base, %index, scale) eine Speicherreferenz %base + %index * scale + disp zu adressieren. Alle Teile außer einem sind optional. scale kann 1, 2, 4 oder 8 sein.

Nun, wenn Sie add im Handbuch nachschlagen, können Sie sie sehen nur die ersten Operanden an den zweiten fügen hinzu, so dass bei der Adresse 1 (Wert von %rcx) an die qword im Speicher fügt 0x100 (Wert von %rax).

Die zweite Anweisung ist ungültig, es gibt keine solche Form von imul. Vielleicht haben Sie vergessen, einen anderen Operanden zu kopieren?

Auch wenn es nicht existiert, können wir raten, was der Autor es gemeint haben wollte, nämlich den zweiten Operanden mit dem ersten zu multiplizieren. Als solches würde dies das Q-Wort im Speicher unter der Adresse 0x100 + 3 * 8 = 0x118 durch 16 multiplizieren.

+0

Was ich verwirrt bin, ist, dass für 1: Sie haben das Ziel als 0x100 und den Wert als 0x100. Ich dachte, dass addq & rcx, (% rax) zu (% rax) +% rcx => 0x100 + 0x1 => 0x101 werden würde. Für die Nummer 2: Sie haben das Ziel, 0x118 und der Wert 0x110 zu sein –

+0

Es ** nicht ** fügt die '1' zum' 0x100' hinzu. Es addiert die "1" zu dem Q-Wort in dem Speicher bei der Adresse "0x100". Nun, wenn sie Ihnen gesagt haben, dass der Speicherinhalt an dieser Adresse auch "0x100" ist, dann könnte das Ergebnis tatsächlich "0x101" sein. Für den zweiten Befehl ist es nicht sinnvoll, über Ziel und Wert zu sprechen, da dieser Befehl nicht existiert. Überprüfen Sie, ob Sie es korrekt kopiert haben. – Jester

+1

Ich habe überprüft, dass ich es richtig kopiert habe. Wie es in meinem ursprünglichen Post erscheint, ist wie es in dem Buch geschrieben ist. Es ist ähnlich dem Problem auf Seite 127 (107 Seite Nummer 127 Seite des Dokuments) der früheren Version meines Lehrbuchs [frühere Version Link] (http://citeseerx.ist.psu.edu/viewdoc/download?doi = 10.1.1.138.4401 & rep = rep1 & type = pdf) –

0

Dies ist aus der Praxis Problem 3.8 in CS: APP 3/e (globale Ausgabe)

Address Value 
0x100  0XFF 
0x118  0x11 

Register Value 
%rax  0x100 
%rcx  0x1 
%rdx  0x3 

addq% RCX (% rax)

Bei dieser Frage nehmen Sie das qword bei% rax (0XFF) und addiere% rcx, also 0XFF + 0x1 = 0x100. Beachten Sie die Klammern um (% rax), die auf den Inhalt im Speicher (0XFF) zeigen, nicht seine Adresse (0x100).

imulq $ 16, (% Rax,% RDX, 8)

Wie durch jester erwähnt, ist die rechte Seite (% Rax + (% RDX * 8)), die 0x118 ist. Der an dieser Adresse gespeicherte Wert ist 0x11. imulq multipliziert nun 0x11 * 0x10 (Note, 16 konvertiert zu Hex ist 0x10) und antwortet mit 0x110.