Hallo miteinander!
Von der Neugier angetrieben als ich das nette Schlüsselwort __asm gesehen habe, bin ich zum Entschluss gekommen, diese Assemblygeschichte mal etwas näher unter die Lupe zu nehmen.
Die ersten Erfolge waren auch sehr schnell da, habe ein Programm geschrieben, dass eine beliebig grosse Liste von Zahlen durchsucht und die grösste zwischenspeichert in einer c-Variable für die spätere Ausgabe mit printf.
Nun habe ich gelesen, dass auch RTL-Funktionen in __asm aufgerufen werden können. Daher habe ich mich entschlossen auch die Ausgabe gleich in __asm via call printf zu vollbringen. Leider bin ich auf ein paar Probleme gestossen.
Meine Theorie war es, zuerst den Wert der Zahl auf den Stack zu pushen und anschliessend die Adresse des Formatstrings, also folgendermassen:
Leider ist es nun so, dass das Programm jedesmal abstürzt und mir Visual C++ auf das erste pop zeigt mit dem Hinweis, dass das die nächste Anweisung wäre, die ausgeführt würde, hätte es keinen Fehler gegeben.
Folgendes sagt die Aufrufeliste:
Hat jemand von euch eine Ahnung, warum dies geschieht?
Gruss
Cromon
Von der Neugier angetrieben als ich das nette Schlüsselwort __asm gesehen habe, bin ich zum Entschluss gekommen, diese Assemblygeschichte mal etwas näher unter die Lupe zu nehmen.
Die ersten Erfolge waren auch sehr schnell da, habe ein Programm geschrieben, dass eine beliebig grosse Liste von Zahlen durchsucht und die grösste zwischenspeichert in einer c-Variable für die spätere Ausgabe mit printf.
Nun habe ich gelesen, dass auch RTL-Funktionen in __asm aufgerufen werden können. Daher habe ich mich entschlossen auch die Ausgabe gleich in __asm via call printf zu vollbringen. Leider bin ich auf ein paar Probleme gestossen.
Meine Theorie war es, zuerst den Wert der Zahl auf den Stack zu pushen und anschliessend die Adresse des Formatstrings, also folgendermassen:
Code:
char fstr[] = "Höchste Zahl: %u\n";
int res;
__asm{
mov res, ebx ; Die grösste Zahl in res speichern
push res
lea eax, fstr
push eax
call printf
pop ebx
pop ebx
}
Leider ist es nun so, dass das Programm jedesmal abstürzt und mir Visual C++ auf das erste pop zeigt mit dem Hinweis, dass das die nächste Anweisung wäre, die ausgeführt würde, hätte es keinen Fehler gegeben.
Folgendes sagt die Aufrufeliste:
ASM.exe!__imp__printf() Unknown
> ASM.exe!main() Zeile 55 C++
ASM.exe!__tmainCRTStartup() Zeile 586 + 0x19 Bytes C
ASM.exe!mainCRTStartup() Zeile 403 C
Hat jemand von euch eine Ahnung, warum dies geschieht?
Gruss
Cromon