Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Основы программирования на Ассемблере. Учебное пособие.pdf
Скачиваний:
0
Добавлен:
11.08.2026
Размер:
607 Кб
Скачать

Адрес текущего байта программы, извлекаемого из памяти, определяется суммой адресов, хранящихся в регистре кодового сегмента (CS) и указателе команд (IP). В регистре IP хранится 16-битовый адрес байта (смещение) в кодовом сегменте, к которому микропроцессор должен обратиться:

CS · 16 + IP –указатель команд.

Аналогично определяются адреса в памяти данных и стека:

DS · 16 + SI(DI,BX);

SS · 16 + SP – указатель стека, указывает на последнее значение, записанное в стеке.

Один и тот же физический адрес в памяти может быть представлен различными значениями CS и IP.

Связь с внешними устройствами осуществляется через специальные тристабильные схемы, называемые буферами.

Текущий байт программы направляется в очередь команд: шесть однобайтовых регистров, расположенных конвейером (по принципу «первым вошел – первым вышел», или FIFO). Конвейер позволяет одновременно выполнять команду из очереди и загружать следующую, повышая производительность МП.

РЕГИСТР ФЛАГОВ

По результатам операций АЛУ аппаратно устанавливает либо сбрасывает отдельные биты в регистре флагов. Слово состояния процессора (PSW) приведено на рис. 1.2.

15

 

 

 

 

 

 

 

 

 

 

0

 

 

 

 

OF

DF

IF

TF

SF

ZF

x

AF

х

PF

х

CF

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рис. 1.2. Слово состояния процессора

Значения флагов

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

CF – флаг переноса (Carry) устанавливается, если в результате выполнения операции из старшего бита переносится или занимается

7

единица при сложении или вычитании, иначе (CF) = 0. На CF влияют также команды сдвига и умножения;

PF – флаг четности (Parity); (PF) = 1, если сумма по модулю два всех битов результата равна нулю (число единичных битов четное);

AF – флаг дополнительного переноса (Auxiliary) устанавливается, если есть перенос из старшего бита младшей тетрады (бит D3) в младший бит старшей тетрады (бит D4). Используется в операциях над

упакованными BCD числами;

ZF – флаг/признак нулевого результата (Zero), устанавливается в единицу, если получен нулевой результат, иначе (ZF) = 0;

SF – флаг знака результата (Sign) равен единице, если результат отрицательный, т. е. он дублирует старший знаковый бит результата;

TF – флаг трассировки (отладки). Если этот флаг установлен в единичное состояние, то процессор переходит в режим пошагового выполнения команд, т. е. после выполнения каждой команды генерируются внутренние прерывания (тип 1) через вектор, расположенный

по адресу 04.

IF – флаг разрешения прерывания. Если флаг установили в единицу, то прерывания микропроцессора от внешних устройств разрешены (микропроцессор распознает маскируемые прерывания).

DF – флаг направления. Применяется в командах манипуляции строками, если флаг равен нулю, то строка обрабатывается от элемента, имеющего наименьший адрес к наибольшему. Если флаг равен 1, то строка обрабатывается наоборот.

OF – флаг переполнения (Overflow) устанавливается, если результат операции превысит одноили двухбайтовый диапазон чисел со знаком, а также в некоторых других случаях.

Флаги CF, DF, IF можно изменять программно:

команды STC, STD, STI устанавливают соответствующие флаги в 1; команды CLC, CLD, CLI сбрасывают соответствующие флаги в 0. Рассмотрим в качестве примера сложение двух однобайтовых

чисел:

125 + 4 = 129. Значение 129 выходит за пределы (–128 – +127) чисел со знаком (для беззнаковых чисел 129 – корректный результат).

0 1 1 1 1 1 0 1 = +125; 0 0 0 0 0 1 0 0 = +4;

1 0 0 0 0 0 0 1 = +129 > +128 (или –127, т. е. отрицательное число).

8

Перенос в бит D7 равен единице. В результате сложения чисел установятся флаги (OF) = 1, (CF) = 0, (ZF) = 0, (SF) = 1, (PF) = 0, (AF) =

1.

2. СТРУКТУРА И ОБРАЗ ПАМЯТИ ПРОГРАММЫ ТИПА .EXE И .COM

Программы, выполняемые под управлением MS-DOS, могут принадлежать к одному из двух типов, которым соответствуют расширения имен программных файлов .COM и .EXE [5,7] . Программа типа

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

Образ памяти программы типа .EXE

 

 

 

представлен на рис. 2.1.

 

ES DS

PSP

 

PSP – префикс программного сег-

 

Сегмент

 

мента (длина 256 байт), образуется и

CS

Команд

IP

заполняется системой, содержит поля

 

 

 

данных и таблицы, используемые си-

 

 

 

стемой.

 

 

 

Сегмент

 

Регистры ES и DS содержат началь-

 

Данных

 

ный адрес области PSP. Регистр CS

 

 

 

содержит

начальный адрес

сегмента

 

 

 

команд. Регистр SS содержит началь-

 

 

 

 

Сегмент

 

ный адрес сегмента стека. Указатель

 

 

SS

Стека

 

стека SP

указывает на «дно» стека.

 

В указатель команд IP загружается от-

 

 

 

носительный адрес точки входа в про-

 

 

SP

грамму. После загрузки программы в

 

 

 

 

память адресуемыми оказываются все

Рис. 2.1. Образ памяти про-

сегменты,

кроме сегмента

данных.

Первые строки программы типа . EXE

граммы типа . EXE

 

содержат, как правило, инициализацию регистра DS.

2.1. СТРУКТУРА ПРОГРАММЫ ТИПА . EXE

9

Структура типичной программы типа . EXE на языке Ассемблера выглядит следующим образом (строки пронумерованы для последующего анализа программы, при написании программ нумеровать строки не надо).

1.

title наименование программы

2.

text segment

‘code’

3.

assume

CS: text, DS: data

4.

myproc proc

 

5.

mov AX, data

инициализация регистра DS

6.

mov DS, AX

 

…………………….

 

7.

myproc endp

 

8.

text ends

 

-------------------------------------------

9.data segment

…………………….

10.data ends

-------------------------------------------

11. stacksegment

stack ‘stack’

12.dw 128 dup(0)

13.stackends

14.end myproc

Рассмотрим структуру приведенной программы. Оператор title позволяет присвоить программе наименование. Программа состоит из трех сегментов: команд – с произвольным именем text, сегмента данных с именем data, сегмента стека с именем stack.

Строка 2 – идентификатор программного сегмента: слово в апострофах указывает класс программный. Класс анализируется компо-

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

Строка 3 – сопоставляет сегментные регистры и адресуемые ими сегменты.

Строка 4 – задает имя новой процедуры (как правило, программы состоят из процедур).

Строка 5–6 – инициализирует сегмент данных (настраиваем регистр данных на начало сегмента данных):

а) пересылает адрес сегмента данных в аккумулятор;

10

б) пересылает значение из аккумулятора в регистр сегмента данных.

Строка 7 – отмечает конец процедуры. Строка 8 – отмечает конец сегмента команд. Строка 9 – отмечает начало сегмента данных. Строка 10 – отмечает конец сегмента данных.

Строка 11 – описывает сегмент стека (тип объединения и класс сегмента).

Тип сегмента обязателен для инициализации регистра сегмента стека (SS – начало сегмента стека) и указателя стека (SP – смещение конца сегмента стека).

Строка 12 – резервирует 128 слов памяти для стека, заполненных нулями.

Строка 13 – указывает конец сегмента стека.

Строка 14 (директива end) – заканчивает текст программы и указывает точку входа в главную процедуру myproc (для настройки указателя команд IP).

2.2. СТРУКТУРА И ОБРАЗ ПАМЯТИ ПРОГРАММЫ ТИПА .COM

Образ памяти программы типа .COM представлен на рис. 2.2.

CS DS ES SS

PSP

 

 

Сегмент

IP = 100h

 

Команд

 

 

 

и

 

 

Данных

 

 

 

 

 

Сегмент

SP = FFFEh

 

Стека

 

Рис. 2.2. Образ памяти программы типа .COM

После загрузки программы все сегментные регистры указывают на начало единственного сегмента (фактически на начало PSP, который

11

занимает 256 байт или 100h байт). Указатель стека автоматически инициализируется числом FFFEh. После загрузки системы регистр IP всегда инициализируется числом 100h , поэтому сразу за PSP должна стоять первая выполнимая строка программы.

Структура типичной программы типа .COM на языке Ассемблера выглядит следующим образом.

Title

наименование

text

segment

‘code’

assume

CS: text, DS: text

org

100h (резервирует 256 байт PSP)

myproc

proc

 

…………………….

myproc endp

……………определения данных……….

text

ends

end

myproc

Описание строк идентично тому, которое было использовано для программ типа . EXE. Оператор org 100h предназначен для резервирования памяти в 256 байт области PSP.

В качестве примера рассмотрим программу типа COM сложения двух чисел 250 и 125, содержащихся в переменных FLDA и FLDB, с записью результата в переменную FLDC.

12

TITLE COM-программа для пересылки и сложения

CODESG SEGMENT PARA 'Code'

ASSUME CS:CODESG,DS:CODESG,SS:CODESG,ES:CODESG

ORG

100H

;Начало в конце PSP

BEGIN: JMP

MAIN

;Обход через данные

; ---------------------------------------------------

 

 

 

 

FLDA

DW

 

250

;Определение данных

FLDB

DW

 

125

 

FLDC

DW

 

?

 

; ---------------------------------------------------

 

 

 

 

MAIN

PROC NEAR

 

MOV

 

AX, FLDA

;Переслать 0250 в AX

ADD

AX, FLDB

;Прибавить 0125 к AX

MOV

 

FLDC, AX

;Записать сумму в FLDC

RET

 

;Вернуться в DOS

MAIN

ENDP

 

CODESG ENDS

 

END

BEGIN

 

3. ПРОЦЕСС ПОДГОТОВКИ ПРОГРАММЫ НА АССЕМБЛЕРЕ

Процесс подготовки программы на языке Ассемблера включает следующие этапы.

1.Подготовка текстовым редактором текста программы с расширением .asm.

2.Трансляция программы, например, с помощью Ассемблера TASM.exe (MASM.exe), с целью получения объектного кода.

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

4.Отладка готовой программы с помощью любого отладчика

(CV. еxe).

Например, если название файла исходного текста программы p1.asm, то строка вызова для компилятора Ассемблера имеет вид Tasm /z/zi/N p1, p2, p3, где z – первый ключ, разрешает вывод на экран

строк, содержащих ошибки;

13

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]