- •ПЕРЕЧЕНЬ СОКРАЩЕНИЙ
- •ПРЕДИСЛОВИЕ
- •Регистр флагов
- •Программа вывода строки
- •Примеры резервирования памяти
- •Регистровая адресация
- •Непосредственная адресация
- •Прямая адресация
- •Косвенная регистровая адресация
- •Адресация по базе
- •Пример программы задержки выполнения
- •Сложение, вычитание, умножение, деление
- •Рис. 15.1. Структурная схема ввода данных с клавиатуры
- •Пример программы для ввода с клавиатуры
- •Пример посимвольного ввода
- •Сортировка выбором
- •Сортировка вставками
- •Использование параметров в макрокомандах
- •Библиографический список
- •Приложение 1
- •Перечень команд
- •Приложение 2
Адрес текущего байта программы, извлекаемого из памяти, определяется суммой адресов, хранящихся в регистре кодового сегмента (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
