Skip to main content

Данные

Типы данных

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