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:
*********