Данные
Типы данных
| db | байт |
| dw | слово |
| dd | двойное слово |
| dq | двойное длинное слово |
Для строк в конце добавляется завершающий 0 (NULL).
Массив:
nums dq 11, 12, 13, 14, 15, 16, 17 ; семь 8-байтных чисел
Как и всегда, хранится адрес первого элемента.
times определяет массив одинаковых элементов.
numb: times 10 db 2 ; десять чисел, каждое из которых равно 2, 1-байтные
Упрощенный вариант выделения памяти для массива (начальные 0):
| resb | выделяет некоторое количество байт |
| resw | выделяет некоторое количество слов (2-х байтовых чисел) |
| resd | выделяет некоторое количество двойных слов (4-х байтовых чисел) |
| resq | выделяет некоторое количество четверных слов (8-х байтовых чисел) |
Пример:
buffer resb 10
Значение переменной получаем при [], по умолчанию адрес переменной. В Windows лексика сложнее.
Преобразование разрядности.
При несоответствии разрядности регистра и памяти желательно точно определять, что делать.
...
section .data
nums db 1, 2, 0, 0, 0, 0, 0, 0
...
movzx rax, byte [nums]
- byte: преобразует в байт
- word: преобразует в слово
- dword: преобразует в двойное слов
- qword: преобразует в четверное слово
Точка определения данных:
| section .text | Должны определяться либо до первой инструкции, либо после последней инструкции. Только константы. |
| section .data | Наиболее логичная точка размещения. Но все данные в этой секции размещаются в бинарнике и затем копируются в ОП. |
| section .rodata | Раздел только для чтения. Отличие от констант в том, что занимают память. Константы подставляются во время компиляции. Нельзя сделать массив констант. |
| section .bss | Логичнее размещать здесь неизвестные сначала данные, resb/... Не занимается память в бинарнике, |
Косвенная адресация.
Обращение по некоторому адресу: [base + (index * scale) + offset] Компоненты:
| base | базовый регистр, который содержит некоторый адрес. Это может быть 64-разрядный или 32-разрядный регистр общего назначения или регистр RSP |
| index | индексный регистр, который содержит некоторый индекс относительно адреса в базовом регистре. В качестве индексного регистра также могут выступать 64-разрядный или 32-разрядный регистр общего назначения или регистр RSP |
| scale | множитель, на который умножается значение индексного регистра. Может принимать значения 1, 2, 4 или 8 |
| offset | может представлять 32-разрядное значение в виде числа или имени переменной. Это может быть 64-разрядный регистр общего назначения или регистр RSP |