Ich lerne Assemblierung Ich sehe zwei Beispiele für die Definition einer Zeichenkette:
msg db 'Hallo, Welt!', 0xa
Nachricht DB 'Ich liebe es!', 0
Wenn die obigen Beispiele zwei Möglichkeiten zum Definieren einer Assemblierungszeichenfolge sind, wie könnte das Programm sie unterscheiden?
Danke für jede Hilfe:)
Die verschiedenen Assembler haben unterschiedliche Syntax, aber im Fall der db
-Direktive sind sie ziemlich konsistent.
db
ist eine Assemblierungsanweisung, die Bytes mit dem angegebenen Wert an der Stelle definiert, an der sich die Anweisung in der Quelle befindet. Optional kann ein Label der Direktive zugewiesen werden.
Die übliche Syntax lautet:
%Vor%wobei n1..nk einige bytegroße Zahlen sind (von 0..0xff) oder einige String-Konstanten.
Solange der ASCII-String aus Bytes besteht, werden diese Bytes durch die Direktive einfach im Speicher abgelegt, genau wie die anderen Zahlen in der Direktive.
Beispiel:
%Vor%teilt 4 Bytes zu und füllt sie mit den Zahlen 1, 2, 3 und 4
%Vor%wird kompiliert zu:
%Vor%Das Zeichen mit dem ASCII-Code 0Ah (0xa) ist das Zeichen LF (Zeilenvorschub), das in Linux als neuer Zeilenbefehl für die Konsole verwendet wird.
Das Zeichen mit dem ASCII-Code 00h (0) ist das NULL-Zeichen, das in den C-ähnlichen Sprachen als Zeichenende verwendet wird. (und wahrscheinlich in den Betriebssystem-API-Aufrufen, weil die meisten Betriebssysteme in C geschrieben sind)
Anhang 1: Es gibt mehrere andere Assembly-Direktiven, die der DB ähnlich sind, da sie einige Daten im Speicher definieren, aber mit anderer Größe. Am gebräuchlichsten sind DW (definiere Wort), DD (definiere Doppelwort) und DQ (definiere vierfaches Wort) für 16, 32 und 64 Bit Daten. Ihre Syntax akzeptiert jedoch nur Zahlen und keine Zeichenfolgen.
0xa
steht für den hexadezimalen Wert "A"
, der 10
in Dezimal ist. Das Linefeed-Steuerzeichen hat ASCII Code 10 (Return hat D hexadezimal oder 13 dezimal).
Zeichenfolgen werden normalerweise durch ein Zeichen nul
beendet, um ihr Ende anzuzeigen.