Zespół - zmienne
NASM zapewnia różne define directivesdo rezerwowania miejsca do przechowywania zmiennych. Dyrektywa define assembler służy do alokacji przestrzeni dyskowej. Może służyć do rezerwowania, a także inicjowania jednego lub więcej bajtów.
Przydzielanie miejsca do magazynowania dla zainicjowanych danych
Składnia instrukcji przydziału pamięci dla zainicjowanych danych jest następująca:
[variable-name] define-directive initial-value [,initial-value]...
Gdzie nazwa-zmiennej to identyfikator każdej przestrzeni dyskowej. Asembler przypisuje wartość przesunięcia dla każdej nazwy zmiennej zdefiniowanej w segmencie danych.
Istnieje pięć podstawowych form zdefiniowanej dyrektywy -
Dyrektywa | Cel, powód | Przestrzeń magazynowa |
---|---|---|
DB | Zdefiniuj bajt | przydziela 1 bajt |
DW | Zdefiniuj słowo | przydziela 2 bajty |
DD | Zdefiniuj Doubleword | przydziela 4 bajty |
DQ | Zdefiniuj Quadword | przydziela 8 bajtów |
DT | Zdefiniuj dziesięć bajtów | przydziela 10 bajtów |
Poniżej znajduje się kilka przykładów użycia dyrektyw define -
choice DB 'y'
number DW 12345
neg_number DW -12345
big_number DQ 123456789
real_number1 DD 1.234
real_number2 DQ 123.456
Należy pamiętać, że -
Każdy bajt znaku jest przechowywany jako wartość ASCII w postaci szesnastkowej.
Każda wartość dziesiętna jest automatycznie konwertowana na jej 16-bitowy odpowiednik binarny i zapisywana jako liczba szesnastkowa.
Procesor używa kolejności bajtów little-endian.
Liczby ujemne są konwertowane na reprezentację dopełnienia do 2.
Krótkie i długie liczby zmiennoprzecinkowe są reprezentowane odpowiednio za pomocą 32 lub 64 bitów.
Poniższy program pokazuje użycie dyrektywy define -
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'
Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -
y
Przydzielanie miejsca na dane niezainicjowane
Dyrektywy rezerwy służą do rezerwowania miejsca na niezainicjowane dane. Dyrektywy rezerwowe przyjmują jeden operand, który określa liczbę jednostek przestrzeni do zarezerwowania. Każda dyrektywa Definicja ma powiązaną dyrektywę rezerwową.
Istnieje pięć podstawowych form dyrektywy w sprawie rezerw -
Dyrektywa | Cel, powód |
---|---|
RESB | Zarezerwuj bajt |
RESW | Zarezerwuj słowo |
RESD | Zarezerwuj podwójne słowo |
RESQ | Zarezerwuj Quadword |
RESZTA | Zarezerwuj dziesięć bajtów |
Wiele definicji
W programie można mieć wiele instrukcji definiujących dane. Na przykład -
choice DB 'Y' ;ASCII of y = 79H
number1 DW 12345 ;12345D = 3039H
number2 DD 12345679 ;123456789D = 75BCD15H
Asembler przydziela ciągłą pamięć dla wielu definicji zmiennych.
Wiele inicjalizacji
Dyrektywa TIMES zezwala na wielokrotne inicjalizacje tej samej wartości. Na przykład tablicę nazwaną markami o rozmiarze 9 można zdefiniować i zainicjować do zera za pomocą następującej instrukcji -
marks TIMES 9 DW 0
Dyrektywa TIMES jest przydatna przy definiowaniu tablic i tabel. Poniższy program wyświetla 9 gwiazdek na ekranie -
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 '*'
Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -
*********