Wie lautet die Syntax zum Definieren einer String-Konstante in Assembly?

8

Ich lerne Assemblierung Ich sehe zwei Beispiele für die Definition einer Zeichenkette:

msg db 'Hallo, Welt!', 0xa

  • Was bedeutet die 0xa hier?

Nachricht DB 'Ich liebe es!', 0

  • warum haben wir hier eine 0?
  • ist es ein abschließendes Nullzeichen?
  • warum haben wir 0xa das obige Beispiel aber 0 hier? (Scheint nicht, dass sie sich auf die Stringlänge beziehen)

Wenn die obigen Beispiele zwei Möglichkeiten zum Definieren einer Assemblierungszeichenfolge sind, wie könnte das Programm sie unterscheiden?

Danke für jede Hilfe:)

    
DuoD 22.10.2013, 19:33
quelle

3 Antworten

6

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.

    
johnfound 22.10.2013, 19:54
quelle
1

0 ist eine abschließende Null, ja. 0xa ist ein Zeilenumbruch. Sie definieren nicht die gleiche Zeichenkette, also würden Sie sie so unterscheiden.

    
Ry︁ 22.10.2013 19:38
quelle
1

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.

    
Axel Kemper 22.10.2013 19:40
quelle

Tags und Links