Frage

Ich lese das Lehrbuch mit dem Titel „Introduction to 80x86 Assembler Language and Computer Architecture“ von Richard C.Detmer und auf Seite 59 geht es um die BYTE Direktive in Assemblersprache erstellen und diese für Zeichen und Zeichenfolgen verwenden.Hier ist der Text:

„Zusätzlich zu numerischen Operanden ist die BYTE Die Direktive erlaubt Zeichenoperanden mit einem einzelnen Zeichen oder Zeichenfolgeoperanden mit vielen Zeichen.Zur Bezeichnung von Zeichen oder zur Begrenzung von Zeichenfolgen können entweder Apostrophe (') oder Anführungszeichen (") verwendet werden.Sie müssen paarweise sein;Sie können links kein Apostroph und rechts kein Anführungszeichen setzen.Eine durch Apostrophe getrennte Zeichenfolge kann Anführungszeichen enthalten, und eine durch Anführungszeichen getrennte Zeichenfolge kann Apostrophe enthalten, sodass Zeichenfolgen mit diesen Sonderzeichen möglich sind.

Das ist sehr verständlich, aber meine Neugier ist BYTE Direktive, weil ich dachte, sie könnte nur ein einzelnes Byte, also acht Bits, enthalten.Ich habe einen Test gemacht und wenn ich es gesagt hätte

string BYTE "HelloWorld"

Es würde natürlich kompiliert werden, aber wenn Sie den Hex-Wert überprüfen, werden Sie feststellen, dass es sich nicht nur um ein einzelnes Byte, sondern um mehrere Bytes handelt.Wenn wir uns eine ASCII-Tabelle ansehen, wissen wir bereits, dass ein einzelnes Zeichen ein Byte ist.Wie können wir also Strings haben?Ich habe versucht, dies mit Zahlen anzuwenden.Wir kennen die Reichweite für die BYTE Die Direktive reicht von -128 bis 255.Ich habe diesen Code ausprobiert:

number BYTE 9987

Als ich versuchte zu kompilieren und auszuführen, bekam ich eine Fehlermeldung, weil 9987 natürlich größer als ein Byte war.Aber warum sind Saiten dagegen immun?Warum kann das BYTE Die Direktive enthält mehr als ein Byte im Kontext von Zeichenfolgen, macht aber nicht dasselbe mit Zahlen?

Ich könnte mir vorstellen, dass beim Kompilieren und Ausführen der ersten von mir aufgelisteten Codeanweisung derselbe Fehler wie bei der zweiten auftritt.Warum wird hier gegen die „Regel“ verstoßen?

-Dan

War es hilfreich?

Lösung

Beachten Sie, dass es keine einheitliche Assembler-Syntax gibt; verschiedene Programme können unterschiedliche Syntax verwenden.Sie sollten das Handbuch Ihres Monteurs konsultieren.

Allerdings ist die String-Konstante normalerweise nur eine Kurzschreibweise für jedes einzelne Zeichen und die BYTE Mit der Direktive können mehrere Elemente gleichzeitig definiert werden.

Also zum Beispiel BYTE 1, 2, 3, 4 ist gültig und definiert 4 Bytes und Ihr string BYTE "HelloWorld" ist äquivalent zu string BYTE 'H', 'e', 'l', 'l', 'o', 'W', 'o', 'r', 'l', 'd' und definiert 10 Bytes.Der Grund dafür, dass Sie keine Fehlermeldung erhalten, liegt darin, dass jedes Zeichen für sich in ein Byte passt.

Einige Assembler erlauben nicht einmal String-Literale BYTE oder gleichwertige Direktiven, sie haben beispielsweise spezielle Direktiven für Strings .string oder .ascii.

Andere Tipps

Der BYTE Die Direktive weist den Assembler an, einen Speicherblock zu reservieren und sich dessen Länge in Bytes zu merken.Die Länge wird durch die Anzahl der Bytes im Initialisierer bestimmt, bei denen es sich um Zahlen zwischen 0 und 255 Dezimalzahlen oder um Zeichen in einfachen Anführungszeichen handeln kann.Zeichenfolgen kommen in Programmiersprachen häufig vor und werden normalerweise als Arrays von Zeichen in aufeinanderfolgenden Bytes im Speicher betrachtet.Als Komfort für den Programmierer ermöglicht Ihnen der Assembler, eine Bytefolge zu reservieren, die mit einer Zeichenfolge initialisiert wird, indem Sie die Zeichenfolge in einfachen oder doppelten Anführungszeichen angeben.Diese sind gleichwertig

string1 BYTE 'H', 'e', 'l', 'l', 'o'

oder

string1 BYTE 'Hello'

Einige Assembler verfügen hierfür über unterschiedliche Anweisungen, beispielsweise verfügt die Oracle Solaris x86-Assemblersprache über eine

  • .byte Direktive, die nur Bytes benötigt
  • .ascii Direktive, die eine Zeichenfolge akzeptiert, die nicht mit NUL terminiert wird
  • .string Direktive, die eine Zeichenfolge akzeptiert, die will NUL-terminiert sein
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top