Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

СТРУКТУРА_ПРОГРАММ_НА_АССЕМБЛЕРЕ

.pdf
Скачиваний:
10
Добавлен:
24.03.2015
Размер:
48.07 Кб
Скачать

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

Общая структура программы на ассемблере имеет следующий вид:

(тут типа схема).

Сегментная организацияпрограмм.

Сегмент это область памяти, начинающийсяна границе параграфа, т.е. по любому адресу, кратному 16, и имеет размер не более 64 килобайт. Имеются 3 особых для программы сегмента:

Сегмент кодов: содержит машинные команды к исполнению. Обычно первая выполняемаякоманда находится в начале сегмента, и ОС передаёт управление по адресу данного сегмента для инициализациипрограммы.

Сегмент данных: содержит определённыеданные, константы и рабочие области, необходимые программе.

Сегмент стека: стек хранит адреса возврата для программы при возврате в ОС, и для вызовов подпрограммпри возврате в вызывающую программу.

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

В соответствиис имеющимисядирективамив ассемблере разрешено определениеданных различной длины: например, директива DB определяет байт, а директива DW определяет слово. Элемент данных может содержать непосредственноезначение или константу, определённуюкак символьная строка или как числовое значение. Способом определения константы является непосредственнозначение, т.е. указанное прямо в ассемблернойкоманде. Например: MOV AL, 20h.В этом случае число 20 становится частью машинного объектного кода. Непосредственноезначение ограничено одним байтом или одним словом, но там, где оно может быть применено, оно является более эффективным, чем использованиеконстанты.

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

Директива ассемблера.

Существуюткоманды и директивы. Формат их практическиодинаков:

<имя> мнемокод операнда; комментарии. Имя команды интерпретируетсякак метка и определяетсядвоеточием. Имя команды или

директивы должно начинаться с буквы a-z, A-Z , допустимы цифры 0-9, но они не должны совпадать с зарезервированнымисловами языка. Мнемокод это обязательныйэлемент формата, имя и операнда не обязательны. Их написание зависит от команды или

директивы. Команда всегда генерирует машинный код, который управляет работой микропроцессора. Директива (псевдокоманда) управляет работой компилятора(или компоновщика) и не управляет работой микропроцессора. Директивы имеют разный синтаксис в режимах MASM, TASMи FASM. Команды языка Ассемблер.

Комментариив программе.

Использованиекомментариевв программе улучшают её ясность, особенно там, где назначение набора команд непонятно. Комментариивсегда начинаются на любой строке исходного модуля с символа «;». В этом случае ассемблер полагает, что все символы, находящиесясправа «;» являются комментарием. Комментарийможет занимать всю строку или следовать за командой на той же строке, как показано в примерах:

• …; эта строка является комментарием

• Add ax,bx ;комментарийна одной строке с командой

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

Многие команды имеют два операнда: первой может быть регистр или адрес памяти, а второй непосредственнаяконстанта. Команда mov ax,0123h пересылает непосредственную16-ричную константу 0123 регистру ax. Код для этой команды означает

«переслать непосредственноезначение в регистр ax», а следующие два байта содержа само значение. Использованиенепосредственногооперанда более эффективно, чем определениечисловой константы в сегменте данных и организацияссылки на неё в операнде команды mov. Например:

Сегмента данных: AMT1 dw 0123h сегмент кодов: mov ax, AMT1

Длина непосредственнойконстанты зависит от длины первого операнда. Например, следующий непосредственныйоперанд является двухбайтовым, но регистр al имеет только один байт: mov al, 0123h (ошибка). Однако если непосредственныйоперанд короче, чем получаемыйоперанд (как в следующем примере) add ax, 25h (нет ошибки), то ассемблер расширяет непосредственныйоперанд до двух байт и записывает объектный код в виде 2500. Непосредственнаяконстанта может быть 16-ричной

(0123h), 10-ной (291) или двоичной (10010001). Ниже приведён список команд, которые допускают непосредственныеоперанды.

Команды пересылки и сравнения: mov, cmp. Арифметическиекоманды: adc, add, sbb, sub.

Команды сдвига: rcl, rcr, rol, ror, shl, sar, shr.

Логические команды: end, or, test, xor. Адресация операндов команд.

При программированиина ассемблере можно использоватьразличные способы адресации операндов команд. Процессор i386 поддерживает11 режимов адресации. Рассмотрим некоторые из них:

Регистры режима адресации: в команде два

операнда регистра; mov al, bl

Непосредственнорежим адресации: второй операнд константа; mov al, 10h

Косвенная адресация: [bx][dx]; используются только регистры базы, в которой хранится смещение относительноначала блока; mov [bx], 0 ; 0 запишется в память по адресу, указанному в регистре bx. Если в bx – 1000, то в op по адресу 1000 запишется 0. Основные базовые адреса в Intel программах хранятся в регистре сегментов (в данном случае базовый адрес хранится в регистре ds)

Косвенные со смещением: используютсярегистры базы, в котором хранится смещение относительно начала блока и явное или неявное представление этого смещения относительноэтого регистра; [bx] +4 (4 - явное) или [bx]-4*a (4*a -неявное): mov [4*a]; 0 запишется по адресу 1004, если bx = 1000; mov [-4*a] ; 0 запишется по выделенномуадресу

Индексный: указываетсяиндекс регистра di или si, если нужно, то делается смещение [di]+ смещение или [si]+ смещение

Индексное базирование: [bx][dx]+ смещение ; адрес формируетсяпутём сложения содержимого базового регистра с содержимыминдексного регистра и смещения

Команда пересылки mov.

Мнемокод: mov <приёмник>,<источник>

В качестве приёмника информациимогут служить регистр или поименованнаяобласть памяти, которое может быть задано как непосредственно, так и

известными способами задания адреса. Mov ax,0

mov [bx],0

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

Команды работы со стеком push и pop.

Стек это область памяти, организованнаядля хранения и извлечения данных по принципу «последним пришёл первым вышел». Стек используетсядля промежуточногохранения данных и адресов и для передачи параметров в процедуры. Команда push запоминает 16-разрядный операнд в стек, а команда pop его извлекает.

Push fbc push ax push bx pop bx pop ax pop fbc

Хотя мы и переслали информацию, но в регистре информацияне изменилась. Команда push a запоминает все регистры в стек строго в такой последовательности: ax, cx, dx, bx, cp, bp, si, di.А

команда pop a извлекает все эти регистры в обратной последовательности. Команда push f запоминает в стеке, а команда Pop f восстанавливаетиз стека регистр флагов flax. Этим командам операнды не нужны.

Push f pop f. A4d3