4.Типы данных процессора Intel. Размерность и диапазон принимаемых значений. Знаковые и беззнаковые представления. Команды резервирования данных (db, dw и т.д.). Инициализация данных.
Прежде всего нужно научиться объявлять данные в программе. Для этого в ассемблере существуют директивы объявления данных.
Размер(в байтах) | Объявление | Резервирование |
---|---|---|
1 | db | db |
2 | dw / du | rw |
4 | dd | rd |
6 | dp / df | rp / rf |
8 | dq | rq |
10 | dt | rt |
N | file |
Синтаксис объявления данных
Объявлять данные очень просто — например, чтобы объявить байт cо значением 5 достаточно написать:
x db 5
где x — название нашей переменной или константы, db — директива объявления байта, а 5 — значение.
Объявление последовательностей (массивов)
Иногда в программе требуется объявить массив, то есть несколько переменных одинакового размера, расположенных в памяти друг за другом. Например, чтобы объявить массив из 5 двухбайтных чисел можно написать:
array1 dw 1,2,3,4,5
где array1 — название массива, 1,2,3,4,5 — значения элементов. Вместо array1 компилятор FASM будет подставлять в программу адрес начала массива, то есть адрес первого элемента.
Для объявления повторяющихся элементов можно использовать такую запись (объявляем массив из 5 байтов, равных 1):
array2 db 5 dup(1)
Резервирование данных (точнее памяти для них)
Можно объявлять переменные, не имеющие определённого начального значения. Такие переменные называются неинициализированными. Например, их можно использовать в программе для хранения временного или промежуточного значения. Фактически под переменную просто резервируется место в памяти. Объявлять такие переменные можно с помощью директив db, dw, dd, … и знака вопроса вместо значения.
x1 db ?
x2 dw ?,?,?
x3 dd 10 dup(?)
Кроме того, FASM поддерживает специальные директивы резервирования данных. Число после директивы обозначает количество резервируемых элементов. То же самое можно объявить вот так:
x1 rb 1
x2 rw 3
x3 rd 10
Директива file
file — это особая директива объявления данных, которая позволяет добавить в исполняемый файл последовательность байтов из внешнего файла. Иногда это может быть очень удобно. Например, если вы хотите добавить изображение в исполняемый файл (в виде данных), или большой кусок текста, или даже код из другого файла. Директива используется следующим образом:
data1 file 'data.bin' ;Добавить файл data.bin целиком.
data2 file 'data.bin':20 ;Добавить байты из файла data.bin, начиная со смещения 20.
data3 file 'data.bin':20,5 ;Добавить 5 байтов из файла data.bin, начиная со смещения 20.
Числа со знаком и дополнительный код
Для представления чисел со знаком используется специальное кодирование. Старший бит в этом случае обозначает знак числа. Если знаковый бит равен нулю, то число положительное, иначе — отрицательное. Понятно, что положительное число со знаком будет выглядеть точно так же, как и число без знака.
С отрицательными числами чуть сложнее. Исторически для представления отрицательных чисел в компьютерах использовались разные виды кодирования: прямой, обратный и дополнительный код. В настоящее время наиболее часто используется дополнительный код, в том числе и в процессорах x86.
Чтобы сделать из положительного числа отрицательное, необходимо проинвертировать все его биты (0 заменяем на 1, а 1 заменяем на 0) и затем к младшему разряду прибавить единицу. Например, представим -5 в дополнительном коде:
Для записи отрицательного числа в программе на ассемблере используется символ ‘-‘, например:
x db -5
Кстати, это работает и с числами в других системах счисления, и даже с символами
y db -25h
z db -77o
k db -101b
s db -'a'
Диапазоны значений чисел со знаком и без
При программировании на ассемблере (как, впрочем, и на многих других языках) необходимо учитывать ещё один важный момент. А именно — ограничение диапазона представления чисел. Например, если размер беззнаковой переменной равен 1 байт, то она может принимать всего 256 различных значений. Это означает, что мы не сможем представить с её помощью число, больше 255 (111111112). Для такой же переменной со знаком максимальным значением будет 127 (011111112), а минимальным -128 (100000002). Аналогично определяется диапазон для 2- и 4-байтных переменных.
Кстати, так как процессор Intel 8086 был 16-битным и обрабатывал за одну команду 16-бит, то 16-битная переменная называется слово (word), а 32-битная — двойное слово (double word, dword). Эти названия сохранились в ассемблере даже для 32-битных процессоров (и в WIN32 API, например). И от них же происходят названия директив dw (Define Word) и dd (Define Dword). Ну а db — это Define Byte.
Для наглядности вот табличка диапазонов чисел: