Типы данных Ассемблера. Константы. Директивы описания и инициализации данных, директивы эквивалентности (описания констант). Формат директив.



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

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

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

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

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

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

байт - восемь последовательно расположенных битов, пронумерованных от 0 до 7, при этом бит 0 является самым младшим значащим битом;

слово - последовательность из двух байт, имеющих последовательные адреса. Размер слова - 16 бит; биты в слове нумеруются от 0 до 15. Байт, содержащий нулевой бит, называется младшим байтом, а байт, содержащий 15-й бит - старшим байтом. Микропроцессоры Intel имеют важную особенность - младший байт всегда хранится по меньшему адресу. Адресом слова считается адрес его младшего байта. Адрес старшего байта может быть использован для доступа к старшей половине слова.

двойное слово - последовательность из четырех байт (32 бита), расположенных по последовательным адресам. Нумерация этих бит производится от 0 до 31. Слово, содержащее нулевой бит, называется младшим словом, а слово, содержащее 31-й бит, - старшим словом. Младшее слово хранится по меньшему адресу. Адресом двойного слова считается адрес его младшего слова. Адрес старшего слова может быть использован для доступа к старшей половине двойного слова.

учетверенное слово - последовательность из восьми байт (64 бита), расположенных по последовательным адресам. Нумерация бит производится от 0 до 63. Двойное слово, содержащее нулевой бит, называется младшим двойным словом, а двойное слово, содержащее 63-й бит, - старшим двойным словом. Младшее двойное слово хранится по меньшему адресу. Адресом учетверенного слова считается адрес его младшего двойного слова. Адрес старшего двойного слова может быть использован для доступа к старшей половине учетверенного слова.

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

Целый тип со знаком - двоичное значение со знаком, размером 8, 16 или 32 бита. Знак в этом двоичном числе содержится в 7, 15 или 31-м бите соответственно. Ноль в этих битах в операндах соответствует положительному числу, а единица - отрицательному. Отрицательные числа представляются в дополнительном коде. Числовые диапазоны для этого типа данных следующие:

8-разрядное целое - от -128 до +127;

16-разрядное целое - от -32 768 до +32 767;

32-разрядное целое - от -231 до +231-1.

Целый тип без знака - двоичное значение без знака, размером 8, 16 или 32 бита. Числовой диапазон для этого типа следующий:

байт - от 0 до 255;

слово - от 0 до 65 535;

двойное слово - от 0 до 232-1.

Указатель на память двух типов:

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

дальнего типа - 48-разрядный логический адрес, состоящий из двух частей: 16-разрядной сегментной части - селектора, и 32-разрядного смещения.

Цепочка - представляющая собой некоторый непрерывный набор байтов, слов или двойных слов максимальной длины до 4 Гбайт.

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

Неупакованный двоично-десятичный тип - байтовое представление десятичной цифры от 0 до 9. Неупакованные десятичные числа хранятся как байтовые значения без знака по одной цифре в каждом байте. Значение цифры определяется младшим полубайтом.

Упакованный двоично-десятичный тип представляет собой упакованное представление двух десятичных цифр от 0 до 9 в одном байте. Каждая цифра хранится в своем полубайте. Цифра в старшем полубайте (биты 4-7) является старшей.

Константы в ассемблере имеют 8- или 16-битовое внутренное

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

 

В ассемблере применимы константы следующих типов:

- десятичное число (можно закончит '.')

  Пример: 123 234 456  123456.

  Intel style decimal format: xxxxD не реализован так как ест опасность

  совершит ошибку. Например: забыть $ и написать только 123d тогда

  транслатор не предупредит вас а сгенерирует 123. Так как использование

  таких констант (десятичных окончивающих на D) практически не

  используется то он не реализован.

 

- шестнадцатеричное число

    - C style:   начинается "0x" пример: 0xAB 0x1234 0xF21234

    - Motorola style: начинается "$" пример: $AB $1234 $F21234

    - Intel style: заканчивается H пример: 0ABh 1234H 0F21234h

 

- двоичное число

    - Motorola Style: начинается "%" пример: %11 %01 %10001

    - pseudo C style: начинается "0i" пример: 0i11 0i1 0i10001

    - pseudo Intel style: заканчивается I ...: 11I 1i 10001I

    - Intel style: заканчивается B пример: 11B 1b 10001b

      (этот формат потенциально опасен (например 1b такая же ошибка

       если не указали $ как и уже описанная ситуация при xxxxD),

       но так как этот формат используется то он реализован. За

       это нужно написать директиву .intelbin)

 

- восмеричное число

    - Motorola Style: начинается "@" пример: @123 @232 @021

    - pseudo C style: начинается "0o" пример: 0o123 0o232 0o021

    - pseudo C style: начинается "0Q" пример: 0Q123 0q232 0Q021

    - Intel style: заканчивается o или Q пр.: 123q 0232Q 21o

    ! C style не поддерживяается (т.е. 0123 не восмеричная константа)

 

- символ - заключается в апострофы и

  константе присваивается значение, равное ASCII-коду символа.

  Символ апострофа в качестве константы удваивается.

  Можно использовать ' и ".

      

Используя служебные слова, в программе на ассемблере можно резервировать определенное количество байт, которые потом можно использовать для хранения каких-либо данных. Вот эти служебные слова: DB - резервировать байт, DW — резервировать слово (два байта), DD - резервировать двойное слово (четыре байта), DQ - резервировать восемь байт, DT - резервировать десять байт. Причина использования меток для имен переменных, подпрограмм и конкретных инструкций очевидна. Ведь в противном случае мы не могли бы ссылаться по именам на эти элементы программ. В равной степени важна, но менее очевидна, необходимость присваивать меткам значения и текстовые строки. Присвоить метке числовое значение или текстовую строку позволяет директива EQU. Ссылка на метку директивы EQU транслируется в литеральное приравнивание. Присвоить метке числовое значение или текстовую строку позволяет директива EQU. Ссылка на метку директивы EQU транслируется в литеральное приравнивание. Директиву EQU можно использовать для присваивания метке текстовой строки или значения.

        Директива = аналогична директиве EQU во всех отношениях, кроме одного: в то время как метки, определенные с помощью директивы EQU, переопределять не допускается (в этом случае происходит ошибка), метку, определенную с помощью директивы =, можно свободно переопределять. При вычислении всех операндов директивы = должно получаться числовое значение - в отличие от директивы EQU с помощью директивы = меткам нельзя присваивать текстовые строки.

       Пример использования EQU: TABLE_OFFSET  EQU 1


 


Дата добавления: 2020-01-07; просмотров: 326; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!