Caesar cipher oop
-
habs hinbekommen, danke fuer eure Antworten!
Super Forum

-
Also manchmal ist OOP-Fanatismus Nonsens, dies ist ein perfektes Beispiel dafür.
So gehts viel leichter, schlanker und schneller:
#include <stdio.h> #include <string.h> inline char rot13 (char c) { return (~c - 1 / (~((c = ~c) | 32) / 13 * 2 - 11) * 13); } int main (void) { char buffer[] = "hallo, caeser rocks!"; size_t length = strlen (buffer); // orginal printf ("orginal: %s\n", buffer); // encodieren for (size_t i = 0; i < length; buffer[i] = rot13 (buffer[i]), ++i); printf ("encoded: %s\n", buffer); // decodieren for (size_t i = 0; i < length; buffer[i] = rot13 (buffer[i]), ++i); printf ("decoded: %s\n", buffer); }
-
unsigned long schrieb:
Also manchmal ist OOP-Fanatismus Nonsens, dies ist ein perfektes Beispiel dafür.
So gehts viel leichter, schlanker und schneller:
#include <stdio.h> #include <string.h> inline char rot13 (char c) { return (~c - 1 / (~((c = ~c) | 32) / 13 * 2 - 11) * 13); } int main (void) { char buffer[] = "hallo, caeser rocks!"; size_t length = strlen (buffer); // orginal printf ("orginal: %s\n", buffer); // encodieren for (size_t i = 0; i < length; buffer[i] = rot13 (buffer[i]), ++i); printf ("encoded: %s\n", buffer); // decodieren for (size_t i = 0; i < length; buffer[i] = rot13 (buffer[i]), ++i); printf ("decoded: %s\n", buffer); }Sind dir die Newlines ausgegangen? Hier hast du zwei:
-
Großzügiger Spender schrieb:
unsigned long schrieb:
Also manchmal ist OOP-Fanatismus Nonsens, dies ist ein perfektes Beispiel dafür.
So gehts viel leichter, schlanker und schneller:
#include <stdio.h> #include <string.h> inline char rot13 (char c) { return (~c - 1 / (~((c = ~c) | 32) / 13 * 2 - 11) * 13); } int main (void) { char buffer[] = "hallo, caeser rocks!"; size_t length = strlen (buffer); // orginal printf ("orginal: %s\n", buffer); // encodieren for (size_t i = 0; i < length; buffer[i] = rot13 (buffer[i]), ++i); printf ("encoded: %s\n", buffer); // decodieren for (size_t i = 0; i < length; buffer[i] = rot13 (buffer[i]), ++i); printf ("decoded: %s\n", buffer); }Sind dir die Newlines ausgegangen? Hier hast du zwei:
Args Marc++us hat sie geklaut. Hier hast du ein Programm, dass dir bei jedem Aufruf zwei erzeugt, aber verrat es keinem!
#include <iostream> int main() { std::cout << "\n\n"; }
-
@Großzügiger Spender:
auto equals banane?
-
unsigned long schrieb:
Also manchmal ist OOP-Fanatismus Nonsens, dies ist ein perfektes Beispiel dafür.
So gehts viel leichter, schlanker und schneller:
#include <stdio.h> #include <string.h> inline char rot13 (char c) { return (~c - 1 / (~((c = ~c) | 32) / 13 * 2 - 11) * 13); } int main (void) { char buffer[] = "hallo, caeser rocks!"; size_t length = strlen (buffer); // orginal printf ("orginal: %s\n", buffer); // encodieren for (size_t i = 0; i < length; buffer[i] = rot13 (buffer[i]), ++i); printf ("encoded: %s\n", buffer); // decodieren for (size_t i = 0; i < length; buffer[i] = rot13 (buffer[i]), ++i); printf ("decoded: %s\n", buffer); }hey mann!111 dat is kein c++ es hat keine classen!!111 java is besser.
-
Nö F# ist besser

-
unsigned long schrieb:
Also manchmal ist OOP-Fanatismus Nonsens, dies ist ein perfektes Beispiel dafür....
Habe ich auch sofort gedacht ... schon die Überschrift ist ein Widerspruch in sich.
Was kommt als nächstes: "Freie-Funktionen-Klasse"?

Mal im Ernst: Je nachdem, was geübt werden soll:
a) Caesar-Chiffre => freie Funktion (wenn ich auch unsigned longs obfuscated code nicht als Beispiel nehmen würde)
b) OOP => Andere Aufgabe.Gruß,
Simon2.
-
unsigned long schrieb:
Also manchmal ist OOP-Fanatismus Nonsens, dies ist ein perfektes Beispiel dafür.
So gehts viel leichter, schlanker und schneller:
#include <stdio.h> #include <string.h> inline char rot13 (char c) { return (~c - 1 / (~((c = ~c) | 32) / 13 * 2 - 11) * 13); } int main (void) { char buffer[] = "hallo, caeser rocks!"; size_t length = strlen (buffer); // orginal printf ("orginal: %s\n", buffer); // encodieren for (size_t j = 0; i < length; buffer[j] = rot13 (buffer[j]), ++j); printf ("encoded: %s\n", buffer); // decodieren for (size_t j = 0; i < length; buffer[j] = rot13 (buffer[j]), ++j); printf ("decoded: %s\n", buffer); }Wow das Programm funktioniert richtig gut ...
Ironie off
Die codierung, sowie die decodierung geht überhaupt nicht! Es soll alles ins große geschrieben und wenn man Y um 3 Stellen nach rechts verschieben soll, muss B als Endergebnis rauskommen.
Das macht dein Programm nicht. Hast du es etwa nicht getestet ?...
-
*hust*
da oben steht "rot13" nicht "rot3". Der Code sollte nur ein Denkanstoß dafür sein, dass es auch ohne OOP sogar besser (schneller, schlanker - einfach besser) geht.
Noch was in eigener Sache:
Dazu solltest du es unterlassen verfälschten Code zu posten. Stichwort Zeile 16 und 20 in deinem Post und meinem Post. Mein Code geht, dein geposteter nicht, da du absichtlich "i" und "j" in beiden Zeilen verschoben hast. Daher ist es unterste Schublade hier mit "Ironie" anzutanzen.
Also kusch, kusch, ab in die Ecke und schämen.
-
@unsigned long,
Du hast durchaus zum Teil recht, wenn du das ganze aber doch bitte noch in C++ machen würdest, dann sähe es noch ein wenig besser aus:#include <string> #include <iostream> #include <algorithm> char rot13(char c) { return (~c - 1 / (~((c = ~c) | 32) / 13 * 2 - 11) * 13); } int main() { std::string buffer = "hallo, caeser rocks!"; // originial std::cout << "Original: " << buffer << std::endl; // encoding std::transform(buffer.begin(), buffer.end(), buffer.begin(), &rot13); std::cout << "Encoded: " << buffer << std::endl; // decoding std::transform(buffer.begin(), buffer.end(), buffer.begin(), &rot13); std::cout << "Decoded: " << buffer << std::endl; return 0; }Wieso sage ich "zum Teil"? Wenn du mal den Code von pampy genauer angeschaut hättest, dann hättest du eine Offset Variable entdeckt. Daher muss hier ein Objekt eingeführt werden.
Allerdings hätte ich es persönlich über einen Funktor gemacht, also sowas:
// Code von oben, statt der rot13 Funktion, eher sowas: struct Encoding { int m_offset; Encoding(int offset) : m_offset(offset) { } char operator ()(char c) { // ... Kodierung hier hin ... // } } // In der main dann: std::transform(buffer.begin(), buffer.end(), buffer.begin(), Encoding(13)); // ...Aber ich würde sowas schon eher als fortgeschrittene Programmierung ansehen. Einem Anfänger traue ich jedenfalls so ein Vorgehen nicht einfach so zu. Schon nur wegen der Operatorüberladung.
Grüssli
-
Dravere schrieb:
...Daher muss hier ein Objekt eingeführt werden....
Naja ... aber nur, wenn man das (schicke und sprechende) transform() nutzen will.
Mit einer simplen handkodierten Schleife hätte es eine einfache Funktion auch getan.Gruß,
Simon2.
-
Das mit der Offset-Variable stimmt, das habe ich überlesen.
Was mir jedoch Kopfzerbrechen bereitet ist hierfür die STL zu benutzen. Keine Frage, STL ist ein feines Teil, aber gerade für sowas denke ich, ist es eher als ob man eine Neutronenbombe auf eine Ameise wirft. Ich denke nicht, das hier die Anwendung der STL irgendeinen Vorteil birgt, eher Abzüge in Performance, Overhead usw. mit sich führt.
Aber da streitet natürlich die Welt drum und einen "C/C++-Mix"- vs. "pure C++"-Flamewar möchte ich sicherlich nicht anzetteln.
Ich hab nur gezeigt wie ich eine einfache Rot13 implementieren würde, ohne viel Schnick Schnack. Natürlich kann man hier auch richtig tiefe Vererbung ansetzen (Klassen für a-/symmetrische Verschlüsselung, Einwegverschlüsselung, usw.), mit Namespaces und co. Aber der Aufwand/Nutzen-Faktor würde meines Erachtens hier nicht sehr berauschend sein.
-
@unsigned long
Was heisst verfälschten Code?
Zeig mir doch mal bitte wie mein ein Array benutzt wie z.B. "test []" und in dem Index eine Variable angibt, die "i" heisst und gleichzeitig so eine Schrift benutzt "Test"
Deswegen habe ich "i" durch "j" benutzt, damit ich das benutzen kann...
Und außerdem verändert das wohl nicht das Geringste...
-
for (size_t j = 0; i < length; buffer[j] = rot13 (buffer[j]), ++j);Wenn du so einen crap baust, brauchste nicht zu heulen, das nichts läuft.
Der Code von mir funktioniert und das einwandfrei. Aber bitte. Laber du mal ruhig, wir haben hier gerade eine ganz andere Thematik.
-
@Simon2,
Ich habe noch überlegt, ob ich das "muss" abschwächen sollte. Aber dachte: "Ach dagegen wird sicher niemand einen Einwand haben."
War wohl falsch gedacht
Aber recht hast du natürlich schon
unsigned long schrieb:
Was mir jedoch Kopfzerbrechen bereitet ist hierfür die STL zu benutzen. Keine Frage, STL ist ein feines Teil, aber gerade für sowas denke ich, ist es eher als ob man eine Neutronenbombe auf eine Ameise wirft. Ich denke nicht, das hier die Anwendung der STL irgendeinen Vorteil birgt, eher Abzüge in Performance, Overhead usw. mit sich führt.
Die STL-Algorithmen werden meistens völlig wegoptimiert. Daher ist dein Bedenken hier grundlos. Ein
std::transformist intern auch nichts anderes als eine Schleife. Was man schlussendlich wirklich gewinnt ist Übersicht. Einstd::transformlässt sich deutlich besser lesen als einefor-Schleife.Was womöglich gewisse Performanceeinbussen bringen könnte, ist die Verwendung des
std::stringals Puffer. Hier werden sehr wahrscheinlich beim Iterieren zusätzliche Bereichsprüfungen durchgeführt. Aber man kann denstd::stringnatürlich ohne Probleme auch wieder durch deinencharPuffer ersetzen. Die Verwendung vonstd::transformkann immer noch genutzt werden. Ich könnte mir vorstellen, dass man dann sogar einen Performancegewinn erzielen könnte, da man gleich mit Zeigerarithmetik arbeitet. Allerdings ist das nur eine Spekulation von meiner Seite
Ich habe einenstd::stringgenutzt, weil ich den Hintergedanken hatte, dass man mit dem String womöglich mehr machen möchte, als nur kodieren und dekodieren. Wahrscheinlich möchte man zuerst etwas vom Benutzer einlesen lassen oder ähnliches und da erleichtert einem die Verwendung desstd::stringeiniges.Gespräche über die Performance sollte man eigentlich sowieso besser zusammen mit einem Profiler machen. Sonst kann man eigentlich immer nur spekulieren. Allerdings wurde schon mehrmals bewiesen, dass STL Algorithmen nicht langsamer sind als normale eigene Schleifen, bzw. kein Nachteil durch diese entsteht.
Zudem ist Performance ja schön und gut, aber die Übersicht sollte man bei einem Programm auch im Hinterkopf behalten. Optimieren kann man im nachhinein immer noch. Auch sollte man die Programmiersprache, welche man gewählt halt, auch benutzen. Wenn etwas besser in C geschrieben werden sollte, dann kann man natürlich die Programmiersprache wechseln. Aber ein zwanghaftes mischen von C und C++, vor allem an Stellen, wo man gar nicht so recht weiss, ob man etwas durch die Verwendung von C gewinnt, halte ich für ein schlechtes Vorgehen. Sowas führt zu unübersichtlichem und dadurch unwartbarem Code.Grüssli
-
Dravere schrieb:
@Simon2,
Ich habe noch überlegt, ob ich das "muss" abschwächen sollte. Aber dachte: "Ach dagegen wird sicher niemand einen Einwand haben."
War wohl falsch gedacht
Aber recht hast du natürlich schon
...Tja ... wie sagte meine Deutschlehrerin immer: "Pauschalisierungen sind immer falsch!"

Und schön finde ich das schon mit dem transform() ...Gruß,
Simon2.
-
Hi,
also ich war einfach mal so frei, die beiden Sources durch den aktuellen VC++2008 SP1 Compiler zu jagen (Standard Release, normale Optimierungen auf Speed, Multi-Threaded DLL) und mal den Assembler-Output anzuzeigen. Ich denke mal, dass dieser Bände ´für sich spricht, wenn man als Faustregel folgende nimmt: "Jede Anweisung kostet Zeit."
Variante 1:
#include <stdio.h> #include <string.h> inline char rot13 (char c) { return (~c - 1 / (~((c = ~c) | 32) / 13 * 2 - 11) * 13); } int main (void) { char buffer[] = "hallo, caeser rocks!"; size_t length = strlen (buffer); // orginal printf ("orginal: %s\n", buffer); // encodieren for (size_t i = 0; i < length; buffer[i] = rot13 (buffer[i]), ++i); printf ("encoded: %s\n", buffer); // decodieren for (size_t i = 0; i < length; buffer[i] = rot13 (buffer[i]), ++i); printf ("decoded: %s\n", buffer); }Assembler-Output:
; Listing generated by Microsoft (R) Optimizing Compiler Version 15.00.21022.08 TITLE x:\main.cpp .686P .XMM include listing.inc .model flat INCLUDELIB OLDNAMES PUBLIC ?rot13@@YADD@Z ; rot13 PUBLIC ??_C@_0BF@MBEGFLIL@hallo?0?5caeser?5rocks?$CB?$AA@ ; `string' PUBLIC ??_C@_0N@NOAGLDLO@orginal?3?5?$CFs?6?$AA@ ; `string' PUBLIC ??_C@_0N@HCAHLMCD@encoded?3?5?$CFs?6?$AA@ ; `string' PUBLIC ??_C@_0N@NOADMBKI@decoded?3?5?$CFs?6?$AA@ ; `string' EXTRN @__security_check_cookie@4:PROC EXTRN __imp__printf:PROC ; COMDAT ??_C@_0N@NOADMBKI@decoded?3?5?$CFs?6?$AA@ CONST SEGMENT ??_C@_0N@NOADMBKI@decoded?3?5?$CFs?6?$AA@ DB 'decoded: %s', 0aH, 00H ; `string' CONST ENDS ; COMDAT ??_C@_0N@HCAHLMCD@encoded?3?5?$CFs?6?$AA@ CONST SEGMENT ??_C@_0N@HCAHLMCD@encoded?3?5?$CFs?6?$AA@ DB 'encoded: %s', 0aH, 00H ; `string' CONST ENDS ; COMDAT ??_C@_0N@NOAGLDLO@orginal?3?5?$CFs?6?$AA@ CONST SEGMENT ??_C@_0N@NOAGLDLO@orginal?3?5?$CFs?6?$AA@ DB 'orginal: %s', 0aH, 00H ; `string' CONST ENDS ; COMDAT ??_C@_0BF@MBEGFLIL@hallo?0?5caeser?5rocks?$CB?$AA@ CONST SEGMENT ??_C@_0BF@MBEGFLIL@hallo?0?5caeser?5rocks?$CB?$AA@ DB 'hallo, caeser rock' DB 's!', 00H ; `string' ; Function compile flags: /Ogtpy ; File x:\main.cpp CONST ENDS ; COMDAT ?rot13@@YADD@Z _TEXT SEGMENT ?rot13@@YADD@Z PROC ; rot13, COMDAT ; _c$ = eax ; 5 : { return (~c - 1 / (~((c = ~c) | 32) / 13 * 2 - 11) * 13); } not al push esi movsx esi, al mov ecx, esi or ecx, 32 ; 00000020H not ecx mov eax, 1321528399 ; 4ec4ec4fH imul ecx sar edx, 2 mov eax, edx shr eax, 31 ; 0000001fH add eax, edx lea ecx, DWORD PTR [eax+eax-11] mov eax, 1 cdq idiv ecx mov edx, eax imul edx, 13 ; 0000000dH mov eax, esi not eax sub eax, edx pop esi ret 0 ?rot13@@YADD@Z ENDP ; rot13 _TEXT ENDS PUBLIC __$ArrayPad$ PUBLIC _main EXTRN ___security_cookie:DWORD ; Function compile flags: /Ogtpy ; COMDAT _main _TEXT SEGMENT _buffer$ = -28 ; size = 21 __$ArrayPad$ = -4 ; size = 4 _main PROC ; COMDAT ; 8 : { sub esp, 28 ; 0000001cH mov eax, DWORD PTR ___security_cookie xor eax, esp mov DWORD PTR __$ArrayPad$[esp+28], eax ; 9 : char buffer[] = "hallo, caeser rocks!"; mov ecx, DWORD PTR ??_C@_0BF@MBEGFLIL@hallo?0?5caeser?5rocks?$CB?$AA@+4 mov eax, DWORD PTR ??_C@_0BF@MBEGFLIL@hallo?0?5caeser?5rocks?$CB?$AA@ mov edx, DWORD PTR ??_C@_0BF@MBEGFLIL@hallo?0?5caeser?5rocks?$CB?$AA@+8 push ebx push ebp push esi mov DWORD PTR _buffer$[esp+44], ecx mov ecx, DWORD PTR ??_C@_0BF@MBEGFLIL@hallo?0?5caeser?5rocks?$CB?$AA@+16 push edi mov DWORD PTR _buffer$[esp+44], eax mov eax, DWORD PTR ??_C@_0BF@MBEGFLIL@hallo?0?5caeser?5rocks?$CB?$AA@+12 mov DWORD PTR _buffer$[esp+52], edx mov dl, BYTE PTR ??_C@_0BF@MBEGFLIL@hallo?0?5caeser?5rocks?$CB?$AA@+20 ; 10 : size_t length = strlen (buffer); lea edi, DWORD PTR _buffer$[esp+44] mov DWORD PTR _buffer$[esp+60], ecx mov DWORD PTR _buffer$[esp+56], eax mov BYTE PTR _buffer$[esp+64], dl lea ecx, DWORD PTR [edi+1] $LL17@main: mov al, BYTE PTR [edi] inc edi test al, al jne SHORT $LL17@main ; 11 : ; 12 : // orginal ; 13 : printf ("orginal: %s\n", buffer); mov ebp, DWORD PTR __imp__printf lea eax, DWORD PTR _buffer$[esp+44] push eax push OFFSET ??_C@_0N@NOAGLDLO@orginal?3?5?$CFs?6?$AA@ sub edi, ecx call ebp add esp, 8 ; 14 : ; 15 : // encodieren ; 16 : for (size_t i = 0; i < length; buffer[i] = rot13 (buffer[i]), ++i); xor esi, esi test edi, edi jbe SHORT $LN4@main $LL18@main: mov cl, BYTE PTR _buffer$[esp+esi+44] not cl movsx edx, cl or edx, 32 ; 00000020H not edx mov eax, 1321528399 ; 4ec4ec4fH imul edx sar edx, 2 mov eax, edx shr eax, 31 ; 0000001fH add eax, edx lea ebx, DWORD PTR [eax+eax-11] mov eax, 1 cdq idiv ebx mov dl, 13 ; 0000000dH not cl inc esi imul dl sub cl, al mov BYTE PTR _buffer$[esp+esi+43], cl cmp esi, edi jb SHORT $LL18@main $LN4@main: ; 17 : printf ("encoded: %s\n", buffer); lea eax, DWORD PTR _buffer$[esp+44] push eax push OFFSET ??_C@_0N@HCAHLMCD@encoded?3?5?$CFs?6?$AA@ call ebp add esp, 8 ; 18 : ; 19 : // decodieren ; 20 : for (size_t i = 0; i < length; buffer[i] = rot13 (buffer[i]), ++i); xor esi, esi test edi, edi jbe SHORT $LN1@main npad 8 $LL19@main: mov cl, BYTE PTR _buffer$[esp+esi+44] not cl movsx edx, cl or edx, 32 ; 00000020H not edx mov eax, 1321528399 ; 4ec4ec4fH imul edx sar edx, 2 mov eax, edx shr eax, 31 ; 0000001fH add eax, edx lea ebx, DWORD PTR [eax+eax-11] mov eax, 1 cdq idiv ebx mov dl, 13 ; 0000000dH not cl inc esi imul dl sub cl, al mov BYTE PTR _buffer$[esp+esi+43], cl cmp esi, edi jb SHORT $LL19@main $LN1@main: ; 21 : printf ("decoded: %s\n", buffer); lea eax, DWORD PTR _buffer$[esp+44] push eax push OFFSET ??_C@_0N@NOADMBKI@decoded?3?5?$CFs?6?$AA@ call ebp ; 22 : } mov ecx, DWORD PTR __$ArrayPad$[esp+52] add esp, 8 pop edi pop esi pop ebp pop ebx xor ecx, esp xor eax, eax call @__security_check_cookie@4 add esp, 28 ; 0000001cH ret 0 _main ENDP _TEXT ENDS ENDVariante 2:
#include <string> #include <iostream> #include <algorithm> char rot13(char c) { return (~c - 1 / (~((c = ~c) | 32) / 13 * 2 - 11) * 13); } int main() { std::string buffer = "hallo, caeser rocks!"; // originial std::cout << "Original: " << buffer << std::endl; // encoding std::transform(buffer.begin(), buffer.end(), buffer.begin(), &rot13); std::cout << "Encoded: " << buffer << std::endl; // decoding std::transform(buffer.begin(), buffer.end(), buffer.begin(), &rot13); std::cout << "Decoded: " << buffer << std::endl; return 0; }Assembler-Output:
; Listing generated by Microsoft (R) Optimizing Compiler Version 15.00.21022.08 TITLE x:\main.cpp .686P .XMM include listing.inc .model flat INCLUDELIB OLDNAMES PUBLIC ??_C@_0P@GHFPNOJB@bad?5allocation?$AA@ ; `string' PUBLIC ??0_Sentry_base@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE@AAV12@@Z ; std::basic_ostream<char,std::char_traits<char> >::_Sentry_base::_Sentry_base PUBLIC ??0sentry@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE@AAV12@@Z ; std::basic_ostream<char,std::char_traits<char> >::sentry::sentry PUBLIC ??1_Sentry_base@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE@XZ ; std::basic_ostream<char,std::char_traits<char> >::_Sentry_base::~_Sentry_base PUBLIC ??1sentry@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE@XZ ; std::basic_ostream<char,std::char_traits<char> >::sentry::~sentry PUBLIC ??Bsentry@?$basic_ostream@DU?$char_traits@D@std@@@std@@QBE_NXZ ; std::basic_ostream<char,std::char_traits<char> >::sentry::operator bool PUBLIC ??$?6U?$char_traits@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@PBD@Z ; std::operator<<<std::char_traits<char> > PUBLIC ??$_Iter_random@V?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V12@@std@@YA?AUrandom_access_iterator_tag@0@ABV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@0@0@Z ; std::_Iter_random<std::_String_iterator<char,std::char_traits<char>,std::allocator<char> >,std::_String_iterator<char,std::char_traits<char>,std::allocator<char> > > PUBLIC ?_Has_container@_Iterator_base_secure@std@@QBE_NXZ ; std::_Iterator_base_secure::_Has_container PUBLIC ??Y?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV01@H@Z ; std::_String_const_iterator<char,std::char_traits<char>,std::allocator<char> >::operator+= PUBLIC ??Y?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV01@H@Z ; std::_String_iterator<char,std::char_traits<char>,std::allocator<char> >::operator+= PUBLIC ??H?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBE?AV01@H@Z ; std::_String_iterator<char,std::char_traits<char>,std::allocator<char> >::operator+ PUBLIC ?_Checked_iterator_base@?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEPADXZ ; std::_String_iterator<char,std::char_traits<char>,std::allocator<char> >::_Checked_iterator_base PUBLIC ??$_Checked_base@V?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@U_Different_checked_iterator_base_type_tag@2@@std@@YAPADAAV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@0@U_Different_checked_iterator_base_type_tag@0@@Z ; std::_Checked_base<std::_String_iterator<char,std::char_traits<char>,std::allocator<char> >,std::_Different_checked_iterator_base_type_tag> PUBLIC ??$_Checked_base@V?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@std@@YAPADAAV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@0@@Z ; std::_Checked_base<std::_String_iterator<char,std::char_traits<char>,std::allocator<char> > > PUBLIC ??$_Transform@PADPADP6ADD@ZUforward_iterator_tag@std@@@std@@YAPADPAD00P6ADD@ZUforward_iterator_tag@0@U_Range_checked_iterator_tag@0@@Z ; std::_Transform<char *,char *,char (__cdecl*)(char),std::forward_iterator_tag> PUBLIC ??$_Transform@PADV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@P6ADD@Z@std@@YA?AV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@0@PAD0V10@P6ADD@ZUrandom_access_iterator_tag@0@U_Range_checked_iterator_tag@0@@Z ; std::_Transform<char *,std::_String_iterator<char,std::char_traits<char>,std::allocator<char> >,char (__cdecl*)(char)> PUBLIC ??$transform@V?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V12@P6ADD@Z@std@@YA?AV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@0@V10@00P6ADD@Z@Z ; std::transform<std::_String_iterator<char,std::char_traits<char>,std::allocator<char> >,std::_String_iterator<char,std::char_traits<char>,std::allocator<char> >,char (__cdecl*)(char)> PUBLIC ??_C@_0BF@MBEGFLIL@hallo?0?5caeser?5rocks?$CB?$AA@ ; `string' PUBLIC ??_C@_0L@EMJAFNHM@Original?3?5?$AA@ ; `string' PUBLIC ??_C@_0L@OJEBJNBO@Encoded?3?5?5?$AA@ ; `string' PUBLIC ??_C@_0L@NACPLJCJ@Decoded?3?5?5?$AA@ ; `string' EXTRN @__security_check_cookie@4:PROC EXTRN __imp_??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@PBD@Z:PROC EXTRN __imp_??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ:PROC EXTRN __imp_?begin@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE?AV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ:PROC EXTRN __imp_?end@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE?AV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ:PROC EXTRN __imp_??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z:PROC EXTRN __imp_?endl@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@1@AAV21@@Z:PROC EXTRN __imp_??$?6DU?$char_traits@D@std@@V?$allocator@D@1@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@0@@Z:PROC EXTRN __imp_?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A:BYTE EXTRN __imp_?length@?$char_traits@D@std@@SAIPBD@Z:PROC EXTRN __imp_?eq_int_type@?$char_traits@D@std@@SA_NABH0@Z:PROC EXTRN __imp_?eof@?$char_traits@D@std@@SAHXZ:PROC EXTRN __imp_?flags@ios_base@std@@QBEHXZ:PROC EXTRN __imp_?width@ios_base@std@@QBEHXZ:PROC EXTRN __imp_?width@ios_base@std@@QAEHH@Z:PROC EXTRN __imp_?sputc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHD@Z:PROC EXTRN __imp_?sputn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHPBDH@Z:PROC EXTRN __imp_?setstate@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEXH_N@Z:PROC EXTRN __imp_?fill@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEDXZ:PROC EXTRN __imp_?rdstate@ios_base@std@@QBEHXZ:PROC EXTRN __imp_?good@ios_base@std@@QBE_NXZ:PROC EXTRN __imp_?tie@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEPAV?$basic_ostream@DU?$char_traits@D@std@@@2@XZ:PROC EXTRN __imp_?flush@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV12@XZ:PROC EXTRN __imp_?_Lock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEXXZ:PROC EXTRN __imp_?uncaught_exception@std@@YA_NXZ:PROC EXTRN __imp_?_Osfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEXXZ:PROC EXTRN __imp_?_Unlock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEXXZ:PROC EXTRN __imp_?rdbuf@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEPAV?$basic_streambuf@DU?$char_traits@D@std@@@2@XZ:PROC EXTRN __imp___invalid_parameter_noinfo:PROC EXTRN __imp_?_Myptr@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@IAEPADXZ:PROC ; COMDAT ??_C@_0L@NACPLJCJ@Decoded?3?5?5?$AA@ CONST SEGMENT ??_C@_0L@NACPLJCJ@Decoded?3?5?5?$AA@ DB 'Decoded: ', 00H ; `string' CONST ENDS ; COMDAT ??_C@_0L@OJEBJNBO@Encoded?3?5?5?$AA@ CONST SEGMENT ??_C@_0L@OJEBJNBO@Encoded?3?5?5?$AA@ DB 'Encoded: ', 00H ; `string' CONST ENDS ; COMDAT ??_C@_0L@EMJAFNHM@Original?3?5?$AA@ CONST SEGMENT ??_C@_0L@EMJAFNHM@Original?3?5?$AA@ DB 'Original: ', 00H ; `string' CONST ENDS ; COMDAT ??_C@_0BF@MBEGFLIL@hallo?0?5caeser?5rocks?$CB?$AA@ CONST SEGMENT ??_C@_0BF@MBEGFLIL@hallo?0?5caeser?5rocks?$CB?$AA@ DB 'hallo, caeser rock' DB 's!', 00H ; `string' __bad_alloc_Message DD FLAT:??_C@_0P@GHFPNOJB@bad?5allocation?$AA@ ; COMDAT ??_C@_0P@GHFPNOJB@bad?5allocation?$AA@ CONST SEGMENT ??_C@_0P@GHFPNOJB@bad?5allocation?$AA@ DB 'bad allocation', 00H ; `string' ; Function compile flags: /Ogtpy ; File c:\programme\microsoft visual studio 9.0\vc\include\xstring CONST ENDS ; COMDAT ?_Checked_iterator_base@?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEPADXZ _TEXT SEGMENT ?_Checked_iterator_base@?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEPADXZ PROC ; std::_String_iterator<char,std::char_traits<char>,std::allocator<char> >::_Checked_iterator_base, COMDAT ; _this$ = eax ; 358 : return const_cast<pointer>(this->_Myptr); mov eax, DWORD PTR [eax+4] ; 359 : } ret 0 ?_Checked_iterator_base@?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEPADXZ ENDP ; std::_String_iterator<char,std::char_traits<char>,std::allocator<char> >::_Checked_iterator_base _TEXT ENDS PUBLIC ?rot13@@YADD@Z ; rot13 ; Function compile flags: /Ogtpy ; File c:\programme\microsoft visual studio 9.0\vc\include\algorithm ; COMDAT ??$_Transform@PADPADP6ADD@ZUforward_iterator_tag@std@@@std@@YAPADPAD00P6ADD@ZUforward_iterator_tag@0@U_Range_checked_iterator_tag@0@@Z _TEXT SEGMENT ___formal$ = 8 ; size = 1 ___formal$ = 12 ; size = 1 ??$_Transform@PADPADP6ADD@ZUforward_iterator_tag@std@@@std@@YAPADPAD00P6ADD@ZUforward_iterator_tag@0@U_Range_checked_iterator_tag@0@@Z PROC ; std::_Transform<char *,char *,char (__cdecl*)(char),std::forward_iterator_tag>, COMDAT ; __First$ = ecx ; __Last$ = ebx ; __Dest$ = eax ; 664 : { // transform [_First, _Last) with _Func push esi mov esi, ecx push edi mov edi, eax ; 665 : _DEBUG_RANGE(_First, _Last); ; 666 : _DEBUG_POINTER(_Dest); ; 667 : _DEBUG_POINTER(_Func); ; 668 : for (; _First != _Last; ++_First, ++_Dest) cmp esi, ebx je SHORT $LN1@Transform npad 6 $LL3@Transform: ; 669 : *_Dest = _Func(*_First); movzx eax, BYTE PTR [esi] push eax call ?rot13@@YADD@Z ; rot13 mov BYTE PTR [edi], al inc esi add esp, 4 inc edi cmp esi, ebx jne SHORT $LL3@Transform ; 670 : return (_Dest); mov eax, edi $LN1@Transform: pop edi pop esi ; 671 : } ret 0 ??$_Transform@PADPADP6ADD@ZUforward_iterator_tag@std@@@std@@YAPADPAD00P6ADD@ZUforward_iterator_tag@0@U_Range_checked_iterator_tag@0@@Z ENDP ; std::_Transform<char *,char *,char (__cdecl*)(char),std::forward_iterator_tag> ; Function compile flags: /Ogtpy ; File c:\programme\microsoft visual studio 9.0\vc\include\xutility _TEXT ENDS ; COMDAT ??$_Checked_base@V?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@U_Different_checked_iterator_base_type_tag@2@@std@@YAPADAAV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@0@U_Different_checked_iterator_base_type_tag@0@@Z _TEXT SEGMENT ___formal$ = 8 ; size = 1 ??$_Checked_base@V?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@U_Different_checked_iterator_base_type_tag@2@@std@@YAPADAAV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@0@U_Different_checked_iterator_base_type_tag@0@@Z PROC ; std::_Checked_base<std::_String_iterator<char,std::char_traits<char>,std::allocator<char> >,std::_Different_checked_iterator_base_type_tag>, COMDAT ; __It$ = eax ; 1139 : return _It._Checked_iterator_base(); mov eax, DWORD PTR [eax+4] ; 1140 : } ret 0 ??$_Checked_base@V?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@U_Different_checked_iterator_base_type_tag@2@@std@@YAPADAAV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@0@U_Different_checked_iterator_base_type_tag@0@@Z ENDP ; std::_Checked_base<std::_String_iterator<char,std::char_traits<char>,std::allocator<char> >,std::_Different_checked_iterator_base_type_tag> ; Function compile flags: /Ogtpy _TEXT ENDS ; COMDAT ??$_Iter_random@V?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V12@@std@@YA?AUrandom_access_iterator_tag@0@ABV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@0@0@Z _TEXT SEGMENT ??$_Iter_random@V?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V12@@std@@YA?AUrandom_access_iterator_tag@0@ABV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@0@0@Z PROC ; std::_Iter_random<std::_String_iterator<char,std::char_traits<char>,std::allocator<char> >,std::_String_iterator<char,std::char_traits<char>,std::allocator<char> > >, COMDAT ; ___$ReturnUdt$ = eax ; 994 : typename _Iter_random_helper< ; 995 : iterator_traits<_Iter1>::iterator_category, ; 996 : iterator_traits<_Iter2>::iterator_category>::_Iter_random_cat _Cat; ; 997 : return (_Cat); ; 998 : } ret 0 ??$_Iter_random@V?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V12@@std@@YA?AUrandom_access_iterator_tag@0@ABV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@0@0@Z ENDP ; std::_Iter_random<std::_String_iterator<char,std::char_traits<char>,std::allocator<char> >,std::_String_iterator<char,std::char_traits<char>,std::allocator<char> > > ; Function compile flags: /Ogtpy _TEXT ENDS ; COMDAT ??$_Checked_base@V?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@std@@YAPADAAV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@0@@Z _TEXT SEGMENT ??$_Checked_base@V?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@std@@YAPADAAV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@0@@Z PROC ; std::_Checked_base<std::_String_iterator<char,std::char_traits<char>,std::allocator<char> > >, COMDAT ; __It$ = eax ; 1164 : typename _Checked_iterator_base_helper<_Iter>::_Checked_iterator_base_type_tag _Base_tag; ; 1165 : return _Checked_base(_It, _Base_tag); mov eax, DWORD PTR [eax+4] ; 1166 : } ret 0 ??$_Checked_base@V?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@std@@YAPADAAV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@0@@Z ENDP ; std::_Checked_base<std::_String_iterator<char,std::char_traits<char>,std::allocator<char> > > ; Function compile flags: /Ogtpy ; File c:\programme\microsoft visual studio 9.0\vc\include\ostream _TEXT ENDS ; COMDAT ??1_Sentry_base@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE@XZ _TEXT SEGMENT ??1_Sentry_base@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE@XZ PROC ; std::basic_ostream<char,std::char_traits<char> >::_Sentry_base::~_Sentry_base, COMDAT ; _this$ = eax ; 82 : if (_Myostr.rdbuf() != 0) mov eax, DWORD PTR [eax] mov ecx, DWORD PTR [eax] mov edx, DWORD PTR [ecx+4] mov eax, DWORD PTR [edx+eax+40] test eax, eax je SHORT $LN1@Sentry_bas ; 83 : _Myostr.rdbuf()->_Unlock(); mov ecx, eax jmp DWORD PTR __imp_?_Unlock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEXXZ $LN1@Sentry_bas: ; 84 : } ret 0 ??1_Sentry_base@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE@XZ ENDP ; std::basic_ostream<char,std::char_traits<char> >::_Sentry_base::~_Sentry_base ; Function compile flags: /Ogtpy _TEXT ENDS ; COMDAT ??0_Sentry_base@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE@AAV12@@Z _TEXT SEGMENT ??0_Sentry_base@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE@AAV12@@Z PROC ; std::basic_ostream<char,std::char_traits<char> >::_Sentry_base::_Sentry_base, COMDAT ; _this$ = esi ; __Ostr$ = eax ; 75 : { // lock the stream buffer, if there mov DWORD PTR [esi], eax ; 76 : if (_Myostr.rdbuf() != 0) mov ecx, DWORD PTR [eax] mov edx, DWORD PTR [ecx+4] mov eax, DWORD PTR [edx+eax+40] test eax, eax je SHORT $LN8@Sentry_bas@2 ; 77 : _Myostr.rdbuf()->_Lock(); mov ecx, eax call DWORD PTR __imp_?_Lock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEXXZ $LN8@Sentry_bas@2: ; 78 : } mov eax, esi ret 0 ??0_Sentry_base@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE@AAV12@@Z ENDP ; std::basic_ostream<char,std::char_traits<char> >::_Sentry_base::_Sentry_base ; Function compile flags: /Ogtpy _TEXT ENDS ; COMDAT ??Bsentry@?$basic_ostream@DU?$char_traits@D@std@@@std@@QBE_NXZ _TEXT SEGMENT ??Bsentry@?$basic_ostream@DU?$char_traits@D@std@@@std@@QBE_NXZ PROC ; std::basic_ostream<char,std::char_traits<char> >::sentry::operator bool, COMDAT ; _this$ = eax ; 116 : return (_Ok); mov al, BYTE PTR [eax+4] ; 117 : } ret 0 ??Bsentry@?$basic_ostream@DU?$char_traits@D@std@@@std@@QBE_NXZ ENDP ; std::basic_ostream<char,std::char_traits<char> >::sentry::operator bool _TEXT ENDS EXTRN ___security_cookie:DWORD EXTRN ___CxxFrameHandler3:PROC ; COMDAT xdata$x ; File c:\programme\microsoft visual studio 9.0\vc\include\ios xdata$x SEGMENT __unwindtable$??1sentry@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE@XZ DD 0ffffffffH DD FLAT:__unwindfunclet$??1sentry@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE@XZ$0 __ehfuncinfo$??1sentry@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE@XZ DD 019930522H DD 01H DD FLAT:__unwindtable$??1sentry@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE@XZ DD 2 DUP(00H) DD 2 DUP(00H) DD 00H DD 01H ; Function compile flags: /Ogtpy ; File c:\programme\microsoft visual studio 9.0\vc\include\ostream xdata$x ENDS ; COMDAT ??1sentry@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE@XZ _TEXT SEGMENT __$EHRec$ = -12 ; size = 12 _this$ = 8 ; size = 4 ??1sentry@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE@XZ PROC ; std::basic_ostream<char,std::char_traits<char> >::sentry::~sentry, COMDAT ; 102 : { // destroy the object push -1 push __ehhandler$??1sentry@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE@XZ mov eax, DWORD PTR fs:0 push eax push esi mov eax, DWORD PTR ___security_cookie xor eax, esp push eax lea eax, DWORD PTR __$EHRec$[esp+20] mov DWORD PTR fs:0, eax mov esi, DWORD PTR _this$[esp+16] mov DWORD PTR __$EHRec$[esp+28], 0 ; 103 : ; 104 : #if _HAS_EXCEPTIONS ; 105 : if (!_XSTD uncaught_exception()) call DWORD PTR __imp_?uncaught_exception@std@@YA_NXZ test al, al jne SHORT $LN1@sentry ; 106 : this->_Myostr._Osfx(); mov ecx, DWORD PTR [esi] call DWORD PTR __imp_?_Osfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEXXZ $LN1@sentry: ; 107 : } mov DWORD PTR __$EHRec$[esp+28], -1 mov eax, DWORD PTR [esi] mov ecx, DWORD PTR [eax] mov edx, DWORD PTR [ecx+4] mov eax, DWORD PTR [edx+eax+40] test eax, eax je SHORT $LN5@sentry mov ecx, eax call DWORD PTR __imp_?_Unlock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEXXZ $LN5@sentry: mov ecx, DWORD PTR __$EHRec$[esp+20] mov DWORD PTR fs:0, ecx pop ecx pop esi add esp, 12 ; 0000000cH ret 4 _TEXT ENDS ; COMDAT text$x text$x SEGMENT __unwindfunclet$??1sentry@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE@XZ$0: mov eax, DWORD PTR _this$[ebp-4] jmp ??1_Sentry_base@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE@XZ ; std::basic_ostream<char,std::char_traits<char> >::_Sentry_base::~_Sentry_base __ehhandler$??1sentry@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE@XZ: mov edx, DWORD PTR [esp+8] lea eax, DWORD PTR [edx-4] mov ecx, DWORD PTR [edx-8] xor ecx, eax call @__security_check_cookie@4 mov eax, OFFSET __ehfuncinfo$??1sentry@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE@XZ jmp ___CxxFrameHandler3 text$x ENDS ??1sentry@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE@XZ ENDP ; std::basic_ostream<char,std::char_traits<char> >::sentry::~sentry ; COMDAT xdata$x ; File c:\programme\microsoft visual studio 9.0\vc\include\xiosbase xdata$x SEGMENT __unwindtable$??0sentry@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE@AAV12@@Z DD 0ffffffffH DD FLAT:__unwindfunclet$??0sentry@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE@AAV12@@Z$0 __ehfuncinfo$??0sentry@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE@AAV12@@Z DD 019930522H DD 01H DD FLAT:__unwindtable$??0sentry@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE@AAV12@@Z DD 2 DUP(00H) DD 2 DUP(00H) DD 00H DD 01H ; Function compile flags: /Ogtpy ; File c:\programme\microsoft visual studio 9.0\vc\include\ostream xdata$x ENDS ; COMDAT ??0sentry@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE@AAV12@@Z _TEXT SEGMENT __$EHRec$ = -12 ; size = 12 _this$ = 8 ; size = 4 ??0sentry@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE@AAV12@@Z PROC ; std::basic_ostream<char,std::char_traits<char> >::sentry::sentry, COMDAT ; __Ostr$ = esi ; 95 : { // construct locking and testing stream push -1 push __ehhandler$??0sentry@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE@AAV12@@Z mov eax, DWORD PTR fs:0 push eax push edi mov eax, DWORD PTR ___security_cookie xor eax, esp push eax lea eax, DWORD PTR __$EHRec$[esp+20] mov DWORD PTR fs:0, eax mov edi, DWORD PTR _this$[esp+16] mov DWORD PTR [edi], esi mov eax, DWORD PTR [esi] mov ecx, DWORD PTR [eax+4] mov ecx, DWORD PTR [ecx+esi+40] test ecx, ecx je SHORT $LN5@sentry@2 call DWORD PTR __imp_?_Lock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEXXZ $LN5@sentry@2: mov DWORD PTR __$EHRec$[esp+28], 0 ; 96 : if (_Ostr.good() && _Ostr.tie() != 0) mov edx, DWORD PTR [esi] mov eax, DWORD PTR [edx+4] add eax, esi cmp DWORD PTR [eax+8], 0 jne SHORT $LN1@sentry@2 mov eax, DWORD PTR [eax+44] test eax, eax je SHORT $LN1@sentry@2 ; 97 : _Ostr.tie()->flush(); mov ecx, eax call DWORD PTR __imp_?flush@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV12@XZ $LN1@sentry@2: ; 98 : _Ok = _Ostr.good(); // store test only after flushing tie mov ecx, DWORD PTR [esi] mov edx, DWORD PTR [ecx+4] cmp DWORD PTR [edx+esi+8], 0 sete al mov BYTE PTR [edi+4], al ; 99 : } mov eax, edi mov ecx, DWORD PTR __$EHRec$[esp+20] mov DWORD PTR fs:0, ecx pop ecx pop edi add esp, 12 ; 0000000cH ret 4 _TEXT ENDS ; COMDAT text$x text$x SEGMENT __unwindfunclet$??0sentry@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE@AAV12@@Z$0: mov eax, DWORD PTR _this$[ebp-4] jmp ??1_Sentry_base@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE@XZ ; std::basic_ostream<char,std::char_traits<char> >::_Sentry_base::~_Sentry_base __ehhandler$??0sentry@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE@AAV12@@Z: mov edx, DWORD PTR [esp+8] lea eax, DWORD PTR [edx-4] mov ecx, DWORD PTR [edx-8] xor ecx, eax call @__security_check_cookie@4 mov eax, OFFSET __ehfuncinfo$??0sentry@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE@AAV12@@Z jmp ___CxxFrameHandler3 text$x ENDS ??0sentry@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE@AAV12@@Z ENDP ; std::basic_ostream<char,std::char_traits<char> >::sentry::sentry ; Function compile flags: /Ogtpy ; File x:\main.cpp ; COMDAT ?rot13@@YADD@Z _TEXT SEGMENT _c$ = 8 ; size = 1 ?rot13@@YADD@Z PROC ; rot13, COMDAT ; 7 : return (~c - 1 / (~((c = ~c) | 32) / 13 * 2 - 11) * 13); mov al, BYTE PTR _c$[esp-4] not al push esi movsx esi, al mov ecx, esi or ecx, 32 ; 00000020H not ecx mov eax, 1321528399 ; 4ec4ec4fH imul ecx sar edx, 2 mov eax, edx shr eax, 31 ; 0000001fH add eax, edx lea ecx, DWORD PTR [eax+eax-11] mov eax, 1 cdq idiv ecx mov edx, eax imul edx, 13 ; 0000000dH mov eax, esi not eax sub eax, edx pop esi ; 8 : } ret 0 ?rot13@@YADD@Z ENDP ; rot13 ; Function compile flags: /Ogtpy ; File c:\programme\microsoft visual studio 9.0\vc\include\xutility _TEXT ENDS ; COMDAT ?_Has_container@_Iterator_base_secure@std@@QBE_NXZ _TEXT SEGMENT ?_Has_container@_Iterator_base_secure@std@@QBE_NXZ PROC ; std::_Iterator_base_secure::_Has_container, COMDAT ; _this$ = ecx ; 582 : return _Mycont != 0; xor eax, eax cmp DWORD PTR [ecx], eax setne al ; 583 : } ret 0 ?_Has_container@_Iterator_base_secure@std@@QBE_NXZ ENDP ; std::_Iterator_base_secure::_Has_container ; Function compile flags: /Ogtpy ; File c:\programme\microsoft visual studio 9.0\vc\include\xstring _TEXT ENDS ; COMDAT ??Y?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV01@H@Z _TEXT SEGMENT ??Y?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV01@H@Z PROC ; std::_String_const_iterator<char,std::char_traits<char>,std::allocator<char> >::operator+=, COMDAT ; _this$ = esi ; __Off$ = ebx ; 170 : if (this->_Mycont != _IGNORE_MYCONT) mov eax, DWORD PTR [esi] cmp eax, -4 ; fffffffcH je SHORT $LN2@operator ; 171 : { ; 172 : _SCL_SECURE_VALIDATE(this->_Has_container()); test eax, eax jne SHORT $LN3@operator call DWORD PTR __imp___invalid_parameter_noinfo $LN3@operator: ; 173 : _SCL_SECURE_VALIDATE_RANGE( mov eax, DWORD PTR [esi] cmp DWORD PTR [eax+24], 16 ; 00000010H jb SHORT $LN11@operator mov edx, DWORD PTR [eax+4] jmp SHORT $LN12@operator $LN11@operator: lea edx, DWORD PTR [eax+4] $LN12@operator: mov ecx, DWORD PTR [esi+4] push ebp mov ebp, DWORD PTR [eax+20] add ebp, edx add ecx, ebx cmp ecx, ebp pop ebp ja SHORT $LN1@operator cmp DWORD PTR [eax+24], 16 ; 00000010H jb SHORT $LN15@operator mov eax, DWORD PTR [eax+4] jmp SHORT $LN16@operator $LN15@operator: add eax, 4 $LN16@operator: cmp ecx, eax jae SHORT $LN2@operator $LN1@operator: ; 174 : _Myptr + _Off <= (((_Mystring *)this->_Mycont)->_Myptr() + ((_Mystring *)this->_Mycont)->_Mysize) && ; 175 : _Myptr + _Off >= ((_Mystring *)this->_Mycont)->_Myptr()); call DWORD PTR __imp___invalid_parameter_noinfo $LN2@operator: ; 176 : } ; 177 : _Myptr += _Off; add DWORD PTR [esi+4], ebx ; 178 : return (*this); mov eax, esi ; 179 : } ret 0 ??Y?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV01@H@Z ENDP ; std::_String_const_iterator<char,std::char_traits<char>,std::allocator<char> >::operator+= ; Function compile flags: /Ogtpy _TEXT ENDS ; COMDAT ??Y?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV01@H@Z _TEXT SEGMENT ??Y?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV01@H@Z PROC ; std::_String_iterator<char,std::char_traits<char>,std::allocator<char> >::operator+=, COMDAT ; _this$ = esi ; __Off$ = ebx ; 405 : (*(_Mybase *)this) += _Off; mov eax, DWORD PTR [esi] cmp eax, -4 ; fffffffcH je SHORT $LN4@operator@2 test eax, eax jne SHORT $LN5@operator@2 call DWORD PTR __imp___invalid_parameter_noinfo $LN5@operator@2: mov eax, DWORD PTR [esi] cmp DWORD PTR [eax+24], 16 ; 00000010H jb SHORT $LN13@operator@2 mov edx, DWORD PTR [eax+4] jmp SHORT $LN14@operator@2 $LN13@operator@2: lea edx, DWORD PTR [eax+4] $LN14@operator@2: mov ecx, DWORD PTR [esi+4] push ebp mov ebp, DWORD PTR [eax+20] add ebp, edx add ecx, ebx cmp ecx, ebp pop ebp ja SHORT $LN3@operator@2 cmp DWORD PTR [eax+24], 16 ; 00000010H jb SHORT $LN17@operator@2 mov eax, DWORD PTR [eax+4] jmp SHORT $LN18@operator@2 $LN17@operator@2: add eax, 4 $LN18@operator@2: cmp ecx, eax jae SHORT $LN4@operator@2 $LN3@operator@2: call DWORD PTR __imp___invalid_parameter_noinfo $LN4@operator@2: add DWORD PTR [esi+4], ebx ; 406 : return (*this); mov eax, esi ; 407 : } ret 0 ??Y?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV01@H@Z ENDP ; std::_String_iterator<char,std::char_traits<char>,std::allocator<char> >::operator+= ; Function compile flags: /Ogtpy _TEXT ENDS ; COMDAT ??H?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBE?AV01@H@Z _TEXT SEGMENT ___$ReturnUdt$ = 8 ; size = 4 __Off$ = 12 ; size = 4 ??H?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBE?AV01@H@Z PROC ; std::_String_iterator<char,std::char_traits<char>,std::allocator<char> >::operator+, COMDAT ; _this$ = eax ; 410 : { // return this + integer push ebx push ebp push esi ; 411 : _Myt _Tmp = *this; mov esi, DWORD PTR [eax] push edi mov edi, DWORD PTR [eax+4] ; 412 : return (_Tmp += _Off); cmp esi, -4 ; fffffffcH je SHORT $LN6@operator@3 test esi, esi jne SHORT $LN7@operator@3 call DWORD PTR __imp___invalid_parameter_noinfo $LN7@operator@3: mov ebx, DWORD PTR [esi+24] lea eax, DWORD PTR [esi+4] cmp ebx, 16 ; 00000010H jb SHORT $LN15@operator@3 mov ecx, DWORD PTR [eax] jmp SHORT $LN16@operator@3 $LN15@operator@3: mov ecx, eax $LN16@operator@3: mov edx, DWORD PTR __Off$[esp+12] mov ebp, DWORD PTR [esi+20] add edx, edi add ebp, ecx cmp edx, ebp ja SHORT $LN5@operator@3 cmp ebx, 16 ; 00000010H jb SHORT $LN19@operator@3 mov eax, DWORD PTR [eax] $LN19@operator@3: cmp edx, eax jae SHORT $LN6@operator@3 $LN5@operator@3: call DWORD PTR __imp___invalid_parameter_noinfo $LN6@operator@3: add edi, DWORD PTR __Off$[esp+12] mov eax, DWORD PTR ___$ReturnUdt$[esp+12] mov DWORD PTR [eax+4], edi ; 413 : } pop edi mov DWORD PTR [eax], esi pop esi pop ebp pop ebx ret 8 ??H?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBE?AV01@H@Z ENDP ; std::_String_iterator<char,std::char_traits<char>,std::allocator<char> >::operator+ ; Function compile flags: /Ogtpy ; File c:\programme\microsoft visual studio 9.0\vc\include\algorithm _TEXT ENDS ; COMDAT ??$_Transform@PADV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@P6ADD@Z@std@@YA?AV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@0@PAD0V10@P6ADD@ZUrandom_access_iterator_tag@0@U_Range_checked_iterator_tag@0@@Z _TEXT SEGMENT ___$ReturnUdt$ = 8 ; size = 4 __First$ = 12 ; size = 4 __Last$ = 16 ; size = 4 ___formal$ = 20 ; size = 1 ___formal$ = 24 ; size = 1 __Dest$ = 28 ; size = 8 ??$_Transform@PADV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@P6ADD@Z@std@@YA?AV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@0@PAD0V10@P6ADD@ZUrandom_access_iterator_tag@0@U_Range_checked_iterator_tag@0@@Z PROC ; std::_Transform<char *,std::_String_iterator<char,std::char_traits<char>,std::allocator<char> >,char (__cdecl*)(char)>, COMDAT ; 678 : { // transform [_First, _Last) with _Func push ebx ; 679 : // for range checked iterators, this will make sure there is enough space ; 680 : _OutIt _Result = _Dest + (_Last - _First); mov ebx, DWORD PTR __Dest$[esp] push ebp mov ebp, DWORD PTR __First$[esp+4] push esi mov esi, DWORD PTR __Dest$[esp+12] push edi mov edi, DWORD PTR __Last$[esp+12] sub edi, ebp cmp ebx, -4 ; fffffffcH je SHORT $LN8@Transform@2 test ebx, ebx jne SHORT $LN9@Transform@2 call DWORD PTR __imp___invalid_parameter_noinfo $LN9@Transform@2: mov eax, DWORD PTR [ebx+24] cmp eax, 16 ; 00000010H lea eax, DWORD PTR [ebx+4] jb SHORT $LN17@Transform@2 mov ecx, DWORD PTR [eax] jmp SHORT $LN18@Transform@2 $LN17@Transform@2: mov ecx, eax $LN18@Transform@2: mov edx, DWORD PTR [ebx+20] add edx, ecx lea ecx, DWORD PTR [esi+edi] cmp ecx, edx ja SHORT $LN7@Transform@2 cmp DWORD PTR [ebx+24], 16 ; 00000010H jb SHORT $LN21@Transform@2 mov eax, DWORD PTR [eax] $LN21@Transform@2: cmp ecx, eax jae SHORT $LN8@Transform@2 $LN7@Transform@2: call DWORD PTR __imp___invalid_parameter_noinfo $LN8@Transform@2: mov eax, DWORD PTR ___$ReturnUdt$[esp+12] add esi, edi ; 681 : _Transform(_First, _Last, _CHECKED_BASE(_Dest), _Func, ; 682 : forward_iterator_tag(), _Range_checked_iterator_tag()); mov edi, DWORD PTR __Dest$[esp+16] mov DWORD PTR [eax+4], esi mov DWORD PTR [eax], ebx mov esi, ebp cmp ebp, DWORD PTR __Last$[esp+12] je SHORT $LN29@Transform@2 npad 5 $LL31@Transform@2: movzx eax, BYTE PTR [esi] push eax call ?rot13@@YADD@Z ; rot13 mov BYTE PTR [edi], al inc esi add esp, 4 inc edi cmp esi, DWORD PTR __Last$[esp+12] jne SHORT $LL31@Transform@2 ; 683 : return (_Result); mov eax, DWORD PTR ___$ReturnUdt$[esp+12] ; 681 : _Transform(_First, _Last, _CHECKED_BASE(_Dest), _Func, ; 682 : forward_iterator_tag(), _Range_checked_iterator_tag()); $LN29@Transform@2: ; 684 : } pop edi pop esi pop ebp pop ebx ret 0 ??$_Transform@PADV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@P6ADD@Z@std@@YA?AV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@0@PAD0V10@P6ADD@ZUrandom_access_iterator_tag@0@U_Range_checked_iterator_tag@0@@Z ENDP ; std::_Transform<char *,std::_String_iterator<char,std::char_traits<char>,std::allocator<char> >,char (__cdecl*)(char)> ; Function compile flags: /Ogtpy _TEXT ENDS ; COMDAT ??$transform@V?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V12@P6ADD@Z@std@@YA?AV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@0@V10@00P6ADD@Z@Z _TEXT SEGMENT $T28274 = -4 ; size = 1 __First$ = 8 ; size = 8 $T28275 = 16 ; size = 1 __Last$ = 16 ; size = 8 __Dest$ = 24 ; size = 8 ??$transform@V?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V12@P6ADD@Z@std@@YA?AV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@0@V10@00P6ADD@Z@Z PROC ; std::transform<std::_String_iterator<char,std::char_traits<char>,std::allocator<char> >,std::_String_iterator<char,std::char_traits<char>,std::allocator<char> >,char (__cdecl*)(char)>, COMDAT ; ___$ReturnUdt$ = esi ; 692 : { push ecx ; 693 : return _Transform(_CHECKED_BASE(_First), _CHECKED_BASE(_Last), _Dest, _Func, ; 694 : _Iter_random(_First, _Dest), _STD _Range_checked_iterator_tag()); mov eax, DWORD PTR __Dest$[esp+4] mov ecx, DWORD PTR __Dest$[esp] push eax mov eax, DWORD PTR $T28275[esp+4] push ecx mov ecx, DWORD PTR __Last$[esp+12] mov BYTE PTR $T28274[esp+12], 0 mov edx, DWORD PTR $T28274[esp+12] push edx mov edx, DWORD PTR __First$[esp+16] push eax push ecx push edx push esi call ??$_Transform@PADV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@P6ADD@Z@std@@YA?AV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@0@PAD0V10@P6ADD@ZUrandom_access_iterator_tag@0@U_Range_checked_iterator_tag@0@@Z ; std::_Transform<char *,std::_String_iterator<char,std::char_traits<char>,std::allocator<char> >,char (__cdecl*)(char)> mov eax, esi ; 695 : } add esp, 32 ; 00000020H ret 0 ??$transform@V?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V12@P6ADD@Z@std@@YA?AV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@0@V10@00P6ADD@Z@Z ENDP ; std::transform<std::_String_iterator<char,std::char_traits<char>,std::allocator<char> >,std::_String_iterator<char,std::char_traits<char>,std::allocator<char> >,char (__cdecl*)(char)> _TEXT ENDS ; COMDAT xdata$x ; File c:\programme\microsoft visual studio 9.0\vc\include\ios xdata$x SEGMENT __unwindtable$??$?6U?$char_traits@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@PBD@Z DD 0ffffffffH DD FLAT:__unwindfunclet$??$?6U?$char_traits@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@PBD@Z$2 DD 00H DD 00H DD 00H DD 00H DD 0ffffffffH DD FLAT:__unwindfunclet$??$?6U?$char_traits@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@PBD@Z$3 __catchsym$??$?6U?$char_traits@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@PBD@Z$4 DD 040H DD 00H DD 00H DD FLAT:__catch$??$?6U?$char_traits@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@PBD@Z$0 __tryblocktable$??$?6U?$char_traits@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@PBD@Z DD 01H DD 01H DD 02H DD 01H DD FLAT:__catchsym$??$?6U?$char_traits@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@PBD@Z$4 __ehfuncinfo$??$?6U?$char_traits@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@PBD@Z DD 019930522H DD 04H DD FLAT:__unwindtable$??$?6U?$char_traits@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@PBD@Z DD 01H DD FLAT:__tryblocktable$??$?6U?$char_traits@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@PBD@Z DD 2 DUP(00H) DD 00H DD 01H ; Function compile flags: /Ogtpy ; File c:\programme\microsoft visual studio 9.0\vc\include\ostream xdata$x ENDS ; COMDAT ??$?6U?$char_traits@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@PBD@Z _TEXT SEGMENT __Ok$ = -32 ; size = 8 $T28373 = -24 ; size = 1 $T28355 = -24 ; size = 1 __State$ = -20 ; size = 4 __$EHRec$ = -16 ; size = 16 __Ostr$ = 8 ; size = 4 __Val$ = 12 ; size = 4 ??$?6U?$char_traits@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@PBD@Z PROC ; std::operator<<<std::char_traits<char> >, COMDAT ; 741 : { // insert NTBS into char stream push ebp mov ebp, esp push -1 push __ehhandler$??$?6U?$char_traits@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@PBD@Z mov eax, DWORD PTR fs:0 push eax sub esp, 20 ; 00000014H push ebx push esi push edi mov eax, DWORD PTR ___security_cookie xor eax, ebp push eax lea eax, DWORD PTR __$EHRec$[ebp+4] mov DWORD PTR fs:0, eax mov DWORD PTR __$EHRec$[ebp], esp mov esi, DWORD PTR __Ostr$[ebp] ; 742 : typedef char _Elem; ; 743 : typedef basic_ostream<_Elem, _Traits> _Myos; ; 744 : ios_base::iostate _State = ios_base::goodbit; ; 745 : streamsize _Count = (streamsize)_Traits::length(_Val); // may overflow mov eax, DWORD PTR __Val$[ebp] xor ebx, ebx mov DWORD PTR __State$[ebp], ebx lea edx, DWORD PTR [eax+1] npad 7 $LL72@operator@4: mov cl, BYTE PTR [eax] inc eax test cl, cl jne SHORT $LL72@operator@4 sub eax, edx mov edi, eax ; 746 : streamsize _Pad = _Ostr.width() <= 0 || _Ostr.width() <= _Count ; 747 : ? 0 : _Ostr.width() - _Count; mov eax, DWORD PTR [esi] mov ecx, DWORD PTR [eax+4] mov eax, DWORD PTR [ecx+esi+24] cmp eax, ebx jle SHORT $LN17@operator@4 cmp eax, edi jle SHORT $LN17@operator@4 sub eax, edi mov ebx, eax $LN17@operator@4: ; 748 : const typename _Myos::sentry _Ok(_Ostr); lea edx, DWORD PTR __Ok$[ebp] push edx call ??0sentry@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE@AAV12@@Z ; std::basic_ostream<char,std::char_traits<char> >::sentry::sentry mov DWORD PTR __$EHRec$[ebp+12], 0 ; 749 : ; 750 : if (!_Ok) cmp BYTE PTR __Ok$[ebp+4], 0 jne SHORT $LN14@operator@4 ; 751 : _State |= ios_base::badbit; mov DWORD PTR __State$[ebp], 4 ; 752 : else jmp SHORT $LN22@operator@4 $LN14@operator@4: ; 753 : { // state okay, insert ; 754 : _TRY_IO_BEGIN mov BYTE PTR __$EHRec$[ebp+12], 1 ; 755 : if ((_Ostr.flags() & ios_base::adjustfield) != ios_base::left) mov eax, DWORD PTR [esi] mov ecx, DWORD PTR [eax+4] mov eax, DWORD PTR [ecx+esi+16] and eax, 448 ; 000001c0H cmp eax, 64 ; 00000040H je SHORT $LN70@operator@4 $LL10@operator@4: ; 756 : for (; 0 < _Pad; --_Pad) // pad on left test ebx, ebx jle SHORT $LN8@operator@4 ; 757 : if (_Traits::eq_int_type(_Traits::eof(), ; 758 : _Ostr.rdbuf()->sputc(_Ostr.fill()))) mov edx, DWORD PTR [esi] mov eax, DWORD PTR [edx+4] mov cl, BYTE PTR [eax+esi+48] add eax, esi mov eax, DWORD PTR [eax+40] mov BYTE PTR $T28355[ebp], cl mov edx, DWORD PTR $T28355[ebp] push edx mov ecx, eax call DWORD PTR __imp_?sputc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHD@Z cmp eax, -1 jne $LN9@operator@4 ; 759 : { // insertion failed, quit ; 760 : _State |= ios_base::badbit; or DWORD PTR __State$[ebp], 4 $LN8@operator@4: ; 761 : break; ; 762 : } ; 763 : ; 764 : if (_State == ios_base::goodbit ; 765 : && _Ostr.rdbuf()->sputn(_Val, _Count) != _Count) cmp DWORD PTR __State$[ebp], 0 jne SHORT $LN2@operator@4 $LN70@operator@4: mov eax, DWORD PTR [esi] mov ecx, DWORD PTR [eax+4] mov edx, DWORD PTR __Val$[ebp] mov ecx, DWORD PTR [ecx+esi+40] push edi push edx call DWORD PTR __imp_?sputn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHPBDH@Z cmp eax, edi je SHORT $LL71@operator@4 ; 766 : _State |= ios_base::badbit; mov DWORD PTR __State$[ebp], 4 $LN2@operator@4: ; 775 : } ; 776 : _Ostr.width(0); mov eax, DWORD PTR [esi] mov eax, DWORD PTR [eax+4] add eax, esi xor ecx, ecx mov DWORD PTR [eax+24], ecx mov DWORD PTR __$EHRec$[ebp+12], ecx $LN22@operator@4: ; 778 : } ; 779 : ; 780 : _Ostr.setstate(_State); mov ecx, DWORD PTR __State$[ebp] mov edx, DWORD PTR [esi] push 0 push ecx mov ecx, DWORD PTR [edx+4] add ecx, esi call DWORD PTR __imp_?setstate@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEXH_N@Z ; 781 : return (_Ostr); mov DWORD PTR __$EHRec$[ebp+12], 3 call DWORD PTR __imp_?uncaught_exception@std@@YA_NXZ test al, al jne SHORT $LN56@operator@4 mov ecx, DWORD PTR __Ok$[ebp] call DWORD PTR __imp_?_Osfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEXXZ $LN56@operator@4: mov DWORD PTR __$EHRec$[ebp+12], -1 mov eax, DWORD PTR __Ok$[ebp] mov ecx, DWORD PTR [eax] mov edx, DWORD PTR [ecx+4] mov ecx, DWORD PTR [edx+eax+40] test ecx, ecx je SHORT $LN74@operator@4 call DWORD PTR __imp_?_Unlock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEXXZ $LN74@operator@4: mov eax, esi ; 782 : } mov ecx, DWORD PTR __$EHRec$[ebp+4] mov DWORD PTR fs:0, ecx pop ecx pop edi pop esi pop ebx mov esp, ebp pop ebp ret 0 $LN9@operator@4: ; 756 : for (; 0 < _Pad; --_Pad) // pad on left dec ebx jmp $LL10@operator@4 npad 4 $LL71@operator@4: ; 767 : ; 768 : if (_State == ios_base::goodbit) ; 769 : for (; 0 < _Pad; --_Pad) // pad on right test ebx, ebx jle SHORT $LN2@operator@4 ; 770 : if (_Traits::eq_int_type(_Traits::eof(), ; 771 : _Ostr.rdbuf()->sputc(_Ostr.fill()))) mov eax, DWORD PTR [esi] mov ecx, DWORD PTR [eax+4] mov dl, BYTE PTR [ecx+esi+48] lea eax, DWORD PTR [ecx+esi] mov eax, DWORD PTR [eax+40] mov BYTE PTR $T28373[ebp], dl mov ecx, DWORD PTR $T28373[ebp] push ecx mov ecx, eax call DWORD PTR __imp_?sputc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHD@Z cmp eax, -1 jne SHORT $LN3@operator@4 ; 772 : { // insertion failed, quit ; 773 : _State |= ios_base::badbit; or DWORD PTR __State$[ebp], 4 ; 774 : break; jmp $LN2@operator@4 $LN3@operator@4: ; 767 : ; 768 : if (_State == ios_base::goodbit) ; 769 : for (; 0 < _Pad; --_Pad) // pad on right dec ebx jmp SHORT $LL71@operator@4 __catch$??$?6U?$char_traits@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@PBD@Z$0: ; 777 : _CATCH_IO_(_Ostr) mov eax, DWORD PTR __Ostr$[ebp] mov edx, DWORD PTR [eax] mov ecx, DWORD PTR [edx+4] push 1 push 4 add ecx, eax call DWORD PTR __imp_?setstate@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEXH_N@Z mov DWORD PTR __$EHRec$[ebp+12], 0 mov eax, $LN23@operator@4 ret 0 $LN23@operator@4: mov esi, DWORD PTR __Ostr$[ebp] jmp $LN22@operator@4 _TEXT ENDS ; COMDAT text$x text$x SEGMENT __unwindfunclet$??$?6U?$char_traits@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@PBD@Z$2: lea eax, DWORD PTR __Ok$[ebp] push eax call ??1sentry@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE@XZ ; std::basic_ostream<char,std::char_traits<char> >::sentry::~sentry ret 0 __unwindfunclet$??$?6U?$char_traits@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@PBD@Z$3: lea eax, DWORD PTR __Ok$[ebp] jmp ??1_Sentry_base@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE@XZ ; std::basic_ostream<char,std::char_traits<char> >::_Sentry_base::~_Sentry_base __ehhandler$??$?6U?$char_traits@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@PBD@Z: mov edx, DWORD PTR [esp+8] lea eax, DWORD PTR [edx+12] mov ecx, DWORD PTR [edx-36] xor ecx, eax call @__security_check_cookie@4 mov eax, OFFSET __ehfuncinfo$??$?6U?$char_traits@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@PBD@Z jmp ___CxxFrameHandler3 text$x ENDS ??$?6U?$char_traits@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@PBD@Z ENDP ; std::operator<<<std::char_traits<char> > PUBLIC __$ArrayPad$ PUBLIC _main ; COMDAT xdata$x ; File c:\programme\microsoft visual studio 9.0\vc\include\xstring xdata$x SEGMENT __unwindtable$_main DD 0ffffffffH DD FLAT:__unwindfunclet$_main$0 __ehfuncinfo$_main DD 019930522H DD 01H DD FLAT:__unwindtable$_main DD 2 DUP(00H) DD 2 DUP(00H) DD 00H DD 01H ; Function compile flags: /Ogtpy ; File x:\main.cpp xdata$x ENDS ; COMDAT _main _TEXT SEGMENT $T28557 = -88 ; size = 1 $T28558 = -88 ; size = 1 $T28492 = -88 ; size = 1 $T28493 = -88 ; size = 1 $T28576 = -88 ; size = 8 $T28511 = -88 ; size = 8 $T28577 = -80 ; size = 8 $T28512 = -80 ; size = 8 $T28446 = -80 ; size = 8 $T28442 = -80 ; size = 8 $T28445 = -72 ; size = 8 $T28439 = -72 ; size = 8 $T28443 = -64 ; size = 8 $T28441 = -64 ; size = 8 $T28444 = -56 ; size = 8 $T28440 = -56 ; size = 8 _buffer$ = -48 ; size = 28 __$ArrayPad$ = -20 ; size = 4 __$EHRec$ = -12 ; size = 12 _main PROC ; COMDAT ; 11 : { push ebp mov ebp, esp and esp, -8 ; fffffff8H push -1 push __ehhandler$_main mov eax, DWORD PTR fs:0 push eax sub esp, 80 ; 00000050H mov eax, DWORD PTR ___security_cookie xor eax, esp mov DWORD PTR __$ArrayPad$[esp+92], eax push ebx push esi push edi mov eax, DWORD PTR ___security_cookie xor eax, esp push eax lea eax, DWORD PTR __$EHRec$[esp+108] mov DWORD PTR fs:0, eax ; 12 : std::string buffer = "hallo, caeser rocks!"; push OFFSET ??_C@_0BF@MBEGFLIL@hallo?0?5caeser?5rocks?$CB?$AA@ lea ecx, DWORD PTR _buffer$[esp+112] call DWORD PTR __imp_??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@PBD@Z mov DWORD PTR __$EHRec$[esp+116], 0 ; 13 : ; 14 : // originial ; 15 : std::cout << "Original: " << buffer << std::endl; mov eax, DWORD PTR __imp_?endl@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@1@AAV21@@Z mov edx, DWORD PTR __imp_?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A push eax lea ecx, DWORD PTR _buffer$[esp+112] push ecx push OFFSET ??_C@_0L@EMJAFNHM@Original?3?5?$AA@ push edx call ??$?6U?$char_traits@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@PBD@Z ; std::operator<<<std::char_traits<char> > mov esi, DWORD PTR __imp_??$?6DU?$char_traits@D@std@@V?$allocator@D@1@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@0@@Z add esp, 8 push eax call esi add esp, 8 mov ecx, eax call DWORD PTR __imp_??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z ; 16 : ; 17 : // encoding ; 18 : std::transform(buffer.begin(), buffer.end(), buffer.begin(), &rot13); lea eax, DWORD PTR $T28439[esp+108] push eax lea ecx, DWORD PTR _buffer$[esp+112] call DWORD PTR __imp_?begin@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE?AV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ mov edi, DWORD PTR [eax] mov ebx, DWORD PTR [eax+4] lea ecx, DWORD PTR $T28440[esp+108] push ecx lea ecx, DWORD PTR _buffer$[esp+112] call DWORD PTR __imp_?end@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE?AV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ mov edx, DWORD PTR [eax] mov eax, DWORD PTR [eax+4] lea ecx, DWORD PTR $T28441[esp+108] push ecx lea ecx, DWORD PTR _buffer$[esp+112] mov DWORD PTR $T28512[esp+112], edx mov DWORD PTR $T28512[esp+116], eax call DWORD PTR __imp_?begin@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE?AV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ mov edx, DWORD PTR [eax] mov eax, DWORD PTR [eax+4] push ebx mov DWORD PTR $T28511[esp+112], edx push edi mov BYTE PTR $T28492[esp+116], 0 mov ecx, DWORD PTR $T28492[esp+116] mov edx, DWORD PTR $T28493[esp+116] push ecx mov ecx, DWORD PTR $T28512[esp+124] push edx push ecx push eax lea edx, DWORD PTR $T28442[esp+132] push edx call ??$_Transform@PADV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@P6ADD@Z@std@@YA?AV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@0@PAD0V10@P6ADD@ZUrandom_access_iterator_tag@0@U_Range_checked_iterator_tag@0@@Z ; std::_Transform<char *,std::_String_iterator<char,std::char_traits<char>,std::allocator<char> >,char (__cdecl*)(char)> ; 19 : std::cout << "Encoded: " << buffer << std::endl; mov eax, DWORD PTR __imp_?endl@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@1@AAV21@@Z mov edx, DWORD PTR __imp_?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A add esp, 28 ; 0000001cH push eax lea ecx, DWORD PTR _buffer$[esp+112] push ecx push OFFSET ??_C@_0L@OJEBJNBO@Encoded?3?5?5?$AA@ push edx call ??$?6U?$char_traits@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@PBD@Z ; std::operator<<<std::char_traits<char> > add esp, 8 push eax call esi add esp, 8 mov ecx, eax call DWORD PTR __imp_??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z ; 20 : ; 21 : // decoding ; 22 : std::transform(buffer.begin(), buffer.end(), buffer.begin(), &rot13); lea eax, DWORD PTR $T28443[esp+108] push eax lea ecx, DWORD PTR _buffer$[esp+112] call DWORD PTR __imp_?begin@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE?AV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ mov edi, DWORD PTR [eax] mov ebx, DWORD PTR [eax+4] lea ecx, DWORD PTR $T28444[esp+108] push ecx lea ecx, DWORD PTR _buffer$[esp+112] call DWORD PTR __imp_?end@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE?AV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ mov edx, DWORD PTR [eax] mov DWORD PTR $T28577[esp+108], edx mov eax, DWORD PTR [eax+4] lea ecx, DWORD PTR $T28445[esp+108] push ecx lea ecx, DWORD PTR _buffer$[esp+112] mov DWORD PTR $T28577[esp+116], eax call DWORD PTR __imp_?begin@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE?AV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ mov edx, DWORD PTR [eax] mov eax, DWORD PTR [eax+4] push ebx mov DWORD PTR $T28576[esp+112], edx push edi mov BYTE PTR $T28557[esp+116], 0 mov ecx, DWORD PTR $T28557[esp+116] mov edx, DWORD PTR $T28558[esp+116] push ecx mov ecx, DWORD PTR $T28577[esp+124] push edx push ecx push eax lea edx, DWORD PTR $T28446[esp+132] push edx call ??$_Transform@PADV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@P6ADD@Z@std@@YA?AV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@0@PAD0V10@P6ADD@ZUrandom_access_iterator_tag@0@U_Range_checked_iterator_tag@0@@Z ; std::_Transform<char *,std::_String_iterator<char,std::char_traits<char>,std::allocator<char> >,char (__cdecl*)(char)> ; 23 : std::cout << "Decoded: " << buffer << std::endl; mov eax, DWORD PTR __imp_?endl@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@1@AAV21@@Z mov edx, DWORD PTR __imp_?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A add esp, 28 ; 0000001cH push eax lea ecx, DWORD PTR _buffer$[esp+112] push ecx push OFFSET ??_C@_0L@NACPLJCJ@Decoded?3?5?5?$AA@ push edx call ??$?6U?$char_traits@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@PBD@Z ; std::operator<<<std::char_traits<char> > add esp, 8 push eax call esi add esp, 8 mov ecx, eax call DWORD PTR __imp_??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z ; 24 : ; 25 : return 0; lea ecx, DWORD PTR _buffer$[esp+108] mov DWORD PTR __$EHRec$[esp+116], -1 call DWORD PTR __imp_??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ xor eax, eax ; 26 : } mov ecx, DWORD PTR __$EHRec$[esp+108] mov DWORD PTR fs:0, ecx pop ecx pop edi pop esi pop ebx mov ecx, DWORD PTR __$ArrayPad$[esp+92] xor ecx, esp call @__security_check_cookie@4 mov esp, ebp pop ebp ret 0 _TEXT ENDS ; COMDAT text$x text$x SEGMENT __unwindfunclet$_main$0: lea ecx, DWORD PTR _buffer$[ebp] jmp DWORD PTR __imp_??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ __ehhandler$_main: mov edx, DWORD PTR [esp+8] lea eax, DWORD PTR [edx-92] mov ecx, DWORD PTR [edx-96] xor ecx, eax call @__security_check_cookie@4 add eax, 12 ; 0000000cH mov ecx, DWORD PTR [edx-8] xor ecx, eax call @__security_check_cookie@4 mov eax, OFFSET __ehfuncinfo$_main jmp ___CxxFrameHandler3 text$x ENDS _main ENDP ENDGruß,
unsigned long
-
"Jede Anweisung kostet Zeit."
genau - und mir ist es total wichtig, dass die Ausgabe mind. 1Mrd Zeichen pro Sekunde schafft - sonst langweile ich mich ja beim Lesen...
-
unsigned long schrieb:
Ich denke mal, dass dieser Bände ´für sich spricht, wenn man als Faustregel folgende nimmt: "Jede Anweisung kostet Zeit."
Ich denke mal, dass dies Bände für sich spricht, dass du den Assembleroutput nicht gelesen oder verstanden hast.
Ein Grossteil davon kommt durch die Iostreams, über welche wir gar nicht gesprochen haben, und der andere Teil durch den
std::string.Edit: Über diesen Satz bin ich mir gar nicht mehr sicher:
"Diestd::transformFunktionen werden, wie man sehr schön sehen kann, völlig wegoptimiert."
Mein Wissen über Assembler ist auch nur begrenzt. Trotzdem gilt das nachfolgende immer noch.Ich sage es nochmals, man kann nur sinnvoll über Performance argumentieren, wenn man einen Profiler nimmt. Aber du scheinst dich lieber auf dein Halbwissen und deine Abschätzungen zu verlassen ...
Grüssli