Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Eine Hash-Funktion, seltsamer Assembler-Code

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
18.02.2014, 11:26 Uhr
banshee



Hallo,

welche Gründe gibt es denn, so was zu machen:


C++:
inline long GetHashCode()
      {
        long retu;
        float tx=x,ty=y,tz=z;
        __asm
        {
          push eax;
          mov eax,tx;
          xor eax,ty;
          xor eax,tz;
          mov retu,eax;
          pop eax;
        }
        return retu;
      }


Würde
C++:
return x ^ y ^ z;
nicht genau das Gleiche erreichen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
18.02.2014, 18:29 Uhr
Hans
Library Walker
(Operator)


Hi,

ich hab zwar nur begrenzt Ahnung, aber ich würde mal gucken, was der Compiler aus der vorgeschlagenen Zeile, also:

C++:
return x ^ y ^ z;


macht. Dann mal sehen, ob da die selben Ergebnisse raus kommen, wie aus der Assemblerroutine und schliesslich mal mit einem Profiler überprüfen, was schneller ist.
Soweit mal meine 2 cent.

Hans

Nachtrag: Dann sind da noch die Übergabeparameter, die Du bei der Funktion nicht angegeben hast; das scheinen floatwerte zu sein. Aber soweit ich mich auskenne, können die Standardregister der CPU, also EAX, etc. nur mir ganzzahligen Typen umgehen. Und sofern in den Zuweisungen vor dem Assemblercode keine impliziten Typenumwandlungen enthalten sind, werden in dem Assemblerpart Integeroperationen auf Gleitkommatypen angewandt.
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 18.02.2014 um 18:41 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
19.02.2014, 10:12 Uhr
banshee



Ja genau, x-z sind floats. Wie kann ich mir den Assembler-Output denn anschauen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
19.02.2014, 23:58 Uhr
Hans
Library Walker
(Operator)


Hi,


Zitat von banshee:
Ja genau, x-z sind floats.

Dann hast Du in C/C++ einen Typenkonflikt vorliegen. Das hier z.B.:

C++:

int i=0;
float f=PI; // 3.1415927
  
i=i^f;


ergibt einen Type Mismatch Error, weil der XOR-Operator (^) nur für ganzzahlige Typen definiert ist.


Zitat:
Wie kann ich mir den Assembler-Output denn anschauen?

Beim gcc mit der Option -S (Gross S), also:

Code:
gcc -S filname

Die erzeugte Datei hat die Endung ".s".

-----

Bei Visual C++ (2008er Version) Projekt/Eigenschaften wählen; in dem erscheinenden Fenster in der Baumauswahl links Konfigurationseigenschaften/C-C++/Ausgabedateien anklicken, Dann im rechten Bereich Assemblyausgabe wählen. Da hast du dann 5 Möglichkeiten:

* keine Auflistung (Standardeinstellung bei mir)
* Nur die Assembly auflisten
* Assembly, Computercode und Quelle
* Assembly mit Computercode
* Assembly mit Quellcode

Bei "Nur die Assembly auflisten" kriegst du ein reines Assemblerlisting geliefert. Bei den nächsten 2 Varianten hast Du in dem Listing noch die Hexcodes der CPU-Befehle (Mnemonics) und Parameter oder Zeilennummern der jeweiligen C/C++ Codezeile als Kommentar dabei. Bei der letzten Variante kommt nach einer C/C++ Codezeile als Kommentar der zugehörige Assemblercode.
Die Dateien haben entweder die Endung "ASM" oder "COD" und finden sich im Debug-Ordner des Projekts.

-----

Beim Open Watcom schliesslich ist ein separates Programm dabei, dass Assemblerlistings aus Objektdateien erzeugt und eine Reihe von Parametern anbietet, mit denen man die Ausgabe dem Bedarf entsprechend steuern kann. Das Teil heisst wdis.

Dann wäre noch zu sagen, dass die Assemblerlistings beim gcc nach der AT&T Konvention ausgegeben werden, also etwa:
Code:
mov ax,-2[bp]

Bei Microsoft erhält man die Intelkonvention:
Code:
mov ax,[bp-2]

Und bei wdis vom Open Watcom gibt es einen Parameter womit man auswählen kann, wie man es haben will.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 20.02.2014 um 17:04 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
13.04.2014, 21:37 Uhr
Hans
Library Walker
(Operator)


Soso.
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: