Сборка - переменные

NASM предоставляет различные define directivesдля резервирования места для хранения переменных. Директива ассемблера define используется для выделения места для хранения. Его можно использовать для резервирования, а также для инициализации одного или нескольких байтов.

Выделение места для хранения инициализированных данных

Синтаксис оператора распределения памяти для инициализированных данных:

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

Где имя-переменной - это идентификатор для каждой области хранения. Ассемблер связывает значение смещения для каждого имени переменной, определенного в сегменте данных.

Есть пять основных форм директивы define:

Директива Цель Место для хранения
БД Определить байт выделяет 1 байт
DW Определить слово выделяет 2 байта
DD Определить двойное слово выделяет 4 байта
DQ Определить Quadword выделяет 8 байтов
DT Определить десять байтов выделяет 10 байт

Ниже приведены несколько примеров использования директив 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

Обратите внимание, что -

  • Каждый байт символа сохраняется как его значение ASCII в шестнадцатеричном формате.

  • Каждое десятичное значение автоматически преобразуется в его 16-битный двоичный эквивалент и сохраняется как шестнадцатеричное число.

  • Процессор использует порядок байтов с прямым порядком байтов.

  • Отрицательные числа преобразуются в его представление в виде дополнения до 2.

  • Короткие и длинные числа с плавающей запятой представлены 32 или 64 битами соответственно.

Следующая программа показывает использование директивы 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'

Когда приведенный выше код компилируется и выполняется, он дает следующий результат:

y

Выделение дискового пространства для неинициализированных данных

Директивы резервирования используются для резервирования места для неинициализированных данных. Директивы резервирования принимают единственный операнд, который указывает количество единиц пространства, которое необходимо зарезервировать. Каждая директива define имеет связанную директиву резервного копирования.

Есть пять основных форм резервной директивы:

Директива Цель
RESB Зарезервировать байт
RESW Зарезервировать слово
RESD Зарезервируйте двойное слово
RESQ Зарезервируйте Quadword
ОСТАТОК Зарезервируйте десять байт

Множественные определения

В программе может быть несколько операторов определения данных. Например -

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

Ассемблер выделяет непрерывную память для нескольких определений переменных.

Множественные инициализации

Директива TIMES допускает несколько инициализаций одного и того же значения. Например, массив с именем mark размером 9 может быть определен и инициализирован нулем с помощью следующего оператора:

marks  TIMES  9  DW  0

Директива TIMES полезна при определении массивов и таблиц. Следующая программа отображает на экране 9 звездочек -

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

Когда приведенный выше код компилируется и выполняется, он дает следующий результат:

*********