c mit inline assembler

Schnacki

Mitglied
Hallo, ich habe mal eine Frage zu meinen C-Quelltext.
Wenn ich ihn ausführe funktioniert er zwar, aber gibt immer ein "Segmentation fault aus".

Code:
int len;
char msg;
char message[100];
void writeChar(char c) {
	msg = c;
	asm(
	"movl $4,%eax\n"
	"movl $1,%ebx\n"
	"movl $msg,%ecx\n"
	"movl $1,%edx\n"
	"int $0x80\n"); 
}
void writeString(char* feld) {
	while(*feld!=-1) {
		writeChar(*feld);
		feld++;
	}
}
void clear() {
	writeString("\033[2J");
}
char *readString() {
	asm(
	"movl $3,%eax\n"
	"movl $0,%ebx\n"
	"movl $message,%ecx\n"
	"movl $100,%edx\n"
	"int $0x80\n"); 
	return message;
}

int main() {
	writeString(readString());
}
Wisst ihr woran das liegt?
 
Hi.

Wie kommst du darauf, dass da -1 im Buffer steht? Der read syscall gibt in %eax die Anzahl der gelesenen Zeichen zurück.

Gruß
 
Aso, ok.
Da habe ich '\0' eingesetzt und jetzt gehts.
Ist aber immer noch nicht richtig. sys_read terminiert den Stringbuffer nicht - d.h. in dem Fall hast du nur Glück, das der Buffer mit 0 initialisiert wurde. Wenn du jetzt 100 Zeichen oder mehr eingibst, bekommst du wieder einen SegFault.

Richtig wäre den Rückgabewert des syscalls auszulesen und entsprechend soviele Zeichen wieder auszugeben.

Gruß
 
Hi, ich habe nur noch mal ganz schnell eine Frage:

Diesmal unter Windows...

Erste mal der Codeausschnitt:
Code:
char ch;
char getKey() {
	__asm("mov 0x00,%ah \n");
  	__asm("int $0x16 \n");	
	__asm("movb %%al,%0;"::"r"(ch));
	printf("-----\n%c\n-----",ch);
	return ch;
}
Der Quellcode wird kompiliert und auch ausgeführt, aber irgendwie speichert die Eingabe nicht in die ch Char variable ab.
Wisst ihr wie ich das dafür ändern muss?
 
Zurück