Baugruppe - Variablen

NASM bietet verschiedene define directiveszum Reservieren von Speicherplatz für Variablen. Die Anweisung define Assembler wird für die Zuweisung von Speicherplatz verwendet. Es kann verwendet werden, um ein oder mehrere Bytes zu reservieren und zu initialisieren.

Zuweisen von Speicherplatz für initialisierte Daten

Die Syntax für die Speicherzuweisungsanweisung für initialisierte Daten lautet -

[variable-name]    define-directive    initial-value   [,initial-value]...

Wobei Variablenname die Kennung für jeden Speicherplatz ist. Der Assembler ordnet jedem im Datensegment definierten Variablennamen einen Versatzwert zu.

Es gibt fünf Grundformen der Definitionsrichtlinie:

Richtlinie Zweck Lagerraum
DB Byte definieren weist 1 Byte zu
DW Wort definieren weist 2 Bytes zu
DD Doppelwort definieren weist 4 Bytes zu
DQ Quadword definieren weist 8 Bytes zu
DT Definieren Sie zehn Bytes weist 10 Bytes zu

Im Folgenden finden Sie einige Beispiele für die Verwendung von definierten Anweisungen:

choice		DB	'y'
number		DW	12345
neg_number	DW	-12345
big_number	DQ	123456789
real_number1	DD	1.234
real_number2	DQ	123.456

Bitte beachten Sie, dass -

  • Jedes Zeichenbyte wird als ASCII-Wert hexadezimal gespeichert.

  • Jeder Dezimalwert wird automatisch in sein 16-Bit-Binäräquivalent konvertiert und als Hexadezimalzahl gespeichert.

  • Der Prozessor verwendet die Little-Endian-Bytereihenfolge.

  • Negative Zahlen werden in die Zweierkomplementdarstellung umgewandelt.

  • Kurze und lange Gleitkommazahlen werden mit 32 bzw. 64 Bit dargestellt.

Das folgende Programm zeigt die Verwendung der define-Direktive -

section .text
   global _start          ;must be declared for linker (gcc)
	
_start:                   ;tell linker entry point
   mov	edx,1		  ;message length
   mov	ecx,choice        ;message to write
   mov	ebx,1		  ;file descriptor (stdout)
   mov	eax,4		  ;system call number (sys_write)
   int	0x80		  ;call kernel

   mov	eax,1		  ;system call number (sys_exit)
   int	0x80		  ;call kernel

section .data
choice DB 'y'

Wenn der obige Code kompiliert und ausgeführt wird, ergibt sich das folgende Ergebnis:

y

Zuweisen von Speicherplatz für nicht initialisierte Daten

Die Reserveanweisungen werden verwendet, um Speicherplatz für nicht initialisierte Daten zu reservieren. Die Reserveanweisungen verwenden einen einzelnen Operanden, der die Anzahl der zu reservierenden Speichereinheiten angibt. Jede Definitionsrichtlinie hat eine zugehörige Reserverichtlinie.

Es gibt fünf Grundformen der Reserverichtlinie:

Richtlinie Zweck
RESB Reserviere ein Byte
RESW Reserviere ein Wort
RESD Reserviere ein Doppelwort
RESQ Reserviere ein Quadword
SICH AUSRUHEN Reservieren Sie zehn Bytes

Mehrere Definitionen

Sie können mehrere Datendefinitionsanweisungen in einem Programm haben. Zum Beispiel -

choice	  DB 	'Y' 		 ;ASCII of y = 79H
number1	  DW 	12345 	 ;12345D = 3039H
number2    DD  12345679  ;123456789D = 75BCD15H

Der Assembler reserviert zusammenhängenden Speicher für mehrere Variablendefinitionen.

Mehrere Initialisierungen

Die TIMES-Direktive ermöglicht mehrere Initialisierungen auf denselben Wert. Beispielsweise kann ein Array mit dem Namen markierungen der Größe 9 mit der folgenden Anweisung definiert und auf Null initialisiert werden:

marks  TIMES  9  DW  0

Die TIMES-Direktive ist nützlich beim Definieren von Arrays und Tabellen. Das folgende Programm zeigt 9 Sternchen auf dem Bildschirm an -

section	.text
   global _start        ;must be declared for linker (ld)
	
_start:                 ;tell linker entry point
   mov	edx,9		;message length
   mov	ecx, stars	;message to write
   mov	ebx,1		;file descriptor (stdout)
   mov	eax,4		;system call number (sys_write)
   int	0x80		;call kernel

   mov	eax,1		;system call number (sys_exit)
   int	0x80		;call kernel

section	.data
stars   times 9 db '*'

Wenn der obige Code kompiliert und ausgeführt wird, ergibt sich das folgende Ergebnis:

*********