48264 (Программная модель процессоров семейства X86), страница 2
Описание файла
Документ из архива "Программная модель процессоров семейства X86", который расположен в категории "". Всё это находится в предмете "информатика" из , которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "книги и методические указания", в предмете "информатика, программирование" в общих файлах.
Онлайн просмотр документа "48264"
Текст 2 страницы из документа "48264"
Логическая интерпретация этих типов:
-
Целый тип со знаком — двоичное значение со знаком, размером 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) является старшей.
Рис. 4. Основные логические типы данных микропроцессора
Язык микроопераций. Ассемблер.
Структура программы на ассемблере:
Model small ;модель программы, или же количество памяти на сегмент
.data ;сегмент данных
;описание переменных
.stack 100h ;сегмент стека
.code ;сегмент данных
;процедуры, макрокоманды
main:
;основная программа
end main
Директивы резервирования памяти
Для описания простых типов данных в программе используются специальные директивы резервирования и инициализации данных, которые, по сути, являются указаниями транслятору на выделение определенного объема памяти. Если проводить аналогию с языками высокого уровня, то директивы резервирования и инициализации данных являются определениями переменных.
Машинного эквивалента этим директивам нет; просто транслятор, обрабатывая каждую такую директиву, выделяет необходимое количество байт памяти и при необходимости инициализирует эту область некоторым значением.
Директивы резервирования и инициализации данных простых типов имеют формат:
Рис. 5. Директивы описания данных простых типов
На рис. 5 использованы следующие обозначения:
-
? показывает, что содержимое поля не определено, то есть при задании директивы с таким значением выражения содержимое выделенного участка физической памяти изменяться не будет. Фактически, создается неинициализированная переменная;
-
значение инициализации — значение элемента данных, которое будет занесено в память после загрузки программы. Фактически, создается инициализированная переменная, в качестве которой могут выступать константы, строки символов, константные и адресные выражения в зависимости от типа данных. Подробная информация приведена в приложении 1;
-
выражение — итеративная конструкция с синтаксисом, описанным на рис. 5.17. Эта конструкция позволяет повторить последовательное занесение в физическую память выражения в скобках n раз.
-
имя — некоторое символическое имя метки или ячейки памяти в сегменте данных, используемое в программе.
-
db — резервирование памяти для данных размером 1 байт. Директивой db можно задавать следующие значения:
-
выражение или константу, принимающую значение из диапазона:
-
для чисел со знаком –128...+127;
-
для чисел без знака 0...255;
-
-
-
символьную строку из одного или более символов. Строка заключается в кавычки. В этом случае определяется столько байт, сколько символов в строке.
dw — резервирование памяти для данных размером 2 байта. Директивой dw можно задавать следующие значения:
-
выражение или константу, принимающую значение из диапазона:
-
для чисел со знаком –32 768...32 767;
-
для чисел без знака 0...65 535;
-
выражение, занимающее 16 или менее бит, в качестве которого может выступать смещение в 16-битовом сегменте или адрес сегмента;
1- или 2-байтовую строку, заключенная в кавычки.
dd — резервирование памяти для данных размером 4 байта. Директивой dd можно задавать следующие значения:
-
выражение или константу, принимающую значение из диапазона:
-
для i386 и выше:
-
для чисел со знаком –2 147 483 648...+2 147 483 647;
-
для чисел без знака 0...4 294 967 295;
-
-
относительное или адресное выражение, состоящее из 16-битового адреса сегмента и 16-битового смещения;
строку длиной до 4 символов, заключенную в кавычки.
df — резервирование памяти для данных размером 6 байт;
dp — резервирование памяти для данных размером 6 байт. Директивами df и dp можно задавать следующие значения:
-
выражение или константу, принимающую значение из диапазона:
-
для чисел со знаком –2 147 483 648...+2 147 483 647;
-
для чисел без знака 0...4 294 967 295;
-
относительное или адресное выражение, состоящее из 32 или менее бит (для i80386) или 16 или менее бит (для младших моделей микропроцессоров Intel);
адресное выражение, состоящее из 16-битового сегмента и 32-битового смещения;
строку длиной до 6 байт, заключенную в кавычки.
dq — резервирование памяти для данных размером 8 байт. Директивой dq можно задавать следующие значения:
-
относительное или адресное выражение, состоящее из 32 или менее бит
-
константу со знаком из диапазона –263...263–1;
-
константу без знака из диапазона 0...264–1;
-
строку длиной до 8 байт, заключенную в кавычки.
dt — резервирование памяти для данных размером 10 байт. Директивой dt можно задавать следующие значения:
-
относительное или адресное выражение, состоящее из 32 или менее бит
-
адресное выражение, состоящее из 16-битового сегмента и 32-битового смещения;
-
константу со знаком из диапазона –279...279-1;
-
константу без знака из диапазона 0...280-1;
-
строку длиной до 10 байт, заключенную в кавычки;
-
упакованную десятичную константу в диапазоне 0...99 999 999 999 999 999 999.
Очень важно уяснить себе порядок размещения данных в памяти. Он напрямую связан с логикой работы микропроцессора с данными. Микропроцессоры Intel требуют следования данных в памяти по принципу: младший байт по младшему адресу.
Для иллюстрации данного принципа рассмотрим листинг 1, в котором определим сегмент данных. В этом сегменте данных приведено несколько директив описания простых типов данных.
Листинг 1. Пример использования директив резервирования и инициализации данных. Программа вводит строку с клавиатуры.
model small
.stack 100h
.data
message db 'Массив байт, содержащих символьные переменные',10,13 '$'
po db 1, 3, 4, 5, 0fh, 0bh, 32, 01011b
perem_1 db 0ffh
perem_2 dw 3a7fh
perem_3 dd 0f54d567ah
k1 db 10
k2 db ?
mas db 10 dup ('?')
adr dw k1
adr_full dd perem_3
.code
start:
mov ax,@data
mov ds,ax
mov ah,0ah
mov dx,offset message ; mov dx, adr
int 21h
mov ax,4c00h
int 21h
end start
Система команд
Формат предложения ассемблера
[имя метки:] КОП [операнд1] [,операнд2] [;комментарии]
Команды пересылки данных
mov , | ||
можно | Нельзя | Должно быть |
mov ах, вх; ах:=вх mov ах,0а2h; ах:= 0а2h mov per1,ax | mov ax,bh mov per1, per2 mov ds,per1 mov cs,ds mov cs,ax; пара cs:ip содержит адрес следующей команды | mov ah, bh mov al, per2 mov per1,al mov ax, per1 mov ds,ax mov ax,ds либо push ds mov cs,ax pop cs |
xchg , ; двунаправленный обмен данными а:=в; в:=с; с:=а
xchg dl,dh; меняет местами данные
Команды ввода-вывода в порт
in аккумулятор,номер_порта — ввод в аккумулятор из порта
out порт,аккумулятор — вывод содержимого аккумулятора в порт
Команды работы с адресами и указателями памяти
lea назначение,источник — загрузка эффективного адреса источника в регистр-назначение;
lea dx, x ; аналогично команде mov dx,offset x
lds назначение,источник — загрузка эффективного адреса источника в регистр назначения и загрузка указателя (адрес сегмента где содержится источник) в регистр сегмента данных ds;
les назначение,источник —-//-регистр дополнительного сегмента данных es;
lgs назначение,источник — -//- регистр дополнительного сегмента данных gs;
lfs назначение,источник — -//- регистр дополнительного сегмента данных fs;
lss назначение,источник — -//- регистр сегмента стека ss.
les dx,per1 ;полный указатель на per1 в пару es:dx
Команды работы со стеком
Для работы со стеком предназначены три регистра:
ss — сегментный регистр стека;
sp/esp — регистр указателя стека;
bp/ebp — регистр указателя базы кадра стека.
push источник — запись значения источник в вершину стека.
Алгоритм работы:
-
уменьшить значение указателя стека esp/sp на 4/2 (в зависимости от значения атрибута размера адреса — use16 или use32);
-
записать источник в вершину стека (адресуемую парой ss:esp/sp).
Размер записываемых значений — слово или двойное слово. Также в стек можно записывать непосредственные значения. В стек можно класть значение сегментного регистра cs. Другой интересный момент связан с регистром sp. Команда push esp/sp записывает в стек значение esp/sp по состоянию до выдачи этой команды
Команда push используется совместно с командой pop для записи значений в стек и извлечения их из стека
pop назначение — запись значения из вершины стека по месту, указанному операндом назначение. Значение при этом “снимается” с вершины стека.
Push ax
Push bx
push cx
…
p
ss:bp
op cxpop bx
pop ax
push ax
pop bx ; аналогично команде mov bx,ax
pusha - размещение в стеке регистров общего назначения в следующей последовательности: ax, cx, dx, bx, sp, bp, si, di
pushad - размещение в стеке регистров общего назначения в следующей последовательности: eax, ecx, edx, ebx, esp, ebp, esi, edi
pushf - размещение в вершине стека (ss:sp) содержимого регистра флагов flags