Sadda.ru Ironetcart Андроид Ассемблер MASM32 Linux Все статьи Table of Contents


 

Переменные и типы данных ассемблера

  Макс Петров май 2013

Бит (bit) - двоичный разряд.
Байт (byte) - последовательность из 8 бит.
Слово (word) - последовательность из двух байт (16 бит).
Двойное слово (double word) - последовательность из четырех байт (32 бита).

      Пример объявления переменных в программе для MASM32 - сегмент .data:

.data ; --------------------------------------------------------------------------------- ; объявление и инициализация переменных типа byte (db) ; --------------------------------------------------------------------------------- a byte ? ; переменная a без начального значения (неинициализированная) b byte 0 ; переменная b с начальным значением 0 abc byte 35 ; переменная abc с начальным значением 35 a1b2 db "#" ; переменная a1b2 с начальным значением 35 ; --------------------------------------------------------------------------------- ; объявление и инициализация переменных типа word (dw) ; --------------------------------------------------------------------------------- d word ? ; переменная d без начального значения (неинициализированная) e word 0 ; переменная e с начальным значением 0 ee1 word 35 ; переменная ee1 с начальным значением 35 ee2 dw "#" ; переменная ee2 с начальным значением 35 eee1 word 8995 ; переменная eee1 с начальным значением 8995 eee2 dw "##" ; переменная eee2 с начальным значением 8995 efg1 dw "kl" ; переменная efg1 с начальным значением "lk" (27755) ; --------------------------------------------------------------------------------- ; объявление и инициализация переменных типа dword (dd) ; --------------------------------------------------------------------------------- var1 dword 0 ; переменная var1 с начальным значением 0 var2 dword "asdf" ; переменная var2 с начальным значением "fdsa" ; --------------------------------------------------------------------------------- ; объявление и инициализация массивов ; --------------------------------------------------------------------------------- dim1 byte "qwerty" ; массив из 6 байтов: "qwerty" dim2 byte 100 dup (?) ; массив из 100 байтов неинициализированный dim3 byte 150 dup (0) ; массив из 150 байтов, заполненных нулями dim4 byte 5 dup (0), ; массив из 25 байтов: "0000011111##########asdfg" 5 dup (1), 5 dup (35), 5 dup ("#"), "asdfg" dim5 word 5 dup (0), ; массив из 15 слов: "000000000001010101010#0#0#0#0#" 5 dup (1), 5 dup (35)

      Как видно из приведенного примера, переменные в ассемблере MASM32 определяются в сегменте .data программы при помощи конструкции:
      [имя] тип значение,
где имя - необязательный параметр. Имя (идентификатор) переменной может содержать цифры, буквы латинского алфавита, символ подчеркивания в любом порядке, но начинаться должно обязательно с буквы. Длина имени переменной допускается в MASM32 одиннадцатой версии до 247 символов включительно. Если значение переменной при старте программы не определено, вместо числа или символьного значения после указания типа записывают знак вопроса.

      Инициализирующие переменную символьные значения (строки символов) заключают в кавычки. Необходимо учитывать, что переменные длиной 2 и более байт инициализируются строкой с ее инверсией, в результате записи

var2 dword "asdf"

переменная var2 получит перевернутое значение "fdsa". Такой переворот строк происходит по следующей причине. Символ в памяти компьютера (в кодировке win1251) занимает 1 байт. Ассемблер видит символьную строку, как набор байт, и присваивает многобайтной переменной строковое значение последовательно, первый (левый) символ помещая в младший байт переменной, второй символ помещая во второй байт и т.д. При этом ассемблер считает многобайтную переменную, инициализированную строкой, все же числом. Поэтому на печать (на экран) байты-символы выводятся в обратном порядке - младший байт помещается справа, получается, что строка печатается задом-наперед.

      Целочисленные переменные в MASM32 могут быть:
  1-байтовые (8 бит или 1 символ), обозначаются byte или db,
  2-байтовые (16 бит или 2 символа), обозначаются word или dw,
  4-байтовые (32 бит или 4 символа), обозначаются dword или dd,
  6-байтовые (48 бит или 6 символов), обозначаются fword или df,
  8-байтовые (34 бит или 8 символов), обозначаются qword или dq,
10-байтовые (80 бит или 10 символов), обозначаются tword или dt.

      Переменные с плавающей точкой:
  4-байтовые, обозначаются real4,
  8-байтовые, обозначаются real8,
10-байтовые, обозначаются real10.

      При описании массива можно использовать директиву

N dup (val)

где N - число повторений (duplicate) переменной в памяти; val - инициализирующее значение. Например, по директиве

byte 5 dup (0)

ассемблер заполнит нулями 5 байт, следующие непосредственно за предыдущей (если таковая есть) переменной или от начала сегмента данных.

      Имя (идентификатор) переменной, в понимании ассемблера - это адрес младшего байта этой переменной (или адрес ее единственного байта, если переменная однобайтовая). Индекс элемента массива - это смещение с соответствующим шагом (байт, слово, двойное слово и т.д.) относительно адреса первого элемента массива. Имена элементов массива образуются путем комбинации имени переменной и смещения от нее, смещение записывают в квадратных скобках. Необходимо помнить, что для первого элемента смещения нет (оно равно нулю), соответственно, индекс первого элемента массива всегда тоже равен нулю. Например, для массива из шести байт

dim1 byte "qwerty"

имена и значения элементов будут таковы:
      dim1[0] = "q"
      dim1[1] = "w"
      dim1[2] = "e"
      dim1[3] = "r"
      dim1[4] = "t"
      dim1[5] = "y".

      Строго говоря, сегмент данных программы - это всегда байтовый массив (последовательность ячеек памяти). В ассемблере определение (описание) переменной в виде массива - это необязательная условность, не влияющая на расположение данных в памяти компьютера. С именами переменных в ассемблере можно поступать вольно, обращаться к любой переменной, как к массиву, получать значения одних переменных через идентификаторы других.

переменные ассемблера

      На рисунке показаны первые восемь байт сегмента данных из фрагмента программы, помещенного в начале этой статьи. Имеем шесть переменных, первые четыре (a, b, abc, a1b2) однобайтовые, пятая и шестая (d, e) - двухбайтовые. Мы можем вызывать значения однобайтных переменных по имени предшествующей им однобайтной переменной, считая ее имя именем массива, пусть даже такая предшествующая переменная и не была нами явно описана в сегменте данных программы, как массив:
      a = a[0] = ?
      b = a[1] = 0
      abc = a[2] = 35
      a1b2 = a[3] = 35;
аналогично и с двухбайтовыми (и выше) переменными:
      e = d[1] = 0.

      Можно получить значение каждого из байтов многобайтовой переменной через имя предшествующей однобайтовой переменной, в нашем примере
      a[4] - это младший байт переменной d,
      a[5] - это старший байт переменной d,
      a[6] - это младший байт переменной e,
      a[7] - это старший байт переменной e.

     


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

E-mail:
*


Контрольные цифры:

   Макс Петров    13.10.2016    08:16
ya lyublyu assembler(!)


   Вакер    15.03.2017    10:38
Ассемблер ван лав


   Максим Чечуркин    20.06.2017    12:36
Обожаю АСМ, но ЦэШарп лучше :3


   кент с Дута    04.10.2017    08:29
Я ненавижу ассемблер. Нафиг он кому-то нужен???


   Всё    19.10.2017    12:09
Ясно


   +    26.10.2017    10:25
+




Ассемблер MASM32

      Простейшая программа на ассемблере (beeper)
      Переменные и типы данных ассемблера
      Регистры процессора IA32
      Консоль ввода-вывода
      API-функция CharToOem и строки ассемблера
      API-функция ReadConsoleInput
      API-функция PeekConsoleInput
      События консоли (таблица)
      Системы счисления, тэги ассемблера, перевод чисел
      Отрицательные числа
      Инкремент и декремент
      Деление (DIV, IDIV)
      VKDEBUG
      Макросы ассемблера
      Воспоминание об Альгамбре на системном динамике
      Командная строка
      Пузырьковая сортировка. Эстафета шариков
      Сортировка расческой
      Быстрая сортировка

     


© Max Petrov При использовании материалов ссылка на sadda.ru обязательна