Friday, 24 March 2017

0x1001 In Binary Option

Ich bin nach diesem halb abgeschlossenen Tutorial zu einem einfachen OS zu entwickeln. Ein Schritt (auf Seite 50) besteht darin, einen einfachen Kernel mit ld - o kernel. bin - Ttext 0x1000 kernel. o zu kompilieren --oformat binary. Allerdings habe ich nicht wirklich verstehen, was ist die Option - Ttext zu tun. Um die Frage zu spezifischen machen, warum im folgenden Experiment sind md5s von kernel1000.bin amp kernel. bin gleich, kernel1001.bin amp kernel1009.bin gleich und kernel1007.bin amp kernel1017.bin gleich, während alle anderen Paare sind nicht gleich My Experiment habe ich versucht, verschiedene Kerne mit unterschiedlichen - Ttext wie die in der folgenden Makefile zu kompilieren: Und dann schaute ich ihre md5: Entwicklungsumgebung die - Ttext Option setzt den. text Teil Ihres Programms durch die angegebene Adresse. Zum Beispiel, wenn Sie kompilieren diese Assembler-Code: Und wird es mit dem objdump. Werden Sie sehen, dass es mit der Standardadresse verknüpft ist, etwas rund 0x0000000000400000 für das x8664: Und alle Adressen im Programm (zumindest im. text-Bereich) sind relativ zu dieser Adresse. Wenn Sie die Option - Ttext 1000 hinzufügen, sehen Sie: Das Programm wird verknüpft, um mit der Adresse 0x1000 zu beginnen, und alle Adressen (einschließlich jmp und usw.) sind relativ zu den 0x1000 zu. Dies ist wichtig für zwei Dinge. Kurz gesagt, wenn ein Betriebssystemkernel Ihr Programm lädt, lädt es Ihre ausführbare Datei im Elf-Format oder in anderem Binärformat und liest, wo der. text-Abschnitt beginnt. In unserem Fall können Sie Ihre kernel. bin wie Sie wollen verknüpfen, da es keine Lader als Betriebssystemkernel und Sie sind Master aller Speicherplatz. Also, wenn Sie Ihre kernel. bin verknüpfen, um bei 0x1000 zu starten. Sie werden wissen, wo der Code beginnt (natürlich nur, wenn es tatsächlich an dieser Stelle in den Speicher geladen wird) zu arbeiten, und wenn Sie die Basisadresse des Codes kennen, können Sie alle Adressen im Inneren, so etwas wie mylabelinsideprogram bekommen - beginnen. Beantwortet 6. Januar um 7: 20.inf Dateien können praktischer insofern als sie mehr Funktionen unterstützen unterstützen. Sie können beispielsweise verwendet werden, um dem Benutzer ein Menü und ein Deinstallationstool zu präsentieren. Version Unterschrift quotWindows NTquot Optionale Komponenten InstallMyOption UninstallMyOption InstallMyOption AddReg InstallMyOption. Procedure OptionDesc Option1 Tip Tip1 IconIndex 44 UninstallMyOption AddReg UninstallMyOption. Procedure OptionDesc Option2 Tip Tip2 IconIndex 45 InstallMyOption. Procedure HKCU, SoftwarequotMy SubKeyquot, quotREGSZA Entryquot ,, quotBla bla blaquot HKCU, SoftwarequotMy SubKeyquot, quotREGSZB Entryquot, 0, quotBli bli bliquot HKCU, SoftwarequotMy SubKeyquot, quotREGSZC Entryquot, 2, quotBlu blu bluquot HKCU, SoftwarequotMyS ubKeyquot, quotREGDWORD Entryquot, 0x1001,40,00,00,00 HKCU, SoftwarequotMy SubKeyquot, quotREGBINARYA Entryquot, 1,01, 00,01,00 HKCU, SoftwarequotMy SubKeyquot, quotREGBINARYB Entryquot, 3,02,00,02,00 Strings Option1 quotInstalling MyOptionquot Tip1 quotDetailed Beschreibung MyOptions installation. quot Option2 quotUninstalling MyOptionquot Tip2 quotDetailed Beschreibung MyOptions uninstallation. quot Version Signatur quotWindows NTquot HKCU , SoftwarequotMy SubKeyquot, quotREGSZA Entryquot ,, quotBla bla blaquot Erstellen eines REGSZ-Eintrags. Verwenden Sie Anführungszeichen für Schlüssel - oder Wertnamen mit Leerzeichen. Der Eintrag wird überschrieben, wenn er bereits existiert, type ist implizit. HKCU, SoftwarequotMy SubKeyquot, quotREGSZB Entryquot, 0, quotBli bli bliquot Erstellen eines REGSZ-Eintrags. Verwenden Sie Anführungszeichen für Schlüssel - oder Wertnamen mit Leerzeichen. Der Eintrag wird überschrieben, falls er bereits existiert, geben Sie 0 ein. HKCU, SoftwarequotMy SubKeyquot, quotREGSZC Entryquot, 2, quotBlu blu bluquot Erstellen eines REGSZ-Eintrags. Verwenden Sie Anführungszeichen für Schlüssel - oder Wertnamen mit Leerzeichen. Der Eintrag wird nicht aktualisiert, wenn er bereits vorhanden ist, geben Sie 2 ein. HKCU, SoftwarequotMy SubKeyquot, quotREGDWORD Entryquot, 0x1001, 40,00,00,00 Erstellen eines REGDWORD-Eintrags. Invertieren Sie die Reihenfolge der 4 Bytes. Geben Sie beispielsweise 40,00,00,00 an, um 0x00000040 zu erhalten. Der Eintrag wird überschrieben, falls er bereits existiert, geben Sie 0x1001 ein. Erstellen eines REGBINARY-Eintrags. Der Eintrag wird überschrieben, wenn er bereits existiert, geben Sie 1 ein. Erstellen eines REGBINARY-Eintrags. Der Eintrag wird nicht aktualisiert, wenn er bereits existiert, geben Sie 3 ein. Kapitel 3: Zahlen, Zeichen und Zeichenfolgen In diesem Kapitel werden die verschiedenen Datentypen definiert, die vom Compiler unterstützt werden. Da das Ziel der meisten Computersysteme darin besteht, Daten zu verarbeiten, ist es wichtig zu verstehen, wie Daten von der Software gespeichert und interpretiert werden. Wir definieren ein Literal als direkte Spezifikation von Zahl, Zeichen oder String. Z. B. 100 a Hello World sind Beispiele für ein Zahlliteral, ein Zeichenliteral und ein Stringliteral. Wir werden die Art und Weise der Daten auf dem Computer sowie die C-Syntax für die Erstellung der Literale zu diskutieren. Die Compiler von Imagecraft und Metrowerks erkennen drei Arten von Literalen (numerische Zeichenfolge). Zahlen können in drei Basen (dezimal, oktal und hexadezimal) geschrieben werden. Obwohl der Programmierer wählen kann, Zahlen in diesen drei Basen anzugeben, sobald er in den Computer geladen ist, werden alle Zahlen gespeichert und als nicht signierte oder signierte Binärdatei verarbeitet. Obwohl C nicht die binären Literale unterstützt, wenn Sie eine Binärzahl angeben möchten, sollten Sie keine Probleme mit dem oktalen oder hexadezimalen Format haben. Zahlen werden auf dem Computer in binärer Form gespeichert. Mit anderen Worten, die Information wird als eine Sequenz von 1rsquos und 0rsquos codiert. Auf den meisten Computern ist der Speicher in 8-Bit-Bytes organisiert. Das bedeutet, dass jedes im Speicher gespeicherte 8-Bit-Byte eine eigene Adresse hat. Präzision ist die Anzahl der verschiedenen oder unterschiedlichen Werte. Wir geben Präzision in Alternativen, Dezimalstellen, Bytes oder Binärbits. Alternativen sind definiert als die Gesamtzahl der Möglichkeiten. Beispielsweise kann ein 8-Bit-Zahlenschema 256 verschiedene Zahlen repräsentieren. Ein 8-Bit-Digital-Analog-Wandler kann 256 verschiedene Analogausgänge erzeugen. Ein Analog-Digital-Wandler (ADC) mit 8 Bit kann 256 verschiedene analoge Eingänge messen. Wir verwenden den Ausdruck 4frac12 Dezimalstellen, um etwa 20.000 Alternativen bedeuten und der Ausdruck 4frac34 Dezimalstellen bedeuten mehr als 20.000 Alternativen, aber weniger als 100.000 Alternativen bedeuten. Die Dezimalstelle frac12 bedeutet zweimal die Anzahl der Alternativen oder ein zusätzliches binäres Bit. Zum Beispiel hat ein Voltmeter mit einem Bereich von 0,00 bis 9,99 V eine Genauigkeit von drei Dezimalstellen. Die Operation x sei die größte ganze Zahl von x. Z. B. 2.1 ist abgerundet auf 3. Die Tabellen 3.1a und 3.1b veranschaulichen verschiedene Darstellungen der Genauigkeit. Tabelle 3-1b. Beziehungen zwischen verschiedenen Darstellungen der Präzision. Beobachtung: Eine gute Faustregel zu erinnern ist 2 10bulln ist etwa 10 3bulln. Für große Zahlen verwenden wir Abkürzungen, wie in der folgenden Tabelle gezeigt. Zum Beispiel bedeutet 16K 161024, was 16384 entspricht. Computeringenieure verwenden dieselben Symbole wie andere Wissenschaftler, aber mit leicht unterschiedlichen Werten. Computertechnik Wert 2 30 1,073,741,824 2 40 1,099,511,627,776 2 50 1,125,899,906,843,624 2 60 1,152,921,504,606,846,976 Tabelle 3-2. Allgemeine Abkürzungen für große Zahlen. Ein Byte enthält 8 Bits, wobei jedes Bit b7. B0 ist binär und hat den Wert 1 oder 0. Wir spezifizieren b7 als das signifikanteste Bit oder MSB und b0 als das niedrigstwertige Bit oder LSB. Wenn ein Byte verwendet wird, um eine vorzeichenlose Zahl darzustellen, dann ist der Wert der Zahl N 128bullb7 64bullb6 32bullb5 16bullb4 8bullb3 4bullb2 2bullb1 b0 Es gibt 256 verschiedene unsigned 8-Bit-Zahlen. Die kleinste vorzeichenlose 8-Bit-Zahl ist 0 und die größte ist 255. Beispielsweise ist 000010102 82 oder 10. Weitere Beispiele sind in der folgenden Tabelle aufgeführt. Tabelle 3-3. Beispielkonvertierungen von unsigned 8-bit binary zu hexadezimal und decimal. Die Basis eines Zahlensystems ist eine Teilmenge, aus der lineare Kombinationen der Basiselemente verwendet werden können, um den gesamten Satz zu konstruieren. Für das unsignierte 8-Bit-Zahlensystem ist die Basis eine Möglichkeit für uns, eine Dezimalzahl in Binär zu konvertieren, um die Basiselemente zu verwenden. Der Gesamtansatz besteht darin, mit dem größten Basiselement zu beginnen und auf das kleinste zu arbeiten. Einer nach dem anderen fragen wir uns, ob wir dieses Basis-Element brauchen, um unsere Zahl zu schaffen. Wenn wir dies tun, dann setzen wir das entsprechende Bit in unserem Binärergebnis und subtrahieren das Basiselement von unserer Zahl. Wenn wir es nicht brauchen, dann löschen wir das entsprechende Bit in unserem Binärergebnis. Wir werden durch den Algorithmus mit dem Beispiel der Umwandlung von 100 bis 8 Bit binär. Wir mit dem größten Basiselement (in diesem Fall 128) und fragen, ob wir es zu 100 machen müssen. Da unsere Zahl kleiner als 128 ist, brauchen wir es nicht, so dass Bit 7 Null ist. Wir gehen die nächste größte Basis Element, 64 und fragen, brauchen wir es. Wir brauchen 64, um unsere 100 zu erzeugen, also ist Bit 6 eins und subtrahiert 100 minus 64, um 36 zu erhalten. Als nächstes gehen wir das nächste Basiselement, 32 und fragen, brauchen wir es. Wieder brauchen wir 32, um unsere 36 zu erzeugen, also ist Bit 5 eins und wir subtrahieren 36 minus 32, um 4 zu erhalten. Weiterhin brauchen wir das Basiselement 4, aber nicht 16 8 2 oder 1, also sind die Bits 43210 00100. Setzen wir es zusammen bekommen wir 011001002 (was bedeutet, 64324). Beobachtung: Wenn das niedrigstwertige Binärbit Null ist, dann ist die Zahl gerade. Beobachtung: Sind die rechten n Bits (niedrigstwertig) null, so ist die Zahl durch 2 n teilbar. Tabelle 3-4. Beispielkonvertierung von Dezimal in unsigniertes 8-Bit-Binär bis Hexadezimal. Wir definieren eine unsigned 8-bit Zahl mit dem unsigned char Format. Wenn eine Zahl in einem unsigned char gespeichert wird, wird sie in einen vorzeichenlosen 8-Bit-Wert konvertiert. Zum Beispiel unsigned char Daten // 0 bis 255 unsigned char Funktion (unsigned char Eingang) datainput1 return data Wenn ein Byte verwendet wird, um eine signierte 2rsquos Komplement-Nummer darzustellen, dann ist der Wert der Zahl N -128bullb7 64bullb6 32bullb5 16bullb4 8bullb3 4bullb2 2bullb1 B0 Es gibt auch 256 verschiedene signierte 8-Bit-Zahlen. Die kleinste signierte 8-Bit-Zahl ist -128 und die größte ist 127. Beispielsweise ist 100000102 -1282 oder -126. Weitere Beispiele sind in der folgenden Tabelle dargestellt. Tabelle 3-5. Beispielkonvertierungen von signierter 8-Bit-Binärdatei bis Hexadezimal und Dezimal. Für das signierte 8-Bit-Zahlensystem ist die Grundlage Observation: Das signifikanteste Bit in einer 2rsquos-komplementierten Signatur wird das Vorzeichen angeben. Beachten Sie, dass das gleiche binäre Muster von 11111111 2 entweder 255 oder -1 darstellen könnte. Für den Softwareentwickler ist es sehr wichtig, das Zahlenformat zu verfolgen. Der Computer kann nicht bestimmen, ob die 8-Bit-Zahl signiert oder unsigniert ist. Sie werden als Programmierer feststellen, ob die Nummer durch die spezifischen Montageanweisungen signiert oder unsigniert ist, die Sie auswählen, um auf der Nummer zu arbeiten. Einige Operationen wie Addition, Subtraktion und Shift links (multipliziert mit 2) verwenden dieselbe Hardware (Anweisungen) für unsignierte und signierte Operationen. Auf der anderen Seite, multiplizieren, dividieren und nach rechts (dividieren durch 2) benötigen separate Hardware (Anweisung) für unsigned und signierte Operationen. Der Compiler wählt automatisch die richtige Implementierung. Es ist immer eine gute Programmierpraxis, ein klares Verständnis des Datentyps für jede Nummer, Variable, Parameter usw. zu haben. Für einige Operationen gibt es einen Unterschied zwischen den signierten und unsignierten Zahlen, während für andere es keine Rolle spielt. Signiert von unsigned Tabelle 3-7. Beispielkonvertierung von dezimal auf signierte 8-Bit-Binärdatei bis hexadezimal. Beobachtung: Um das Negative einer 2rsquos-Komplement-Signatur zu nehmen, müssen wir zuerst alle Bits komplementieren (flip), dann fügen Sie hinzu 1. Eine zweite Möglichkeit, negative Zahlen in Binär zu konvertieren, besteht darin, sie zuerst in unsignierte Binärdateien zu konvertieren, und dann ein 2rsquos-Komplement negieren . Zum Beispiel haben wir früher festgestellt, dass 100 011001002 ist. Das 2rsquos-Komplement negieren ist ein zweistufiger Prozess. Zuerst machen wir ein logisches Komplement (Flip alle Bits), um 100110112 zu erhalten. Dann fügen Sie eine zum Ergebnis, um 100111002 zu erhalten. Eine dritte Möglichkeit, negative Zahlen in binär zu konvertieren, besteht darin, zuerst die Zahl von 256 zu subtrahieren und dann das unsignierte Ergebnis in binär zu konvertieren Mit der Methode ohne Vorzeichen. Zum Beispiel, um -100 zu finden, subtrahieren wir 256 minus 100, um 156 zu erhalten. Dann konvertieren wir 156 in binäres Ergebnis in 100111002. Diese Methode funktioniert, weil in 8-Bit binäre Mathematik mit 256 auf Zahl nicht den Wert ändert. Z. B. 256-100 ist der gleiche Wert wie -100. Häufige Fehler: Ein Fehler tritt auf, wenn Sie signierte Vorgänge auf unsignierten Nummern verwenden oder unsignierte Vorgänge auf signierten Nummern verwenden. Wartungshinweis: Um die Übersichtlichkeit unserer Software zu verbessern, geben Sie bei der Definition oder dem Zugriff auf die Daten stets das Format Ihrer Daten (signiert gegen unsigned) an. Wir definieren eine signierte 8-Bit-Zahl mit dem Zeichenformat. Wenn eine Zahl in einem char gespeichert wird, wird sie in einen 8-Bit-signierten Wert konvertiert. Zum Beispiel char-Daten // -128 bis 127 char-Funktion (char input) datainput1 return data Ein Halbwort oder Doppelbyte enthält 16 Bits. Ein Wort enthält 32 Bits. Wobei jedes Bit b15. b0 ist binär und hat den Wert 1 oder 0. Wenn ein Wort verwendet wird, eine nicht signierte Zahl darzustellen, dann wird der Wert der Zahl N 32768bullb15 16384bullb14 8192bullb13 4096bullb12 2048bullb11 1024bullb10 512bullb9 256bullb8 128bullb7 64bullb6 32bullb5 16bullb4 8bullb3 4bullb2 2bullb1 b0 Es gibt 65.536 verschiedene Unsigned 16-bit Zahlen. Die kleinste vorzeichenlose 16-Bit-Zahl ist 0 und die größte ist 65535. Zum Beispiel ist 0010,0001,1000,01002 oder 0x2184 81922561284 oder 8580. Weitere Beispiele sind in der folgenden Tabelle gezeigt. Für die unsigned 16-Bit-Zahl-System ist die Basis Wenn ein Wort verwendet wird, ein signiertes 2rsquos darstellen Nummer ergänzen, dann wird der Wert der Zahl N -32768bullb15 16384bullb14 8192bullb13 4096bullb12 2048bullb11 1024bullb10 512bullb9 256bullb8 128bullb7 64bullb6 32bullb5 16bullb4 8bullb3 4bullb2 2bullb1 b0 Wir Definieren Sie eine vorzeichenlose 16-Bit-Zahl mit dem unsignierten Kurzformat. Wenn eine Zahl in einem unsigned short gespeichert wird, wird sie in 16-bit unsigned-Wert umgewandelt. Zum Beispiel unsigned short data // 0 bis 65535 unsigned short function (unsigned short input) datainput1 return data Es gibt auch 65.536 verschiedene signierte 16-Bit-Zahlen. Die kleinste signierte 16-Bit-Zahl ist -32768 und die größte ist 32767. Zum Beispiel ist 1101,0000,0000,0100 2 oder 0xD004 -327681638440964 oder -12284. Weitere Beispiele sind in der folgenden Tabelle dargestellt. Tabelle 3-9. Beispiel-Konvertierungen von signierten 16-Bit-Binär zu Hexadezimal und Dezimal. Für das signierte 16-Bit-Zahlensystem ist die Basis Wartungs-Tipp: Um die Qualität unserer Software zu verbessern, sollten wir bei der Definition oder dem Zugriff auf die Daten stets die Präzision unserer Daten angeben. Wir definieren eine signierte 16-Bit-Zahl mit dem Kurzformat. Wenn eine Zahl in einem kurzen gespeichert wird, wird sie in 16-Bit-signierten Wert konvertiert. Zum Beispiel kurze Daten // -23768 bis 32767 Kurzfunktion (Short Input) datainput1 Rückgabedaten Wenn wir 16-Bit-Daten im Speicher speichern, werden zwei Bytes benötigt. Da die Speichersysteme auf den meisten Computern Byte adressierbar sind (eine eindeutige Adresse für jedes Byte), gibt es zwei Möglichkeiten, die zwei Bytes, die die 16-Bit-Daten bilden, im Speicher zu speichern. Freescale-Mikrocomputer implementieren den Big-Endian-Ansatz, der den bedeutendsten Teil zuerst speichert. Die ARM Cortex M Prozessoren implementieren den Little-Endian-Ansatz, der zuerst den am wenigsten signifikanten Teil speichert. Einige ARM-Prozessoren sind biendian. Da sie so konfiguriert werden können, dass sie sowohl große als auch kleine Endiane effizient handhaben. Nehmen wir beispielsweise an, dass wir die 16-Bit-Nummer 1000 (0x03E8) an den Orten 0x50,0x51 speichern wollen, dann können wir auch den Big - oder Little-Endian-Ansatz verwenden, wenn 32-Bit-Zahlen in den Byte (8-Bit) Adressierbar. Wenn wir die 32-Bit-Zahl 0x12345678 an Standorten 0x50-0x53 dann in den beiden oben genannten Beispiele speichern möchten würden wir normalerweise nicht einzelne Bytes herausgreifen (zB 0x12), sondern die gesamte mehrere Byte-Daten als ein nondivisable Stück von Informationen erfassen . Wenn andererseits jedes Byte in einer Mehrfach-Byte-Datenstruktur einzeln adressierbar ist, dann speichern sowohl das Big - als auch das Little-Endian-Schema die Daten in der ersten bis letzten Sequenz. Zum Beispiel, wenn wir wollen die vier ASCII-Zeichen zu speichern lsquo6811rsquo denen 0x36383131 an Standorten ist 0x50-0x53, dann kommt der ASCII lsquo6rsquo0x36 zuerst in großen und kleinen Endian-Systemen. Der Begriff Big Endian kommt von Jonathan Swiftrsquos Satire Gulliverrsquos Reisen. In Swiftrsquos Buch, ein Big Endian bezieht sich auf eine Person, die ihr Ei auf dem großen Ende Risse. Die Lilliputianer betrachteten die Großen als Untergebene. Die großen Endianer kämpften einen langen und sinnlosen Krieg mit den Lilliputianern, die darauf bestanden, dass es nur richtig war, ein Ei am kleinen Ende zu brechen. Häufige Fehler: Ein Fehler tritt auf, wenn Daten in Big Endian von einem Computer gespeichert und in Little Endian-Format auf einem anderen gelesen werden. Eine boolesche Zahl hat zwei Zustände. Die beiden Werte können logisch wahr oder falsch sein. Die positive logische Darstellung definiert true als 1 oder high und false als 0 oder low. Wenn Sie einen Motor, eine Leuchte, ein Heizgerät oder eine Klimaanlage steuern, könnte das Boolean ein - oder ausschalten. In Kommunikationssystemen repräsentieren wir die Informationen als Folge von booleans: mark oder space. Für schwarze oder weiße Grafikdisplays verwenden wir booleans, um den Zustand jedes Pixels anzugeben. Die effizienteste Speicherung von Booleans auf einem Computer besteht darin, jedes Boolesche in ein Speicherbit abzubilden. Auf diese Weise konnten wir 8 Booleschen in jedes Byte packen. Wenn wir nur einen Booleschen Speicher im Speicher haben, aus der Bequemlichkeit reservieren wir ein ganzes Byte oder ein Wort dafür. Die meisten C-Compiler einschließlich Keil uVision definieren: False sind alle Nullen und True ein beliebiger Wert ungleich Null. Viele Programmierer addieren die folgenden Makros Definition TRUE 1 define FALSE 0 Dezimalzahlen werden als eine Folge von Dezimalstellen (0 bis 9) geschrieben. Vor der Zahl kann ein Plus - oder Minuszeichen oder ein L oder U folgen. Kleinbuchstaben l oder u könnten ebenfalls verwendet werden. Das Minuszeichen gibt der Zahl einen negativen Wert, ansonsten ist sie positiv. Das Pluszeichen ist optional für positive Werte. Bei unsignierten 16-Bit-Zahlen zwischen 32768 und 65535 sollte U folgen. Sie können ein L am Ende der Zahl platzieren, um zu signalisieren, dass es eine 32-Bit-Signaturnummer ist. Der Bereich einer Dezimalzahl hängt vom Datentyp ab, wie in der folgenden Tabelle gezeigt. Auf dem Keil uVision-Compiler kann der char-Datentyp je nach Compiler-Option signiert oder unsigned sein. Tabelle 3-11. Unterschiede zwischen einem 6811/6812 und einem ARM Cortex M Da die Cortex M Mikrocomputer keine direkte Unterstützung von 64-Bit-Nummern haben, sollte die Verwendung langer Datentypen minimiert werden. Auf der anderen Seite ergibt eine sorgfältige Beobachtung des erzeugten Codes die Tatsache, dass diese Compiler mit 32-Bit-Zahlen effizienter sind als mit 8-Bit - oder 16-Bit-Zahlen. Dezimalzahlen werden auf ihr Doppelkomplement oder unsigniertes binäres Äquivalent reduziert und als 8/16/32-Bit-Binärwerte gespeichert. Die Art und Weise, wie Dezimal-Literale behandelt werden, hängt vom Kontext ab. Zum Beispiel kurz I unsigned kurz J char K unsigned char L lang M void main (void) I97 / 16 Bit 0x0061 / J97 / 16 Bit 0x0061 / K97 / 8 Bit 0x61 / L97 / 8 Bit 0x61 / M97 / 32 Bit 0x00000061 / If Eine Folge von Ziffern beginnt mit einer führenden 0 (Null), wird sie als ein Oktalwert interpretiert. Es gibt nur acht Oktalziffern, 0 bis 7. Wie bei Dezimalzahlen werden Oktalzahlen in 8-Bit - oder 16-Bit-Wörtern in ihr Binäräquivalent umgewandelt. Der Bereich einer Oktalzahl hängt vom Datentyp ab, wie in der folgenden Tabelle gezeigt. 1) teilen Sie die binäre Zahl in rechtsbündige nibbles 2) wandeln jedes nibble in seine entsprechende hexadezimale Ziffer um. Um von hexadezimal in binär zu konvertieren, können wir: 1) jede hexadezimale Ziffer in ihr entsprechendes 4-Bit-Binärnibble umwandeln 2) die Nibble in eine Binärzahl zusammenfassen. Wenn eine Folge von Ziffern mit 0x oder 0X beginnt, wird sie als Hexadezimalwert genommen. In diesem Fall beziehen sich die Wortziffern auf hexadezimale Ziffern (0 bis F). Wie bei Dezimalzahlen werden Hexadezimalzahlen in 8-Bit-Bytes oder 16-Bit-Wörtern in ihr Binäräquivalent umgewandelt. Der Bereich einer Hexadezimalzahl hängt vom Datentyp ab, wie in der folgenden Tabelle gezeigt. Tabelle 3-15. Der Bereich der hexadezimalen Zahlen. Zeichenliterale bestehen aus einem oder zwei Zeichen, die von Apostrophen umgeben sind. Die Art und Weise, in der Zeichenliterale behandelt werden, hängt vom Kontext ab. Zum Beispiel kurz I vorzeichenlos kurz J char K unsigned char L lang M void main (void) Ia / 16 Bit 0x0061 / Ja / 16 Bit 0x0061 / Ka / 8 Bit 0x61 / La / 8 Bit 0x61 / Ma / 32 Bit 0x00000061 / Alle Standard-ASCII-Zeichen sind positiv, weil das Bit höherer Ordnung Null ist. In den meisten Fällen spielt es keine Rolle, ob wir Zeichenvariablen als signiert oder unsigned deklarieren. Auf der anderen Seite haben wir schon früher gesehen, dass der Compiler signierte und unsignierte Zahlen unterschiedlich behandelt. Wenn nicht eine Zeichenvariable speziell als unsigned deklariert wird, wird ihr höherwertiges Bit als Vorzeichenbit genommen. Daher sollten wir nicht erwarten, dass eine Zeichenvariable, die nicht vorzeichenlos deklariert wird, gleich demselben Zeichenliteral vergleichbar ist, wenn das Bit höherer Ordnung gesetzt ist. Mehr dazu siehe Kapitel 4 zu Variablen. Streng genommen erkennt C nicht Zeichenketten, aber er erkennt Arrays von Zeichen und bietet eine Möglichkeit, Zeichenarrays zu schreiben, die wir Strings nennen. Umgeben einer Zeichenfolge mit Anführungszeichen, z. B. Jon Setzt ein Array von Zeichen ein und erzeugt die Adresse des Arrays. Mit anderen Worten, an dem Punkt in einem Programm, wo es erscheint, erzeugt ein String-Literal die Adresse des angegebenen Arrays von Zeichenliteralen. Das Array selbst befindet sich an anderer Stelle. Metrowerks platziert Strings in den Textbereich. D. h. Werden die String-Literale als konstant betrachtet und im ROM eines eingebetteten Systems definiert. Dies ist sehr wichtig zu erinnern. Beachten Sie, dass sich dies von einem Zeichenliteral unterscheidet, das den Wert des Literals direkt erzeugt. Beachten Sie folgendes Beispiel: char pt extern void Foo (char p) void main (void) ptJon / Zeiger auf den String / Foo (pt) / übergibt den Zeiger, um sicherzustellen, dass dieses unterschiedliche Merkmal der C-Sprache nicht übersehen wird Nicht die Daten selbst / Beachten Sie, dass der Zeiger, pt. Wird im RAM zugewiesen, und die Zeichenfolge wird im ROM gespeichert. Die Zuweisungsanweisung ptJon kopiert die Adresse nicht die Daten. Zuerst wird die Adresse des Strings dem Zeichenzeiger pt zugewiesen (Keil uVision verwendet das 32-Bit-Register R0 für den ersten Parameter). Im Gegensatz zu anderen Sprachen ist der String nicht pt zugeordnet. Nur seine Adresse ist. Schließlich ist pt ein 32-Bit-Objekt und kann daher den String selbst nicht halten. Da Strings nur ein oder zwei Zeichen enthalten können, bieten sie eine alternative Möglichkeit, Zeichenliterale in Situationen zu schreiben, in denen die Adresse und nicht das Zeichen selbst benötigt wird. Es ist eine Konvention in C, um das Ende einer Zeichenfolge mit einem Nullzeichen zu identifizieren. Daher setzten C-Compiler automatisch Zeichenfolgen mit einem solchen Terminator fort. Somit bildet der String Jon ein Array aus vier Zeichen (J, o, n und Null) und erzeugt die Adresse des ersten Zeichens für die Verwendung durch das Programm. Beachten Sie, dass A sich von A unterscheidet, betrachten Sie folgendes Beispiel: char Buchstaben, pt void main (void) ptA / Zeiger auf den String / letterA / die Daten selbst (A ASCII 6541) / Manchmal ist es wünschenswert, nongraphische Zeichen in einem Code zu codieren Zeichen oder String-Literal. Dies kann durch eine Escape-Sequenz erfolgen - eine Folge von zwei oder mehr Zeichen, in der das erste (Escape) Zeichen die Bedeutung der folgenden Zeichen verändert. Wenn dies geschieht, erzeugt die gesamte Sequenz nur ein Zeichen. C verwendet den Backslash () für das Escape-Zeichen. Folgende Escape-Sequenzen werden vom Metrowerks-Compiler erkannt:


No comments:

Post a Comment