Char vergleichen

Ich bin mir grad nicht so sicher, ob der Prototyp für print() richtig ist:

C:
extern void print();

Möglicherweise optimiert der GCC da was weg. Mach doch mal ein

C:
extern void print(char);

draus.
 
Das weiß ich leider auch nicht so genau. Ich habe das ganze nur disassembliert und gesehen, dass bei asm(".code16"); das o32 automatisch eingefügt wird. Das habe ich so manuell gemacht.

Hi,
ich habe das nächste Problem mit GCC.
C:
//...
testfunc('a');
//...
void testfunc(char test) {
	print(test);
	print(test);
	print(test);
}
Gibt das a nur einmal aus. Das ist bei jeder Funktion so. Die Paramter kommen nur beim ersten Aufruf an. Eine Puffervariable, also char testvar=test; bringt auch nichts. Die Funktion print() wird aber definitiv dreimal aufgerufen. Wer sich den restlichen Code etc. mal anschauen möchte, kann ja hier vorbeischauen: http://www.tutorials.de/c-c/385923-char-vergleichen.html
Was ist nur mit diesem GCC los?!
Danke im Voraus.

EDIT:
Jedenfalls denke ich kaum, dass an meinem Code funktioniert, da dieses Problem nur in einer Funktion und nicht einfach so auftritt. Ändere ich die Funktion print() so, dass immer der selbe Buchstabe angezeigt wird gibt es kein Problem und wenn ich print() einfach so dreimal im Code aufrufe, wird auch dreimal der übergebene Buchstabe angezeigt.
 
Zuletzt bearbeitet von einem Moderator:
Könnte es sein, dass das weg optimiert wird? Wäre aber sehr eigenartig. Kannst du die Optimierungsfunktion an aus schalten? Probiere mal printf("a");
MfG
 
Hi.

Das o32 ist nur eine Meta-Anweisung für den Assembler, dass die darauffolgende Instruktion im 32 Bit Modus assembliert werden soll. üäpöol hat sich schlecht ausgedrückt, er hat o32 nicht statt ret genommen sondern o32 vor das ret gesetzt.

Wenn der GCC einen 32bit CALL macht (und EIP pusht), dann sollte man natürlich in der Funktion auch einen 32bit RET durchführen.

Wenn du allerdings im .code16 Modus (ohne gcc) kompilierst, dann erzeugt der Assembler auch nur ein 16bit CALL.

@üäpöol: Warum machst du denn ein neues Thema auf? Anscheinend funktioniert es ja doch nicht so wirklich... Und am GCC liegt es höchstwahrscheinlich nicht, sondern an deinem Code.

Gruß
 
Hi,
ich wollte ein neues Thema aufmachen, weil das imho wirklich nichts mehr mit Chars vergleichen zu tun hat, aber vielleicht ist sheel ja so nett und löscht das Thema wieder, wenn er deiner Meinung ist. Wie auch immer. Jedenfalls denke ich kaum, dass an meinem Code funktioniert, da dieses Problem nur in einer Funktion und nicht einfach so auftritt. Ändere ich die Funktion print() so, dass immer der selbe Buchstabe angezeigt wird gibt es kein Problem und wenn ich print() einfach so dreimal im Code aufrufe, wird auch dreimal der übergebene Buchstabe angezeigt. Ich weiß nicht, ob das hilft.

edit:
Hm. Das hilft leider nichts. Es wird einmal ein leeres (\0) Zeichen ausgegeben.
 
Danke, sheel. Ich habe die Funktion print() (und andere, die mit Paramtern arbeitern) in verschiedenen Situationen überprüft, aber der Paramter der Funktion testfunc() kommt jedesmal nur einmal an. Komisch, dass auch eine Puffervariable nichts bringt. Hat jemand eine Idee?
 
Hi.

Wie sieht denn dein Code momentan genau aus? Hast du code16 oder code16gcc verwendet?

Wie stellst du denn fest, ob die Funktion 3 Mal aufgerufen wird? Hast du dir das im Debugger angesehen?

Gruß
 
Zurück