4494

Типы данных при программировании на языке ассемблера

Лекция

Информатика, кибернетика и программирование

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

Русский

2012-11-21

73.96 KB

20 чел.

Типы данных при программировании на языке ассемблера

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

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

Эти два типа данных являются элементарными, или базовыми; работа с ними поддерживается на уровне системы команд микропроцессора. Используя данные этих типов, можно формализовать и запрограммировать практически любую задачу. Но насколько это будет удобно — вот вопрос.

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

Обработка информации, в общем случае, процесс очень сложный. Это косвенно подтверждает популярность языков высокого уровня. Одно из несомненных достоинств языков высокого уровня — поддержка развитых структур данных. При их использовании программист освобождается от решения конкретных проблем, связанных с представлением числовых или символьных данных, и получает возможность оперировать информацией, структура которой в большей степени отражает особенности предметной области решаемой задачи. В то же самое время, чем выше уровень такой абстракции данных от конкретного их представления в компьютере, тем большая нагрузка ложится на компилятор с целью создания действительно эффективного кода. Ведь нам уже известно, что в конечном итоге все написанное на языке высокого уровня в компьютере будет представлено на уровне машинных команд, работающих только с базовыми типами данных. Таким образом, самая эффективная программа — программа, написанная в машинных кодах, но писать сегодня большую программу в машинных кодах — занятие не имеющее слишком большого смысла.

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

  1.  байт — восемь последовательно расположенных битов, пронумерованных от 0 до 7, при этом бит 0 является самым младшим значащим битом;
  2.  слово — последовательность из двух байт, имеющих последовательные адреса. Размер слова — 16 бит; биты в слове нумеруются от 0 до 15. Байт, содержащий нулевой бит, называется младшим байтом, а байт, содержащий 15-й бит - старшим байтом. Микропроцессоры Intel имеют важную особенность — младший байт всегда хранится по меньшему адресу. Адресом слова считается адрес его младшего байта. Адрес старшего байта может быть использован для доступа к старшей половине слова.
  3.  двойное слово — последовательность из четырех байт (32 бита), расположенных по последовательным адресам. Нумерация этих бит производится от 0 до 31. Слово, содержащее нулевой бит, называется младшим словом, а слово, содержащее 31-й бит, - старшим словом. Младшее слово хранится по меньшему адресу. Адресом двойного слова считается адрес его младшего слова. Адрес старшего слова может быть использован для доступа к старшей половине двойного слова.
  4.  учетверенное слово — последовательность из восьми байт (64 бита), расположенных по последовательным адресам. Нумерация бит производится от 0 до 63. Двойное слово, содержащее нулевой бит, называется младшим двойным словом, а двойное слово, содержащее 63-й бит, — старшим двойным словом. Младшее двойное слово хранится по меньшему адресу. Адресом учетверенного слова считается адрес его младшего двойного слова. Адрес старшего двойного слова может быть использован для доступа к старшей половине учетверенного слова.

Рис. 1. Основные типы данных микропроцессора

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

  1.  Целый тип со знаком — двоичное значение со знаком, размером 8, 16 или 32 бита. Знак в этом двоичном числе содержится в 7, 15 или 31-м бите соответственно. Ноль в этих битах в операндах соответствует положительному числу, а единица — отрицательному. Отрицательные числа представляются в дополнительном коде. Числовые диапазоны для этого типа данных следующие:
  2.  8-разрядное целое — от –128 до +127;
  3.  16-разрядное целое — от –32 768 до +32 767;
  4.  32-разрядное целое — от –231 до +231–1.
  5.  Целый тип без знака — двоичное значение без знака, размером 8, 16 или 32 бита. Числовой диапазон для этого типа следующий:
  6.  байт — от 0 до 255;
  7.  слово — от 0 до 65 535;
  8.  двойное слово — от 0 до 232–1.
  9.  Указатель на память двух типов:
  10.  ближнего типа — 32-разрядный логический адрес, представляющий собой относительное смещение в байтах от начала сегмента. Эти указатели могут также использоваться в сплошной (плоской) модели памяти, где сегментные составляющие одинаковы;
  11.  дальнего типа — 48-разрядный логический адрес, состоящий из двух частей: 16-разрядной сегментной части — селектора, и 32-разрядного смещения.
  12.  Цепочка — представляющая собой некоторый непрерывный набор байтов, слов или двойных слов максимальной длины до 4 Гбайт.
  13.  Битовое поле представляет собой непрерывную последовательность бит, в которой каждый бит является независимым и может рассматриваться как отдельная переменная. Битовое поле может начинаться с любого бита любого байта и содержать до 32 бит.
  14.  Неупакованный двоично-десятичный тип — байтовое представление десятичной цифры от 0 до 9. Неупакованные десятичные числа хранятся как байтовые значения без знака по одной цифре в каждом байте. Значение цифры определяется младшим полубайтом.
  15.  Упакованный двоично-десятичный тип представляет собой упакованное представление двух десятичных цифр от 0 до 9 в одном байте. Каждая цифра хранится в своем полубайте. Цифра в старшем полубайте (биты 4–7) является старшей.

Рис. 2. Основные логические типы данных микропроцессора

Отметим, что “Зн” на рис. 2 означает знаковый бит.

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

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

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

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

Директивы резервирования и инициализации данных простых типов имеют формат, показанный на рис. 3.

Рис. 3. Директивы описания данных простых типов

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

  1.  ? показывает, что содержимое поля не определено, то есть при задании директивы с таким значением выражения содержимое выделенного участка физической памяти изменяться не будет. Фактически, создается неинициализированная переменная;
  2.  значение инициализации — значение элемента данных, которое будет занесено в память после загрузки программы. Фактически, создается инициализированная переменная, в качестве которой могут выступать константы, строки символов, константные и адресные выражения в зависимости от типа данных. Подробная информация приведена в приложении 1;
  3.  выражение — итеративная конструкция с синтаксисом, описанным на рис. 5.17. Эта конструкция позволяет повторить последовательное занесение в физическую память выражения в скобках n раз.
  4.  имя — некоторое символическое имя метки или ячейки памяти в сегменте данных, используемое в программе.

На рис. 3 представлены следующие поддерживаемые TASM директивы резервирования и инициализации данных:

  1.  db — резервирование памяти для данных размером 1 байт.
  2.  Директивой db можно задавать следующие значения:
  3.  выражение или константу, принимающую значение из диапазона:
    1.  для чисел со знаком –128...+127;
    2.  для чисел без знака 0...255;
  4.  8-битовое относительное выражение, использующее операции HIGH и LOW;
  5.  символьную строку из одного или более символов. Строка заключается в кавычки. В этом случае определяется столько байт, сколько символов в строке.
  6.  dw — резервирование памяти для данных размером 2 байта.
  7.  Директивой dw можно задавать следующие значения:
  8.  выражение или константу, принимающую значение из диапазона:
    1.  для чисел со знаком –32 768...32 767;
    2.  для чисел без знака 0...65 535;
  9.  выражение, занимающее 16 или менее бит, в качестве которого может выступать смещение в 16-битовом сегменте или адрес сегмента;
  10.  1- или 2-байтовую строку, заключенная в кавычки.
  11.  dd — резервирование памяти для данных размером 4 байта.
  12.  Директивой dd можно задавать следующие значения:
  13.  выражение или константу, принимающую значение из диапазона:
    1.  для i8086:
      1.  для чисел со знаком –32 768...+32 767;
      2.  для чисел без знака 0...65 535;
    2.  для i386 и выше:
      1.  для чисел со знаком –2 147 483 648...+2 147 483 647;
      2.  для чисел без знака 0...4 294 967 295;
  14.  относительное или адресное выражение, состоящее из 16-битового адреса сегмента и 16-битового смещения;
  15.  строку длиной до 4 символов, заключенную в кавычки.
  16.  df — резервирование памяти для данных размером 6 байт;
  17.  dp — резервирование памяти для данных размером 6 байт.
  18.  Директивами df и dp можно задавать следующие значения:
  19.  выражение или константу, принимающую значение из диапазона:
    1.  для i8086:
      1.  для чисел со знаком –32 768...+32 767;
      2.  для чисел без знака 0...65 535;
    2.  для i386 и выше:
      1.  для чисел со знаком –2 147 483 648...+2 147 483 647;
      2.  для чисел без знака 0...4 294 967 295;
  20.  относительное или адресное выражение, состоящее из 32 или менее бит (для i80386) или 16 или менее бит (для младших моделей микропроцессоров Intel);
  21.  адресное выражение, состоящее из 16-битового сегмента и 32-битового смещения;
  22.  константу со знаком из диапазона –247...247–1;
  23.  константу без знака из диапазона 0...248-1;
  24.  строку длиной до 6 байт, заключенную в кавычки.
  25.  dq — резервирование памяти для данных размером 8 байт.
  26.  Директивой dq можно задавать следующие значения:
  27.  выражение или константу, принимающую значение из диапазона:
    1.  для МП i8086:
      1.  для чисел со знаком –32 768...+32 767;
      2.  для чисел без знака 0...65 535;
    2.  для МП i386 и выше:
      1.  для чисел со знаком –2 147 483 648...+2 147 483 647;
      2.  для чисел без знака 0...4 294 967 295;
  28.  относительное или адресное выражение, состоящее из 32 или менее бит (для i80386) или 16 или менее бит (для младших моделей микропроцессоров Intel);
  29.  константу со знаком из диапазона –263...263–1;
  30.  константу без знака из диапазона 0...264–1;
  31.  строку длиной до 8 байт, заключенную в кавычки.
  32.  dt — резервирование памяти для данных размером 10 байт.
  33.  Директивой dt можно задавать следующие значения:
  34.  выражение или константу, принимающую значение из диапазона:
    1.  для МП i8086:
      1.  для чисел со знаком –32 768...+32 767;
      2.  для чисел без знака 0...65 535;
    2.  для МП i386 и выше:
      1.  для чисел со знаком –2 147 483 648...+2 147 483 647;
      2.  для чисел без знака 0...4 294 967 295;
  35.  относительное или адресное выражение, состоящее из 32 или менее бит (для i80386) или 16 или менее бит (для младших моделей);
  36.  адресное выражение, состоящее из 16-битового сегмента и 32-битового смещения;
  37.  константу со знаком из диапазона –279...279-1;
  38.  константу без знака из диапазона 0...280-1;
  39.  строку длиной до 10 байт, заключенную в кавычки;
  40.  упакованную десятичную константу в диапазоне 0...99 999 999 999 999 999 999.

Очень важно уяснить себе порядок размещения данных в памяти. Он напрямую связан с логикой работы микропроцессора с данными. Микропроцессоры Intel требуют следования данных в памяти по принципу: младший байт по младшему адресу.

Для иллюстрации данного принципа рассмотрим листинг 1, в котором определим сегмент данных. В этом сегменте данных приведено несколько директив описания простых типов данных.

 

Листинг 1. Пример использования директив резервирования и инициализации данных

masm

model small

.stack 100h

.data

message db 'Запустите эту программу в отладчике’,’$'

perem_1 db 0ffh

perem_2 dw 3a7fh

perem_3 dd 0f54d567ah

mas db 10 dup (' ')

pole_1 db 5 dup (?)

adr dw perem_3

adr_full dd perem_3

fin db 'Конец сегмента данных программы $'

.code

start:

mov ax,@data

mov ds,ax

 mov ah,09h

mov dx,offset message

int 21h

mov ax,4c00h

int 21h

end start

Теперь наша цель — посмотреть, как выглядит сегмент данных программы листинга 1 в памяти компьютера. Это даст нам возможность обсудить практическую реализацию обозначенного нами принципа размещения данных. Для этого запустим отладчик TD.EXE, входящий в комплект поставки TASM. Результат показан на рис. 4.

Рис. 4. Окно дампа памяти для программы листинга 1

Обсудим рис. 4. На нем вы видите данные вашего сегмента в двух представлениях: шестнадцатеричном и символьном. Видно, что со смещением 0000 расположены символы, входящие в строку message. Она занимает 34 байта. После нее следует байт, имеющий в сегменте данных символическое имя perem_1, содержимое этого байта offh.

Теперь обратите внимание на то, как размещены в памяти байты, входящие в слово, обозначенное символическим именем perem_2. Сначала следует байт со значением 7fh, а затем со значением 3ah. Как видите, в памяти действительно сначала расположен младший байт значения, а затем старший.

Теперь посмотрите и самостоятельно проанализируйте размещение байтов для поля, обозначенного символическим именем perem_3.

Оставшуюся часть сегмента данных вы можете теперь проанализировать самостоятельно.

Остановимся лишь на двух специфических особенностях использования директив резервирования и инициализации памяти. Речь идет о случае использования в поле операндов директив dw и dd символического имени из поля имя этой или другой директивы резервирования и инициализации памяти. В нашем примере сегмента данных это директивы с именами adr и adr_full.

Когда транслятор встречает директивы описания памяти с подобными операндами, то он формирует в памяти значения адресов тех переменных, чьи имена были указаны в качестве операндов. В зависимости от директивы, применяемой для получения такого адреса, формируется либо полный адрес (директива dd) в виде двух байтов сегментного адреса и двух байтов смещения, либо только смещение (директива dw). Найдите в дампе на рис. 4 поля, соответствующие именам adr и adr_full, и проанализируйте их содержимое.

Любой переменной, объявленной с помощью директив описания простых типов данных, ассемблер присваивает три атрибута:

  1.  Сегмент (seg) — адрес начала сегмента, содержащего переменную;
  2.  Смещение (offset) в байтах от начала сегмента с переменной;
  3.  Тип (type) — определяет количество памяти, выделяемой переменной в соответствии с директивой объявления переменной.

Получить и использовать значение этих атрибутов в программе можно с помощью рассмотренных нами операторов ассемблера seg, offset и type.

TASM поддерживает следующие сложные типы данных:

  1.  массивы;
  2.  структуры;
  3.  объединения;
  4.  записи.

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


 

А также другие работы, которые могут Вас заинтересовать

76443. Отмена усыновления ребенка 15.27 KB
  Однако могут быть и другие ситуации например не сложились семейные родственные отношения усыновителя и ребенка или тяжелая болезнь усыновителя и т. Во всех случаях суд тщательно изучает все обстоятельства конкретного дела и вправе отменить усыновление ребенка исходя из его интересов и с учетом его мнения п. Порядок отмены усыновления Отмена усыновления ребенка производится в судебном порядке п.
76444. Правовые последствия отмены усыновления 13.52 KB
  При отсутствии родителей а также если передача ребенка родителям противоречит его интересам ребенок передается на попечение органа опеки и попечительства. Изменение имени отчества или фамилии ребенка достигшего возраста десяти лет возможно только с его согласия. Суд исходя из интересов ребенка вправе обязать бывшего усыновителя выплачивать средства на содержание ребенка.
76445. Опека и попечительства как форма семейного воспитания детей 16.24 KB
  Опекун попечитель назначается органом опеки и попечительства №48ФЗ от 24. В соответствии с Семейным и Гражданским кодексами РФ дети находящиеся под опекой попечительством имеют право на: воспитание в семье опекуна попечителя заботу с их стороны; совместное с ним проживание исключения допускаются с разрешения органа опеки и попечительства когда подопечный достиг возраста 16 лет и раздельное проживание не отразится неблагоприятно на его воспитании и защите прав и интересов; обеспечение условий для содержания воспитания...
76446. Права и обязанности опекунов и попечителей 27.96 KB
  Проживание будущего опекуна или попечителя и его потенциального подопечного по разным адресам может породить проблему выбора места установления опеки и попечительства. При этом в отдельных случаях при наличии заслуживающих внимания обстоятельств допускается установление опеки попечительства по месту проживания кандидата в опекуны и попечители например если он уже привез к себе нуждающегося в помощи гражданина либо не имеет возможности долго находиться в доме будущего подопечного. Но потом личное дело подопечного где хранится вся...
76447. Прекращение опеки и попечительства 15.01 KB
  Прекращение опеки и попечительства связаны с несколькими факторами. Не требует особого решения и прекращение попечительства при достижении подопечным 18ти лет п. Так же основаниями для прекращения попечительства над несовершеннолетними гражданами являются: эмансипация приобретение несовершеннолетним полной дееспособности до достижения им восемнадцатилетнего возраста; вступление в брак несовершеннолетним.
76448. Приемная семья (понятие, значение, приемные дети и приемные родители) 16.33 KB
  Приемная семья дает возможность максимально приблизить воспитание детейсирот и детей оставшихся без попечения родителей к реальной жизни. Она формирует у детей навыки преодоления трудных жизненных ситуаций психологическую защиту и правильное поведение при стрессах а также моральноэтическую установку на создание собственной стабильной семьи что важно и для некоторых взрослых граждан прежде всего для тех кто видит в воспитании детей свое призвание кто небезразличен к судьбе обездоленных детей и считает что у него хватит сил умения и...
76449. Договор о приемной семье 14.61 KB
  152 Семейного кодекса РФ приемной семьей признается опека или попечительство над ребенком которые осуществляются по договору о приемной семье заключаемому между органом опеки и попечительства и приемными родителемями. Так как к отношениям возникающим из договора о приемной семье применяются положения Главы 20 Семейного кодекса РФ об опеке ниже под опекуном попечителем подразумевается и приемныйе родительи. Договор о приемной семье заключается в соответствии с Правилами заключения договора об осуществлении опеки или попечительства...
76450. Основания и последствия прекращения договора приемной семье 14.86 KB
  Прекращение договора о приемной семье. При необходимости срок действия договора может быть продлен по соглашению сторон. Основанием прекращения может быть и неисполнение или ненадлежащее исполнение договора одной из сторон.
76451. Патронатная семья 24.61 KB
  Необходимо отметить, что патронатное воспитание существует ТОЛЬКО при наличии службы, профессионально занимающейся патронатным воспитанием и имеющей «качество» уполномоченной организации органа опеки и попечительства, на которую органом опеки и попечительства возложена работа по патронату.