Gcc-inline-assembly-was bedeutet "'asm' operand unmöglich Einschränkungen" bedeuten?
Ich habe diesen code unten in die Funktion:
void makeSystemCall(uint32_t num, uint32_t param1, uint32_t param2, uint32_t param3){
asm volatile (
"mov %0, %%eax\n\t"//Move num to eax
"mov %1, %%ebx\n\t"//Move param1 to ebx
"mov %2, %%ecx\n\t"//Move param2 to ecx
"mov %3, %%edx\n\t"//Move param3 to edx
"int $0x80"//Call interrupt. Data in eax, ebx, ecx and edx
: //No output params
: "r" (num), "r" (param1), "r" (param2), "r" (param3)//Input params
: "%eax", "%ebx", "%ecx", "%edx" //This handles register state pushing and popping?
);
}
Nun habe ich keine Idee warum das nicht funktioniert. Gcc sagt: "Fehler: 'asm' operand unmöglich Zwänge" habe ich nach gcc-inline-assembly-tutorials und ich dachte, dass dies wäre richtige Weg, um Parameter von c-code für die inline-Montage block.
Auch ich benutze gcc cross-compiler gebaut für 32-bit x86.
- Tun Sie das nicht. Verwenden Sie die verfügbaren syscalls(2) oder wenn Sie eine Dereferenzierung syscall(2). Sie würden VDSO so wäre schneller.
- Ich bin irgendwie der Entwicklung meiner EIGENEN os hier, wenn u don ' T mind...
- Dann versuchen Sie, Anschluss einige vorhandene libc zu. musl-libc hat einen sehr gut lesbaren Quellcode, die lehren, wie Sie es tun. Und verwenden
SYSENTER
Maschine aufrufen. - Aber ich will lernen, solche Sachen, also ich bin der Planung zu meinem eigenen zu machen. Auch meine Frage, nur fragt, warum diese nicht kompilieren.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mit der "r" - Einschränkung zwingt den compiler zu laden, die parameter in eine scratch-register vor der Verwendung, dass die scratch-register, die für eine Ihrer
mov
Anweisungen. Gibt es einfach nicht 4 scratch-Registern verfügbar.Verwenden Sie die "g" - Einschränkung statt. Dies ist mehr effiecient sowieso, da der compiler in der Lage sein, um Zugriff auf das argument direkt in Ihrem
mov
Anweisungen mit einem frame-pointer offsetted Speicher Zugriff auf das Ziel-register anstatt das zu tun, dass in einem scratch-register, dann bewegen Sie die scratch-register in das Ziel.r
zug
und es funktioniert wie ein Charme :D.