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