Gibt es eine größere Bedeutung für diesen übersetzten Versammlungscode?

8

Für eine kurze Hausaufgabe in CS Architecture wurden wir dazu gebracht, die folgende IA-32 Assembly in C zu übersetzen. Ich habe es richtig übersetzt (soweit ich weiß), aber der Code tut es nicht Es scheint nichts besonders nützlich zu sein. Mein Professor gibt uns normalerweise solche Probleme, die am Ende etwas bewirken: unsere letzte Aufgabe war ein bisschen pop_count. Schauen Sie sich den folgenden C-Code an: Hat diese Funktion etwas Sinnvolles? Irgendein Algorithmus vielleicht?

Der Code erscheint unten (Ich habe Kommentare zu jeder ASM-Zeile hinzugefügt).

%Vor%

Der effektive Takeaway ist, dass wir z von y subtrahieren und dann jedes Bit mit dem niedrigstwertigen Bit füllen, um entweder Null oder MAX_UINT zu bilden. Dies wird mit dem Produkt von (y - z) * x XOR'd und zurückgegeben.

Meine Übersetzung in C:

%Vor%

Zur Klarstellung ist dies nicht Teil der HW-Zuordnung; Ich habe die Aufgabe abgeschlossen, indem ich den Code übersetzt habe, aber ich möchte wissen, warum er uns diesen Code zuerst gegeben hat.

    
SeniorShizzle 27.03.2015, 19:41
quelle

1 Antwort

3

Meine Vermutung ist, dass Ihr Professor versuchte zu veranschaulichen, wie Sie Bitverschiebungs- / Maskierungsoperationen verwenden können, um Verzweigungen zu vermeiden. Wenn du naiv übersetzen würdest

%Vor%

in Maschinencode, würden Sie einen Verzweigungsbefehl für das bedingte verwenden. Verzweigungen können Ihren Code drastisch verlangsamen, besonders wenn sie sich in einer engen Schleife befinden *. Der Assembler-Code und Ihr vorangehender C-Code haben die Wirkung, abhängig davon, ob y - z gerade ist, aber nur arithmetische Anweisungen zu verwenden.

* Wenn Sie mit dieser Tatsache noch nicht vertraut sind, diese SO-Antwort hat eine meiner Lieblingsillustrationen.

    
korrok 27.03.2015, 19:53
quelle