min/max in ASM
-
hallo leute,
gibt es eine einfache möglichkeit die min/max funktionen/macros - bekannt aus C und C++ - mit assembler nach zu bauen, am besten ohne jumps. also nur reines rechnen und bitverknüpungen. oder noch besser konditionale mov's oder xchg's (voher vergleich mit cmp).
vielen dank schonmal im voraus
-
schau dir doch das assembler ouput deines lieblingscompilers an...
beim gcc/g++ geht das, glaube ich, mit -S
am besten so stark wie möglich optimieren.
da kann man bei so einfachen dingen bestimmt viel erkennen und lernen.jenz
-
danke für den tip! bin jetzt mal so vorgegangen: ich habe den code (s.u.) einmal mit dem msvc (visual studio express) und einmal mit dem g++ kompiliert. das mit dem "g++ [...] -S" hat zwar auch geklappt aber ich kann mit der syntax leider nicht so viel anfangen, außerdem hat mich verwundert: der g++ code (switch -S) hat gerademal 250 zeile im vergleich dazu, wenn man die datei mit einem disassembler öffnet, stolze 100 000 zeilen
, woran liegt das? und leider kann ich mich in dem ganzen code auch kaum zurechtfinden... der dasm zeigt mir zwar die adresse, bei der der code beginnt, an, jedoch glaube ich nicht, dass die ersten der 100 000 zeilen auch mit den ersten 2 zeilen von main übereinstimmen (wobei ich zum teil meine werte wieder finden kann). naja ich werd mal schauen was ich noch aus dem asm code rauskriege, falls noch jemand tips oder anregungen hat könnt ihrs natürlich gern posten
#include <iostream> #define MIN(a, b) ((a < b) ? (a) : (b)) int main() { std::cout<<std::min(-1, 1)<<std::endl; std::cout<<MIN(100, -100)<<std::endl; system("pause"); return 0; }
:xmas2:
-
dann würde ich vorschlagen, dass du dich in die asm syntax einliest
mit -S bekommst du eben nur die cc datei nach asm übersetzt
wenn du den disassembler anwendest, dann übersetzt der dir ja das ganze programm mit allen eingelinkten bibliotheken um... das ist natürlich ne ganze menge mehr und man findet sich schlecht zu recht.ich glaube, mit -mintel-syntax kann man intelsyntax erzeugen, das hilft doch bestimmt auch weiter, oder?
jenz
-
... Wozu die Umstaende?
Wir haben neuerdings eine schoene x86 Befehlsreferenz in unseren FAQ. Da stehen uA. auch die cmov-Instruktionen drin.
Konstrukte wie dein C-Makro als Assembler-Macro nachzubauen ist zwar grundsaetzlich moeglich, aber, da so hoechst wahrscheinlich suboptimaler Code zustande kommt, idR. unsinnig.
-
höchst unsinnig?
na gut, wenn es wirklich nur um min/max geht.
aber ich würde mal ganz stark davon ausgehen, dass man ne menge optimierungszeug lernen kann, wenn man sich die compiler ausgaben anschaut...die mmx und co kann man aber wahrscheinlich doch wieder vergessen.
hier ist es vielleicht mit kanonen auf spatzen geschossen.
aber ich denke halt immer ein bisschen weiterjenz
-
jenz schrieb:
ich glaube, mit -mintel-syntax kann man intelsyntax erzeugen, das hilft doch bestimmt auch weiter, oder?
Danke euch beiden nochmals! das mit der intensyntax hat geklappt (wobei ich mich da gerade noch in den code reinarbeite)
Nobuo T schrieb:
... eine schoene x86 Befehlsreferenz in unseren FAQ. Da stehen uA. auch die cmov-Instruktionen drin.
genau sowas hatte ich gesucht!
... nur als ichs ausprobieren wollte, hat sich herausgestellt, dass mein alter tasm das nicht kenntnaja egal, der war eh nicht so der renner, ich werde dann wohl auf den masm umsatteln (brauche ich ja auch für jenz' variante, denn da erhalte ich ja auch 32bit-code)
-
was hast du denn eigentlich genau vor?
nur code anschauen und ah machen?
jenz
-
jenz schrieb:
was hast du denn eigentlich genau vor?
nur code anschauen und ah machen?
jenz
ne, das war ein teil von einem teil von ... einem assembler-programm. das std::min äquvivalent sollte in einer funktion (zur zahlenausgabe, was mit dem 16-bit asm ja nicht so ohne weiteres möglich ist) den parameter für die basis (hier ist die maximale basis 36) nötigenfalls anpassen. aber bei meinem tasm ist wohl nur sowas möglich (da kein cond. mov):
cmp bx, 36 jb b mov bx, 36 b: ... ; oder so cmp ax, bx jb b xchg ax, bx b: ...
außerdem wie kommst du drauf dass ich code anschaun will, da hast du mich doch erst drauf gebracht
-
ah, ja, das mit dem anschauen kommt von mir.
aber die frage, ob man min/max in asm nachbauen kann kam mir doch als ziemlich klar vor. natürlich! also dachte ich, dass es eher die frage ist, wie man das am besten machen kann...
nun denn, viel spaß,
jenz
-
jenz schrieb:
... also dachte ich, dass es eher die frage ist, wie man das am besten machen kann...
oh ja, natürlich. so wars auch gemeint, mit "am besten" hab ich in etwa sowas wie das cond. mov gemeint. da ich mich bisher fast auschschließlich mit hochsprachen beschäftigt habe erschien mir das überspringen einer einzigen codezeile (innerhalb einer funktion) als fragwürdig (auch wenn die ganzen if/else konstrukte in asm so dargestellt werden). ich hab eigentlich nur gedacht, dass man den min/max wert vielleicht auch sehr einfach mit arithmetischen operationen und bitschiebereien bestimmen kann.