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.
- 1. Unterschied zwischen int * x [10] und int (* x) [10]
- 2. Unterschied zwischen int * i und int * ich
- 3. Unterschied zwischen void (int) und void (*) (int)
- 4. C: Unterschied zwischen (int) x und Boden (x)?
- 5. was ist der Unterschied zwischen 'neuen()' int und 'int * p'
- 6. Typen und Generika: Unterschied zwischen `[X <: Int]` und `{type X <: Int}`
- 7. Was ist der Unterschied zwischen int x = 1 und int x (1) in C++?
- 8. Gibt es einen Unterschied zwischen int x {}; und int x = 0;
- 9. Was ist der Unterschied zwischen `extern int (x) []` und `extern int x []` in C?
- 10. praktische Unterschied zwischen int und char
- 11. Was ist der Unterschied zwischen 'int?' und 'int' in C#?
- 12. Was ist der Unterschied zwischen int [] [] und int [,]?
- 13. Gibt es einen Unterschied zwischen int (floatvar) und (int) floatvar?
- 14. Was ist der Unterschied zwischen int ++ und ++ int?
- 15. Was ist der Unterschied zwischen "int * a = new int" und "int * a = new int()"?
- 16. Unterschied zwischen void main und int main?
- 17. Unterschied zwischen Long und Int in C#?
- 18. PHP Unterschied zwischen Int und Integer
- 19. Unterschied zwischen int * array [60] und int * array = new int (60);
- 20. Unterschied zwischen diesen Ausdrücken: int * a = 0; int * a = 10;
- 21. Unterschiede zwischen Standard (int) vs int = 0
- 22. Int Divide Int Int und Rück
- 23. Unterschied zwischen char und int bei der Deklaration von Zeichen
- 24. Der Unterschied und die Konvertierung zwischen Seq [Int] und List [Int] in Scala?
- 25. Unterschied zwischen Python2 und Python3 - int() und Eingabe()
- 26. Vergleich zwischen Zeiger und integer ('int *' und 'int')
- 27. Unterschied zwischen ToArray() und ToArray <int>();
- 28. Was ist der Unterschied zwischen int * pn = & n und int pn = & n in C Sprache
- 29. Bitmap.createBitmap (Bitmap Quelle, int x, int y, int width, int height) zurückgeben falsch Bitmap
- 30. Der Unterschied zwischen np.random.seed (int) und np.random.seed (array_like)?
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