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 -

*********