Int 0x80 ist ein Systemaufruf, es ist auch 128 in Hexa. Warum Kernel Int 0x80 als Interrupt verwenden und wenn ich Int x deklariere, weiß er, es ist nur eine ganze Zahl mit dem Namen x und umgekehrt.Wie Kernel kennen den Unterschied zwischen "Int 0x80" und "Int x"
Antwort
Sie scheinen über den Unterschied zwischen C und Assemblersprache verwirrt zu sein. Beide sind Programmiersprachen, (heutzutage) akzeptieren beide die 0xNNNN
Schreibweise für Zahlen in hexadezimal, und es gibt normalerweise eine Möglichkeit, kleine Schnipsel der Assemblersprache in ein C-Programm einzubetten, aber sie sind verschiedene Sprachen. Das Schlüsselwort int
bedeutet in C etwas völlig anderes als in (x86) Assemblersprache.
Um einen C-Compiler, int
immer und nur bedeuten etwas Beteiligung eine ganze Zahl zu erklären, und es gibt keine Situation, wo Sie sofort int
mit Zahlenliteral folgen können. int 0x80
(oder int 128
oder int 23
oder etwas anderes von der Art) in C. immer ein Syntaxfehler ist
Zu einem x86-Assembler, int
immer und nur bedeuten Maschinencode für den Interrupt-Befehl zu erzeugen, und ein einzelnes numerisches Literal muss sofort folgen. int x;
ist immer ein Syntaxfehler in der x86-Assemblersprache.
Offensichtliche Folgefrage: Wenn ein C-Compiler int
nicht als INTerrupt-Anweisung erkennt, wie macht ein C-Programm (kompiliert für x86) Systemaufrufe? Es gibt vier ergänzende Antworten auf diese Frage:
Meistens führen Sie in einem C-Programm keine Systemaufrufe direkt aus. Stattdessen rufen Sie Funktionen in der C-Bibliothek auf, die das für Sie tun. Wie der C-Compiler weiß, unterscheidet sich
open
(zum Beispiel) bei der Verarbeitung Ihres Programms nicht von anderen externen Funktionen. So ist es nicht brauchen, um eineint
Anweisung zu generieren. Es tut einfachcall open
.Aber die C-Bibliothek ist nur mehr C, die jemand anderes für Sie geschrieben hat, oder? Wenn Sie jedoch die Implementierung von
open
zerlegen, werden Sie tatsächlich eineint
-Anweisung (oder vielleichtsyscall
odersysenter
statt) sehen. Wie haben die Leute, die die C-Bibliothek geschrieben haben, das getan? Sie schrieben, dass die Funktion in Assembler-Sprache, nicht in C. Oder sie verwendet diese Technik für Auszüge Assemblersprache in einem C-Programm einbetten, das bringt uns zu ...Wie funktioniert dass Arbeit? Bedeutet das nicht, dass der C-Compiler
int
als eine Assembler-Mnemonic manchmal verstehen muss? Nicht unbedingt. Lassen Sie uns montage diese an der GCC-Syntax aussehen könnte eine Implementierung vonopen
für x86/32/Linux zum Einfügen sein:int open(const char *path, int flags, mode_t mode) { int ret; asm ("int 0x80" : "=a" (ret) : "0" (SYS_open), "d" (path), "c" (flags), "D" (mode)); if (ret >= 0) return ret; return __set_errno(ret); }
Sie brauchen nicht den Großteil, das zu verstehen: das Wichtigste ist für Zwecke dieser Frage ist, ja, es sagt
int 0x80
, aber es sagt es in einem String Literal.Der Compiler kopiert den Inhalt dieses String-Literals wörtlich in die erzeugte Assembler-Datei, die er dann dem Assembler zuführt. Es muss nicht wissen, was es bedeutet. Das ist die Aufgabe des Monteurs.Allgemein gibt es viele Wörter, die in C eine Sache und in der Assemblersprache eine ganz andere Sache bedeuten. Ein C-Compiler produziert Assemblersprache, so dass es beide Bedeutungen dieser Wörter "wissen" muss, richtig? Es tut es, aber es verwirrt sie nicht, weil sie immer in getrennten Kontexten verwendet werden. "add" ist eine Assembly-Mnemonic, die der C-Compiler zu verwenden weiß, bedeutet jedoch nicht, dass es Probleme bei der Benennung einer Variablen "add" in einem C-Programm gibt, selbst wenn die "add" -Anweisung in diesem Programm verwendet wird.
Sie über den Unterschied zwischen C verwirrt sind (in der 'int x;' deklariert eine ganzzahlige Variable mit dem Namen 'X' und '' int ist ein Syntaxfehler) und x86-Assembler (in denen 'int 'erzeugt Maschinencode für die INTerrupt-Anweisung und' int x; 'ist ein Syntaxfehler)? Sonst verstehe ich nicht, was du zu fragen versuchst. –
zwol
Lassen Sie mich versuchen, etwas klarer zu sein. Wie der Compiler (in c) den Unterschied zwischen der Definition einer Variablen x als Integer wie in einem Code "int x" und dem System_call-Interrupt "int 0x80" kennt? – Hooch