Смекни!
smekni.com

Программная модель процессоров семейства X86 (стр. 2 из 9)

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

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

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

Физическая интерпретация данных простого типа основывается на размерности данных:

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

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

· двойное слово — последовательность из четырех байт (32 бита), расположенных по последовательным адресам.

· учетверенное слово — последовательность из восьми байт (64 бита), расположенных по последовательным адресам.

·

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

Логическая интерпретация этих типов:

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

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

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

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

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

o байт — от 0 до 255;

o слово — от 0 до 65 535;

o двойное слово — от 0 до 232–1.

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

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

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

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

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

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

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

-

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

Язык микроопераций. Ассемблер.

Структура программы на ассемблере:

Modelsmall ;модель программы, или же количество памяти на сегмент

.data;сегмент данных

;описание переменных

.stack 100h;сегмент стека

.code ;сегмент данных

;процедуры, макрокоманды

main:

;основная программа

endmain

Директивы резервирования памяти

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

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

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

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

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

· ? показывает, что содержимое поля не определено, то есть при задании директивы с таким значением выражения содержимое выделенного участка физической памяти изменяться не будет. Фактически, создается неинициализированная переменная;

· значение инициализации — значение элемента данных, которое будет занесено в память после загрузки программы. Фактически, создается инициализированная переменная, в качестве которой могут выступать константы, строки символов, константные и адресные выражения в зависимости от типа данных. Подробная информация приведена в приложении 1;

· выражение — итеративная конструкция с синтаксисом, описанным на рис. 5.17. Эта конструкция позволяет повторить последовательное занесение в физическую память выражения в скобках n раз.

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

· db— резервирование памяти для данных размером 1 байт. Директивой db можно задавать следующие значения:

o выражение или константу, принимающую значение из диапазона:

- для чисел со знаком –128...+127;

- для чисел без знака 0...255;

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

· dw — резервирование памяти для данных размером 2 байта. Директивой dw можно задавать следующие значения:

o выражение или константу, принимающую значение из диапазона:

- для чисел со знаком –32 768...32 767;

- для чисел без знака 0...65 535;

o выражение, занимающее 16 или менее бит, в качестве которого может выступать смещение в 16-битовом сегменте или адрес сегмента;

o 1- или 2-байтовую строку, заключенная в кавычки.

· ddрезервирование памяти для данных размером 4 байта. Директивой dd можно задавать следующие значения:

o выражение или константу, принимающую значение из диапазона:

- для i386 и выше:

- для чисел со знаком –2 147 483 648...+2 147 483 647;

- для чисел без знака 0...4 294 967 295;

o относительное или адресное выражение, состоящее из 16-битового адреса сегмента и 16-битового смещения;

o строку длиной до 4 символов, заключенную в кавычки.

· df — резервирование памяти для данных размером 6 байт;

· dpрезервирование памяти для данных размером 6 байт. Директивами df и dp можно задавать следующие значения:

o выражение или константу, принимающую значение из диапазона:

- для чисел со знаком –2 147 483 648...+2 147 483 647;

- для чисел без знака 0...4 294 967 295;

o относительное или адресное выражение, состоящее из 32 или менее бит (для i80386) или 16 или менее бит (для младших моделей микропроцессоров Intel);

o адресное выражение, состоящее из 16-битового сегмента и 32-битового смещения;

o строку длиной до 6 байт, заключенную в кавычки.

· dq — резервирование памяти для данных размером 8 байт. Директивой dq можно задавать следующие значения:

o относительное или адресное выражение, состоящее из 32 или менее бит

o константу со знаком из диапазона –263...263–1;

o константу без знака из диапазона 0...264–1;

o строку длиной до 8 байт, заключенную в кавычки.

· dt — резервирование памяти для данных размером 10 байт. Директивой dt можно задавать следующие значения:

o относительное или адресное выражение, состоящее из 32 или менее бит

o адресное выражение, состоящее из 16-битового сегмента и 32-битового смещения;

o константу со знаком из диапазона –279...279-1;

o константу без знака из диапазона 0...280-1;

o строку длиной до 10 байт, заключенную в кавычки;

o упакованную десятичную константу в диапазоне 0...99 999 999 999 999 999 999.

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

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

Листинг 1. Пример использования директив резервирования и инициализации данных. Программа вводит строку с клавиатуры.modelsmall.stack 100h.datamessage db 'Массив байт, содержащих символьные переменные',10,13 '$'po db 1, 3, 4, 5, 0fh, 0bh, 32, 01011bperem_1 db 0ffh perem_2 dw 3a7fhperem_3 dd 0f54d567ahk1 db 10k2 db ?mas db 10 dup ('?')adr dw k1adr_full dd perem_3.codestart:mov ax,@data mov ds,ax mov ah,0ah mov dx,offset message ; mov dx, adr int 21h mov ax,4c00h int 21h

endstart