Ich bin neu in Assembly in C, und ich weiß nicht, wie Sie diesen Fehler beheben. Ich mache eine Funktion, die bedeutet, eine Datei zu schreiben. Was ich habe ist:Warum asm unmögliche Einschränkungen haben, wenn ich Register registriere?
ssize_t mywrite(int fd, const void *buf, size_t count) {
// return write(fd, buf, count);
ssize_t var;
__asm__("movl $4,%%eax\n\t" // Write
"movl %1,%%ebx\n\t"
"movl %2,%%ecx\n\t"
"movl %3,%%edx\n\t"
"int $0x80\n\t" // System call
"movl %%eax,%0"
:"=r"(var)
:"r"(fd),"r"(buf),"r"(count)
:"%eax","%ebx","%ecx","%edx"
);
return var;
}
Meine asm soll das gleiche wie schreiben (fd, buf, count); Wenn ich es kompiliere, bekomme ich "'asm' Operand hat unmögliche Einschränkungen". Wenn Sie jedoch die Variablen nicht benennen und die Werte direkt vom Stapel abrufen, erhalte ich keinen Fehler. Hier ist der Code
__asm__("movl $4,%%eax\n\t"
"movl 8(%%ebp),%%ebx\n\t"
"movl 12(%%ebp),%%ecx\n\t"
"movl 16(%%ebp),%%edx\n\t"
"int $0x80\n\t"
"movl %%eax,%0"
:"=r"(var)
:
:"%eax","%ebx","%ecx","%edx"
);
ich den zweiten Code verwenden könnte, OFC, aber ich brauche es mit Optimierung kompiliert 2. Dann% ebp nicht zeigen, wo ich brauche es. Ich habe versucht, "a", "b", "c" und "d" anstelle von "r" zu verwenden, aber keinen Erfolg. Jeder könnte helfen? Danke: D
Komponieren Sie zufällig im 64-Bit-Modus? – fuz