Инструменты пользователя

Инструменты сайта


examination:asm:question12

Вопрос №12. Резервирование памяти на ЯА, доступ к переменным. Характеристики переменных. Примеры.

Резервирование памяти

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

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

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

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

Понятие простого типа данных носит двойственный характер. С точки зрения размерности (физическая интерпретация), микропроцессор аппаратно поддерживает следующие основные типы данных:

  • байт
  • слово
  • двойное слово
  • учетверенное слово

Кроме трактовки типов данных с точки зрения их разрядности, микропроцессор на уровне команд поддерживает логическую интерпретацию этих типов:

  • Целый тип со знаком
  • Целый тип без знака
  • Указатель на память
  • Цепочка - представляющая собой некоторый непрерывный набор байтов, слов или двойных слов максимальной длины до 4 Гбайт.
  • Битовое поле представляет собой непрерывную последовательность бит, в которой каждый бит является независимым и может рассматриваться как отдельная переменная. Битовое поле может начинаться с любого бита любого байта и содержать до 32 бит.
  • Неупакованный двоично-десятичный тип - байтовое представление десятичной цифры от 0 до 9.
  • Упакованный двоично-десятичный тип представляет собой упакованное представление двух десятичных цифр от 0 до 9 в одном байте.

Описанные ранее данные можно определить как данные простого типа. Описать их можно с помощью специального вида директив — директив резервирования и инициализации данных. Эти директивы, по сути, являются указаниями транслятору на выделение определенного объема памяти. Если проводить аналогию с языками высокого уровня, то директивы резервирования и инициализации данных являются определениями переменных. Машинного эквивалента этим (впрочем, как и другим) директивам нет; просто транслятор, обрабатывая каждую такую директиву, выделяет необходимое количество байтов памяти и при необходимости инициализирует эту область некоторым значением. Формат директив резервирования и инициализации данных простых типов показан на рис. 5.19

На рисунке использованы следующие обозначения.

  • Знак вопроса (?) показывает, что содержимое поля не определено, то есть при задании директивы с таким значением выражения содержимое выделенного участка физической памяти изменяться не будет. Фактически, создается неинициализированная переменная.
  • Значение инициализации — значение элемента данных, которое будет занесено в память после загрузки программы. Фактически, создается инициализированная переменная, в качестве которой могут выступать константы, строки символов, константные и адресные выражения в зависимости от типа данных.
  • Выражение — итеративная конструкция, о синтаксисе которой можно судить по рисунку. В частности, она позволяет повторить занесение в физическую память выражения в скобках столько раз, сколько повторений указано.
  • Имя — некоторое символическое имя метки или ячейки памяти в сегменте данных, используемое в программе.

Далее представлены поддерживаемые TASM и MASM директивы резервирования и инициализации данных, а также информация о возможных типах и диапазонах значений, которые можно описывать или задавать с их помощью.

DB — резервирование памяти для данных размером 1 байт.

DW — резервирование памяти для данных размером два байта.

DD — резервирование памяти для данных размером четыре байта.

DF и DP — резервирование памяти для данных размером 6 байтов.

DQ — резервирование памяти для данных размером 8 байтов.

DT — резервирование памяти для данных размером 10 байтов.

Заметим, что все директивы позволяют задавать строковые значения, но нужно помнить, что в памяти эти значения могут выглядеть совсем не так, как они были описаны в директиве. Причиной этому является упоминавшийся ранее принцип «младший байт по младшему адресу». Для определения строк лучше использовать директиву DB. Задаваемые таким образом строки должны заключаться в кавычки. Эти кавычки могут быть одинарными ('') или двойными («»). Если задать в строке подряд два таких ограничителя, то вторая кавычка (одинарная или двойная) будет частью строки.

Константы и переменные задаются в сегменте данных в самом начале команды в формате a dw 32767

  • то есть сначала идет имя переменной
  • после этого ее формат, который можно записать как: db,dw,dd и т.д.
  • Далее идет значение переменной в нужном формате ( 101b- двоичном, 124o восьмеричном, 0ABh- шестнадцатеричном , 12 - десятичном)
  • Либо ставится знак (?), что означает, что мы просто определяем переменную, то есть просто выделяем под нее участок памяти
  • Также можно присвоить ANSII код определенного символа, записав символ в кавычках, например так:

a db ‘s’

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

A db 12,34,56

Если требуется просто выделить просто память под массив данных, то записывается эта операция с помощью директивы DUP

A db 20 dup (?)

Данная запись означает, что по адресу переменной А будет выделен массив из 20 пустых байт.

Доступ к переменным

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

Mov ax,a

Характеристики переменных

К характеристикам переменных можно отнести

  • Формат (db- байт , dw слово , dd- удвоенное слово)
  • Количество символов, адресуемых переменной, напрммер если переменной адресуется массив

В ассемблере каждая переменная или константа имеет адрес. Исключением являются только регистры ЦП: у них нет адресов, а только имена.

Кроме адреса, переменная в языке ассемблера может иметь и имя.

Фактически адрес переменной или константы в языке ассемблера - это просто адрес ячейки ОЗУ, где она хранится. Это значит, что, если мы знаем этот адрес, то для нас нет в ассемблере констант: мы в любой момент можем изменить содержимое ячейки ОЗУ. Таким образом, из 2 характеристик переменной только адрес - главная, имя же служит для облегчения процесса программирования.

examination/asm/question12.txt · Последние изменения: 2014/01/15 12:12 (внешнее изменение)