Ассемблер. Переменные и Константы

  Светлана Деменева  | 

  Обновл. 12 Окт 2019  | 

 1853

 ǀ   4 

NASM предоставляет различные директивы определения для резервирования места для хранения переменных. В ассемблере директива определения используется для выделения дискового пространства. Она может использоваться для резервирования или инициализации одного/нескольких байт.

Хранения инициализированных данных

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

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

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

Директива Цель Пространство для хранения
DB Определяет Byte Выделяет 1 байт
DW Определяет Word Выделяет 2 байта
DD Определяет Doubleword Выделяет 4 байта
DQ Определяет Quadword Выделяет 8 байт
DT Определяет 10 Byte-ов Выделяет 10 байт

Ниже приведены примеры использования директив определения:

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

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

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

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

   отрицательные числа конвертируются в форму «two’s complement»;

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

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

Результат выполнения программы выше:

y

Хранение неинициализированных данных


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

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

Директива Цель
RESB Резервирует Byte
RESW Резервирует Word
RESD Резервирует Doubleword
RESQ Резервирует Quadword
REST Резервирует 10 Byte-ов

Несколько определений

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

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

Несколько инициализаций


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

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

Результат выполнения программы выше:

*********

Определение констант

NASM предоставляет несколько директив, определяющих константы:

   EQU

   %assign

   %define

Директива EQU


Директива EQU используется для определения констант. Её синтаксис следующий:

ИМЯ_КОНСТАНТЫ EQU-выражение

Например:

Затем вы можете использовать эту константу в программе:

Операндом стейтмента EQU может быть выражение:

Фрагмент кода выше определит AREA как 200.

Ещё один пример:

Результат выполнения программы выше:

Hello, programmers!
Welcome to the world of,
Linux assembly programming!

Директива %assign

Директива %assign может быть использована для определения числовых констант. Эта директива допускает переопределение. Например, вы можете определить константу TOTAL следующим образом:

Затем в коде вы можете переопределить её:

Эта директива является чувствительной к регистру.

Директива %define


Директива %define позволяет определять как числовые, так и строковые константы. Эта директива похожа на директиву #define в языке С.  Например, вы можете определить константу PRT следующим образом:

Код выше заменяет PTR на [EBP+4].

Эта директива также допускает переопределение и является чувствительной к регистру.

Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (4 оценок, среднее: 5,00 из 5)
Загрузка...

Комментариев: 4

  1. Аватар somebox:

    Хотелось бы все-таки чуть подробнее разбирать код примеров.

    Что значит 0xA,0xD в конце строк?
    Почему длина сообщения определяется выражением $ — msg1?

    1. Евгений Павлов Евгений Павлов:

      0xA, 0xD это коды спец символов, которые переводят вывод на следующую строку.

      $ — msg1 означает что от текущего адреса отнимается адрес сообщения.

      $ после объявления строки сдвигается ровно на размер строки, а значит что $ — msg1 будет давать размер строки.

      1. Аватар somebox:

        > коды спец символов, которые переводят вывод на следующую строку

        Ок. А зачем они идут подряд? Ведь оба делают одно и то же, как я понял.

        1. Аватар Roman:

          В Unix системах можно только 0xA, а вот в виндовых вроде и то и то используется

Добавить комментарий

Ваш E-mail не будет опубликован. Обязательные поля помечены *