Министерство образования и науки Российской Федерации Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования «Сибирская государственная автомобильно-дорожная академия (СибАДИ)»
Л. Е. Олейник
ЯЗЫКИ
ПРОГРАММИРОВАНИЯ
Учебное пособие
Часть 3
СДВИГОВЫЕ ОПЕРАЦИИ. ДАННЫЕ СО ЗНАКОМ И БЕЗ ЗНАКА. ВВОД-ВЫВОД НА ДИСК
Омск
СибАДИ
2012
ББК 32.973.2 УДК 681.3.06 О 53
Рецензенты:
д-р физ.-мат. наук, проф. А.К. Гуц (ОмГУ) канд. техн. наук Д.Н. Лавров (ОмГУ)
д-р техн. наук, доц. В.Н.Задорожный (ОмГТУ)
Работа одобрена редакционно-издательским советом академии в качестве учебного пособия.
Олейник, Л.Е.
О 53 Языки программирования : учебное пособие: в 15-ти ч. Часть 3 : Сдвиговые операции. Данные со знаком и без знака. Ввод-вывод на диск /
Л. Е. Олейник. Омск : СибАДИ, 2012.– 120 с.
Учебное пособие является третьей частью комплекта пособий из 15-ти частей по курсу «Языки программирования», изучаемому в ФГБОУ ВПО «СибАДИ» по направлению подготовки 230100.62 «Информатика и вычислительная техника», профиль «Автоматизированные системы обработки информации и управления».
Предназначается для студентов очной формы обучения (специалист, бакалавр) при выполнении работ по дисциплинам «Электронные вычислительные машины и периферийные устройства», «Системное программное обеспечение», «Системы реального времени», «Языки программирования» в компьютерных классах и при выполнении индивидуальных заданий на самостоятельную работу; преподавателем при подготовке и проведении работ в компьютерных классе.
Может использоваться желающими самостоятельно изучить программирование на ассемблере.
Табл. 19. Ил.1. Библиогр.: 3 назв.
2
© ФГБОУ ВПО «СибАДИ», 2012
3
  | 
	ОГЛАВЛЕНИЕ  | 
	
  | 
ВВЕДЕНИЕ........................................................................................................................  | 
	4  | 
|
1.  | 
	ЗАДАНИЕ НА ПРОГРАММИРОВАНИЕ (ОБЩАЯ ЧАСТЬ) .......................................  | 
	7  | 
2.  | 
	РАЗЛИЧИЯ МЕЖДУ ПРОГРАММАМИ В EXE- И COM-ФАЙЛАХ.........................  | 
	13  | 
3.  | 
	СДВИГИ И ЦИКЛИЧЕСКИЕ СДВИГИ.......................................................................  | 
	20  | 
4.  | 
	ПРОГРАММИРОВАНИЕ ОБРАБОТКИ ДИСКОВЫХ ФАЙЛОВ..............................  | 
	24  | 
5.  | 
	АРИФМЕТИЧЕСКИЕ ОПЕРАЦИИ НАД ЦЕЛЫМИ ДВОИЧНЫМИ ЧИСЛАМИ  | 
	
  | 
СО ЗНАКОМ......................................................................................................................  | 
	40  | 
|
6.  | 
	ДОПОЛНИТЕЛЬНЫЕ СВЕДЕНИЯ..............................................................................  | 
	46  | 
7.  | 
	ТИПИЧНЫЕ ОШИБКИ ПРИ ВЫПОЛНЕНИИ РАБОТЫ...........................................  | 
	49  | 
ЗАКЛЮЧЕНИЕ……………………………………………………………………………….  | 
||
Приложение 1. ПРИМЕРЫ (ТЕКСТЫ) ПРОГРАММ......................................................  | 
	59  | 
|
Приложение 2. Пример работы №3...................................................................................  | 
	69  | 
|
Приложение 3. Формулы (3-я работа).............................................................................  | 
	890  | 
|
Приложение 4. Редактирование, ассемблирование и компоновка программы.  | 
	..90  | 
|
Приложение 5. Арифметические и логические операции в микропроцессорах  | 
	
  | 
|
МП8086 и МП80386…………………………….....………………………………..……..93  | 
||
Приложение 6. Арифметические и логические операции в микропроцессорах  | 
	
  | 
|
МП8086 и МП80386 над числами со знаком…………………………………………..111  | 
||
4
ВВЕДЕНИЕ
Учебное пособие включает описания лабораторных работ, выполняемых на языке низкого уровня (язык ассемблера для микропроцессоров 8086 и 80386) под управлением операционных систем MS-DOS, Windows 95 (или выше: Windows 98 или Windows 2000) и Linux.
Состоит из 15-ти частей, каждая из которых содержит:
-демонстрационные примеры, используемые преподавателем при проведении работы в компьютерном классе (могут также использоваться при самостоятельном изучении);
-сведения, необходимые для выполнения работы;
-задание на программирование (общая часть);
-формулы вычислений или тексты индивидуальных заданий;
-требования к программному средству, в т.ч. указания, для каких процессора и операционной системы (ОС) оно разрабатывается, какие директивы и команды применяются, для какого режима работы процессора (реального или защищенного), какого типа (EXEили COM-) они должны быть, сколько модулей и сегментов должны содержать и т.п.;
-описание наиболее часто встречающихся при выполнении работы ошибок программирования;
-детальные ссылки на литературу для более подробного изучения;
-примеры (тексты) программ, разработанные в соответствии с требованиями и содержащие поясняющие комментарии.
Программное обеспечение, используемое при выполнении работы в классе и индивидуального задания, приведено в прил.4
  | 
	
  | 
	Таблица 1  | 
|
  | 
	
  | 
	Перечень частей  | 
|
  | 
	
  | 
	
  | 
	
  | 
№  | 
	Название части  | 
	Рассматриваемые вопросы, тип программы,  | 
|
п/  | 
	
  | 
	количество модулей и операционная система  | 
	
  | 
п  | 
	
  | 
	
  | 
	
  | 
1  | 
	2  | 
	3  | 
	
  | 
1  | 
	Определение данных.  | 
	Арифметические операции сложения,  | 
	
  | 
  | 
	Операции двоичной  | 
	вычитания, умножения и деления (операции  | 
	
  | 
  | 
	арифметики. Экранные  | 
	двоичной арифметики; вычисление по формуле;  | 
	
  | 
  | 
	операции  | 
	определение данных; логика и организация  | 
	
  | 
  | 
	
  | 
	программ - условные и безусловные переходы и  | 
	
  | 
  | 
	
  | 
	циклы; ввод с клавиатуры и вывод на экран).  | 
	
  | 
  | 
	
  | 
	EXE-программа (один модуль). ОС- MS-DOS  | 
	
  | 
  | 
	
  | 
	5  | 
	
  | 
  | 
	
  | 
	Продолжение табл.1  | 
|
1  | 
	2  | 
	3  | 
	
  | 
2  | 
	Логические операции.  | 
	Арифметические и логические операции (И,  | 
	
  | 
  | 
	Условные и безусловные  | 
	ИЛИ, НЕ, ИСКЛЮЧАЮЩЕЕ ИЛИ; вычисление  | 
	
  | 
  | 
	переходы, организация  | 
	по формуле; логика и организация программ –  | 
	
  | 
  | 
	циклов, вызов процедур,  | 
	вызов процедур near и far; использование стека;  | 
	
  | 
  | 
	использование стека  | 
	директивы extrn, public, global). EXE-программа  | 
	
  | 
  | 
	
  | 
	(два модуля). ОС- MS-DOS  | 
	
  | 
3  | 
	Сдвиговые операции,  | 
	Арифметические и логические операции и  | 
	
  | 
  | 
	данные со знаком и без  | 
	сдвиги; логика и организация программ – циклы  | 
	
  | 
  | 
	знака. Ввод-вывод на  | 
	и переходы; вызов процедур; использование  | 
	
  | 
  | 
	диск  | 
	стека; включаемые файлы; ввод-вывод на диск).  | 
	
  | 
  | 
	
  | 
	СОМ-программа. ОС- MS-DOS  | 
	
  | 
4  | 
	Использование макросов  | 
	Вычисление по формулам и сдвиги. EXE-  | 
	
  | 
  | 
	и макрокоманд.  | 
	программа (один модуль, использование  | 
	
  | 
  | 
	Строковые команды и  | 
	макросов и макрокоманд; строковые команды,  | 
	
  | 
  | 
	команды манипуляции  | 
	команды манипуляции флагами). ОС- MS-DOS  | 
	
  | 
  | 
	флагами  | 
	
  | 
	
  | 
5  | 
	Использование условных  | 
	Вычисление по формулам и сдвиги. EXE-  | 
	
  | 
  | 
	операторов ассемблирова  | 
	программа (один модуль, использование  | 
	
  | 
  | 
	ния Директива equ  | 
	макросов, макрокоманд и условных операторов  | 
	
  | 
  | 
	
  | 
	ассемблирования; директива equ). ОС- MS-DOS  | 
	
  | 
6  | 
	Демонстрация и  | 
	Демонстрация и опробование способов передачи  | 
	
  | 
  | 
	опробование способов  | 
	процедурам в модуле и между модулями:  | 
	
  | 
  | 
	передачи параметров  | 
	параметра(ов) и указателя – через регистр(ы),  | 
	
  | 
  | 
	процедурам в модуле и  | 
	общую ячейку, стек, в потоке кода. Передача  | 
	
  | 
  | 
	между модулями  | 
	фактических параметров макросам. Сохранение  | 
	
  | 
  | 
	
  | 
	регистров в вызывающей и вызываемой  | 
	
  | 
  | 
	
  | 
	процедурах. EXE-программа (два модуля; модели  | 
	
  | 
  | 
	
  | 
	памяти – средняя и большая). ОС- MS-DOS  | 
	
  | 
7  | 
	Оптимизация программы  | 
	Минимизация объема программы (объем  | 
	
  | 
  | 
	
  | 
	оперативной памяти, занимаемой машинными  | 
	
  | 
  | 
	
  | 
	командами, данными и стеком) либо времени  | 
	
  | 
  | 
	
  | 
	выполнения программы. Использование таблицы  | 
	
  | 
  | 
	
  | 
	переходов, команд и возможностей МП Intel  | 
	
  | 
  | 
	
  | 
	80386. СОМили ЕХЕ-программа. ОС- MS-DOS  | 
	
  | 
8  | 
	Определение интервала  | 
	Определение паузы (интервала времени) между  | 
	
  | 
  | 
	между событиями.  | 
	событиями. Обработка прерываний, команды in и  | 
	
  | 
  | 
	Обработка прерываний,  | 
	out. EXE-программа. ОС- MS-DOS  | 
	
  | 
  | 
	команды in и out  | 
	
  | 
	
  | 
9  | 
	Вычисление по формуле  | 
	Вычисление по формуле (определение данных;  | 
	
  | 
  | 
	(операции двоичной  | 
	логика и организация программ – условные и  | 
	
  | 
  | 
	арифметики и логические  | 
	безусловные переходы и циклы; вызов процедур;  | 
	
  | 
  | 
	операции, сдвиги; ввод с  | 
	ввод с клавиатуры и вывод на экран;  | 
	
  | 
  | 
	клавиатуры и вывод  | 
	использование стека).  | 
	
  | 
  | 
	на экран). Графическое  | 
	EXE-программа для МП Intel 80386. ОС -  | 
	
  | 
  | 
	приложение для Windows  | 
	Windows 95/98 и Windows NT. (Модель памяти –  | 
	
  | 
  | 
	95/98 и Windows NT  | 
	.flat). Режим работы - процессора защищенный  | 
	
  | 
  | 
	
  | 
	6  | 
	
  | 
  | 
	
  | 
	Окончание табл.1  | 
|
1  | 
	2  | 
	3  | 
	
  | 
10  | 
	Смешанное  | 
	Смешанное программирование (встроенный  | 
	
  | 
  | 
	программирование  | 
	ассемблер; вычисление по формуле: операции  | 
	
  | 
  | 
	(связь с программами на  | 
	двоичной арифметики и логические операции,  | 
	
  | 
  | 
	языке Pascal;  | 
	сдвиги; определение данных; логика и  | 
	
  | 
  | 
	ассемблерные врезки в  | 
	организация программ – условные и безусловные  | 
	
  | 
  | 
	программу на Pascal’e)  | 
	переходы и циклы; вызов процедур; ввод с  | 
	
  | 
  | 
	
  | 
	клавиатуры и вывод на экран; использование  | 
	
  | 
  | 
	
  | 
	стека). EXE-программа для МП Intel 8086 на  | 
	
  | 
  | 
	
  | 
	языке Pascal с вставками на ассемблере. ОС -  | 
	
  | 
  | 
	
  | 
	MS-DOS  | 
	
  | 
11  | 
	Смешанное програм-  | 
	Смешанное программирование (ассемблер,  | 
	
  | 
  | 
	мирование (связь с  | 
	встроенный в С++; операции двоичной  | 
	
  | 
  | 
	программами на языке  | 
	арифметики и логические операции, определение  | 
	
  | 
  | 
	C++; ассемблерные  | 
	данных, переходы и циклы, вызов процедур; ввод  | 
	
  | 
  | 
	врезки в программу на  | 
	с клавиатуры и вывод на экран - средствами  | 
	
  | 
  | 
	языке C++)  | 
	языка С++; сдвиги – средствами ассемблера).  | 
	
  | 
  | 
	
  | 
	Режим работы процессора реальный. EXE-  | 
	
  | 
  | 
	
  | 
	программа для МП Intel 80386. ОС - MS-DOS  | 
	
  | 
12  | 
	Вычисление по формуле  | 
	Вычисление по формулам. EXE-программа для  | 
	
  | 
  | 
	(операции двоичной  | 
	МП Intel 80386, ОС – Linux  | 
	
  | 
  | 
	арифметики и  | 
	
  | 
	
  | 
  | 
	логические операции,  | 
	
  | 
	
  | 
  | 
	сдвиги; ввод с  | 
	
  | 
	
  | 
  | 
	клавиатуры и вывод  | 
	
  | 
	
  | 
  | 
	на экран) в Linux  | 
	
  | 
	
  | 
13  | 
	Резидентная программа  | 
	Разработать резидентную программу или  | 
	
  | 
  | 
	или драйвер для MS-DOS  | 
	драйвер. ОС - MS-DOS  | 
	
  | 
14  | 
	Работа с дисковыми  | 
	Одновременная работа снесколькимифайлами и  | 
	
  | 
  | 
	файлами (прямой и  | 
	несколькими областями DTA. (Назначение  | 
	
  | 
  | 
	последовательный  | 
	программы: 1) работа с файлами в базовой версии  | 
	
  | 
  | 
	доступ) и несколькими  | 
	MS-DOS – ввод данных, запись в файл (прямой и  | 
	
  | 
  | 
	областями DTA  | 
	последовательный доступ), чтение изфайла  | 
	
  | 
  | 
	
  | 
	(прямой и последовательный доступ),  | 
	
  | 
  | 
	
  | 
	одновременная работа с несколькими файлами;  | 
	
  | 
  | 
	
  | 
	2) одновременная работа с несколькими областями  | 
	
  | 
  | 
	
  | 
	DTA; 3)шифрование; 4) дешифрация). ЕХЕ-  | 
	
  | 
  | 
	
  | 
	программа (модель памяти– компактная или  | 
	
  | 
  | 
	
  | 
	большая). ОС- MS-DOS  | 
	
  | 
15  | 
	Дизассемблирование  | 
	Восстановление текста программы по ее  | 
	
  | 
  | 
	программ  | 
	загрузочному модулю – COM или EXE. ОС -  | 
	
  | 
  | 
	
  | 
	MS-DOS. Дизассемблер IDA Pro  | 
	
  | 
7
1.ЗАДАНИЕ НА ПРОГРАММИРОВАНИЕ (ОБЩАЯ ЧАСТЬ)
1.1.Составить СОМ-программу для МП Intel 8086 для вычисления по формулам, содержащим арифметические операции сложения, вычитания, умножения и деления и логические операции И, ИЛИ, ИСКЛЮЧАЮЩЕЕ ИЛИ, НЕ. Формулы вычислений – те, что реализовывались в работах № 1 и 2 (см. уч.пос., ч.1 и 2), и дополнительно – четыре типа операций сдвига.
Варианты используемых операций (сдвигов)  | 
	Таблица 1.1  | 
||||||
  | 
	
  | 
||||||
  | 
	
  | 
	
  | 
	
  | 
	
  | 
	
  | 
	
  | 
	
  | 
Тип сдвига  | 
	
  | 
	Влево  | 
	
  | 
	
  | 
	Вправо  | 
	
  | 
	
  | 
Логический  | 
	байта  | 
	слова  | 
	двойного  | 
	байта  | 
	слова  | 
	двойного  | 
	
  | 
  | 
	(b)  | 
	(w)  | 
	слова (d)  | 
	(b)  | 
	(w)  | 
	слова (d)  | 
	
  | 
Арифметический  | 
	байта  | 
	слова  | 
	двойного  | 
	байта  | 
	слова  | 
	двойного  | 
	
  | 
  | 
	(b)  | 
	(w)  | 
	слова (d)  | 
	(b)  | 
	(w)  | 
	слова (d)  | 
	
  | 
Циклический  | 
	байта  | 
	слова  | 
	двойного  | 
	байта  | 
	слова  | 
	двойного  | 
	
  | 
  | 
	(b)  | 
	(w)  | 
	слова (d)  | 
	(b)  | 
	(w)  | 
	слова (d)  | 
	
  | 
Циклический через  | 
	байта  | 
	слова  | 
	двойного  | 
	байта  | 
	слова  | 
	двойного  | 
	
  | 
флаг переноса  | 
	(b)  | 
	(w)  | 
	слова (d)  | 
	(b)  | 
	(w)  | 
	слова (d)  | 
	
  | 
1.2. Требования к программному средству, в т.ч. указания – для каких процессора и операционной системы оно разрабатывается, какие директивы и команды применяются и т.п., приведены в табл. 1.2.
Таблица 1.2
Полный текст задания
Ассемблер для микропроцессора Intel 8086
Операционная система MS-DOS [1, с.127 128]
Режим работы процессора реальный [1, с.20 60]
Тип программы COM [2, с.39 40; 3, с.123]
Назначение программы вычисление по формуле (арифметические и логические операции и операции сдвига); преобразование ЕХЕ-программы в COM-программу
Модель памяти сверхмалая [1, с.112; 4, с. 45 46], т.е. один сегмент кода,
что соответствует директиве определения модели памяти .tiny [1, с.112]
Модуль lab3_ol.asm (один сегмент кода, содержит и данные – вверху или внизу). Файл lab3_ol.asm получается из файлов lab2_1ol.asm (один сегмент стека, один сегмент данных и один сегмента кода) и lab2_1ol.asm (один сегмент кода) за счет слияния двух сегментов кода и одного сегмента данных в сегмент кода
8
Продолжение табл.1.2
Директивы:
определения сегментов стандартные (полные): segment, ends и assume [1, с.110 112, 4, с..43, 47 51];
-- позже: упрощенные директивы определения сегментов;
определения процедур: proc и endp [2, с.43; 1, с.115];
завершения программы end [1, с.115];
определение данных: байта (db), слова (dw), двойного слова (dd);
определение данных: байта (db), слова (dw), двойного слова (dd), четверного слова (dq) и десяти байтов (dt) [2, с.23 24];
префиксы переопределения типов byte ptr, word ptr, dword ptr [1, с.121]
+и, кроме того, следующие:
директива переопределения equ [1, с.116]
директива org [1, с.116]
директива include [1, с.125]
Команды непривилегированные:
(те же, что и во второй лабораторной работе)
передачи данных: mov, lea [2, с.15 17];
--позже: команды lahf, lds, les, sahf, xchg, xlat
арифметические (двоичная арифметика): add, adc, sub, sbb, inc, dec, mul, imul, div, idiv, cbw, cwd [1, с.225; 4, с.63 67];
сравнения cmp [1, с.37; 2, с.19];
безусловного (jmp) и условного (jz, jnz, js, jns) перехода [2, с.27 28];
--позже и самостоятельно: jp, jnp, ja, jna, jg, jge, jl, jle, jcxz, [2, с.27 28]; организации цикла loop [1, с.47 51, 2, с.28; 4, с.74];
--позже и самостоятельно: loopz, loopnz, loope, loopne [2, с.28];
передачи управления (вызова процедур и возврата из процедур) call, ret, int [2, с.27-31];
--позже : iret выход из обработчика прерываний [2, с.29, 1, с.120 121];
--позже: операторы short (8), small (16), large (32) - в лаб. №7 [1, с.120 121];
работы со стеком: push, pop [2, с.27 31]
-- позже и самостоятельно: pushf, popf [2, с.26];
логические: and, or, xor, not, test [2, с.23 24].
+и, кроме того, следующие:
cдвига: логический влево (shl), вправо (shr); арифметический влево (sal), вправо (sar); циклический влево (rol), вправо (ror); циклический через флаг переноса (rcl), вправо (rcr) [2, с.24 - 25];
команды манипуляции флагами (установка и сброс флага): stc, clc
команды условного перехода jc и jnc
команда изменения знака (neg), [2, с.20]
9
Продолжение табл.1.2
Адресация
регистр регистр:
mov ax,bx ; занести (скопировать) в ax содержимое bx [4, с.34]
--позже: mov ax,[bx] ; занести в регистр ax содержимое памяти по адресу из регистра bx [4, с.34-40] – в уч. пос., ч.6
mov ax,[25] ; занести (скопировать) в регистр ax содержимое ячейки по смещению 25
mov al,bl ; занести (скопировать) в регистр al содержимое bl mov bx,cx ; занести (скопировать) в регистр bx содержимое cx
регистр память:
mov ax,worda ; занести в регистр ax значение переменной (слова) worda
mov al,bytea; занести в регистр al значение переменной (байта) bytea
mov dx,worda ; занести в регистр dx значение переменной (слова)
worda
память регистр:
mov worda,ax ; занести в ячейку worda содержимое регистра ax (слово)
mov bytea,al ; занести в ячейку bytea содержимое регистра al (байт)
mov worda,cx ; занести в ячейку worda содержимое регистра cx (слово)
регистр непосредственный операнд:
mov ax,25 ; занести в регистр ax значение 25
mov bx,2 ; занести в регистр bx значение 2
mov al,25 ; занести в регистр al значение 25
память непосредственный операнд:
mov worda,25  | 
	; занести в ячейку worda значение 25  | 
mov bytea,25  | 
	; занести в ячейку bytea значение 25  | 
Использование процедур операционной системы:
(те же, что и во второй лабораторной работе)
ввод с клавиатуры [2, с.57 62]
вывод на экран [2, с.63 67]
ввод-вывод на диск (FCB, последовательная запись и чтение; длина записи = 128 байтов при открытии и создании файла;
создание (16h), открытие (0fh),  | 
	определение области DTA  | 
(1ah), последовательная запись  | 
	(15h), последовательное  | 
чтение (14h), закрытие файла (10h)  | 
	
  | 
-- позже: ввод/вывод на диск через дескрипторы [2, с. 48-52];
Дополнительная информация (рассматривается на практических занятиях):
(те же, что и во второй лабораторной работе)
-процессоры Intel в реальном режиме [1, с.20 60];
-последовательность выполнения команд [2, с.12 13];
-структура процессора 8086 [2, с.9, рис. 1.1.2];
-сегментная адресация [2, с.9, рис.1.1.3];
-представление данных в компьютерах [1, с.14 19];
-логика и организация программ:
10
Продолжение табл.1.2
а) условные и безусловные переходы [3];
б) вызов процедур [3]
в) циклы [1, с.215];
-использование стека;
-дисковая память:
а) организация [3, с.45 51];
б) функции базовой версии DOS [3];
-переопределение данных: префикс ptr [1];
+и, кроме того:
-преобразование ЕХЕ - программы в COM - программу [3]
-операции сдвига [2]
-циклы и переходы [1, с. 47-51]
-операции сравнения и тестирования
-данные со знаком и без знака [1]
-включаемые файлы – директива include
-компоновка com-программы (tlink /tdc lab3_fio.obj)
Примеры программ: l_3bnn.asm (СОМ-программа, но уже с макросами, которых в 3-й лабораторной не должно быть) в папке l#03
Используемое ПО: tasm.exe, tlink.exe, td.exe
Формируемые файлы: lab3_fio.obj, lab3_fio.lst,lab3_fio.com
Литература: 1. Зубков С.В. Assembler для DOS, Windows и UNIX. – 3-е изд.,
стереотип. – М.: ДМК Пресс; СПб.: Питер, 2005. – 608 с.
2.Бурдаев О.В., Иванов М.А., Тетерин И.И. Ассемблер в задачах защиты информации / под ред. И.Ю.Жукова. – М.: КУДИЦ-ОБРАЗ, 2002. – 320с.
3.Абель Питер. Язык ассемблера для IBM PC и программирования / пер. с англ. – М.: Высшая школа. – 1992. – 447 с.
4.Олейник Л.Е. Язык ассемблера для микропроцессора 8086: курс лекций. – Омск: Сибирская региональная школа бизнеса, 2000
5.Дао Л. Программирование микропроцессора 8088. – М.: Мир, 1988. – 356 с.
6.Абель Питер. Ассемблер. Язык и программирование для IBM PC: пер. с англ., - изд. 5-е, стереот. – Киев: Век; М.: Энтроп; Киев: НТИ, 2003. – 736 с.
Задание (З_ЛР_3): Составить СОМ-программу для МП Intel 8086 для вычисления по трем формулам:
1)содержащей арифметические операции сложения, вычитания, умножения и деления (формулу взять у преподавателя, а при самостоятельном изучении в
уч.пос., ч.1), если X1=1;
2)содержащей логические операции (формулу 2 взять у преподавателя, а при
самостоятельном изучении из уч.пос., ч.2), если X1=2 или 2,3,4 и т.д.;
3) содержащей сдвиг логический, арифметический, циклический и циклический с переносом (формулу взять у преподавателя, а при самостоятельном изучении в прил.3), если X1= N
Использовать в качестве аргументов b1, b2,...,w1, w2,...,d1, d2,... байты, слова и двойные слова.
11
Продолжение табл.1.2
Все данные (b1, b2, b3,...,w1, w2, w3,...d1, d2, d3,....) вводятся c клавиатуры. Результат выводится на экран (после очистки в свободную строку)
Данные для соответствующей формулы вводятся после запроса (в диалоге должна быть прокрутка снизу вверх). Применяется перевод из ASCIIформата в двоичный код (для данных, введенных с клавиатуры) и перевод из двоичного кода в ASCII-формат (для данных, выдаваемых на экран, на НМД и на принтер)
В данной программе могут быть использованы в качестве процедур программы, реализующие задания для лабораторных работ № 1 и 2 (lab1 и lab2)
Х1 вводится с клавиатуры по запросу
Результат вывести на экран по формату:
"Вычисление по формуле (приводится соответствующая cтрока формулы) Y=
Кроме того, полученный pезультат заносится в файл на диске (после оставшейся в нем инфоpмациии о предыдущих вычислениях по формулам лабораторных работ № 1, или № 2, или № 3 по фоpмату:
"Вычисление по формуле (приводится соответствующая cтрока формулы) или «сдвиг <название, направление и на какое количество битов>», Y=____ для b1=__;b2=__;b3=__; b4=__;w1=___и т.д."
Лабораторная считается сданной, если:
-в комментариях к вычислениям указана максимальная длина промежуточных результатов;
-при ассемблировании и компоновке не обнаружено ошибок;
-результат совпадает с результатом ручного просчета (получены правильные результаты при произвольно заданных исходных данных);
-текст программы прокомментирован (комментарии поясняют последовательность вычисления по формуле; назначение используемых процедур; способ передачи параметров и получение результатов)
Типичные ошибки:
(те же, что и во второй лабораторной работе)
-программист забывает о возврате в DOS [4, с. 99];
-программист забывает о стеке [4, с.103];
-вызывает процедуру, которая портит содержимое нужных регистров [4, с.104];
-неправильный порядок операндов [4, с.103];
-потеря содержимого регистра при умножении [4, с.115];
-изменение отдельными инструкциями флага переноса [4, с.116];
-программист долго не использует состояние флагов [4, с.116];
-открытая процедура или открытый сегмент [5, с.120 121];
-неопределенные символические имена [5, с.121 122];
-повторное определение символического имени [5, с.122 123];
12
Окончание табл.1.2
-ошибки выполнения программы как результат ошибок программирования [5,
с.123 124];
-ошибки при использовании регистров [5, с.124 125]:
а) 8- и 16-разрядный регистры для записи двух операндов одной команды;
б) 8-разрядный регистр указывается для работы со стеком;
в) сегментные регистры прямо используются в арифметических вычислениях, логическихоперациях или для непосредственной передачи данных;
г) сегментные регистры могут использоваться либо как источники операндов, либо как приемники операндов, но никак не одновременно
-выход из диапазона адресов, т.е. относительный адрес символического имени, используемого в качестве операнда адреса перехода, выходит за диапазон +127 байтов –128 байтов от конца команды условного перехода [5,
с.125];
-использование непосредственных данных в качестве операнда-приемника [5,
с.125 126];
-программист забывает об инструкции ret [4, с.100];
-генерация неверного типа возврата [4, с.101];
-ошибки при использовании условных переходов [4, с.106];
-не путайте операнды в памяти и непосредственные операнды [4, с..117];
-границы сегментов [4, с.118]
+и, кроме того:
-программист забывает о стеке (на стек остается слишком мало места в кодовом сегменте СОМ-программы);
Задание повышенной сложности (ЗПС_ЛР_3): Составить СОМ-программу для МП Intel 8086 для вычисления по трем формулам:
1)содержащей арифметические операции сложения, вычитания, умножения и деления (формулу взять у преподавателя, а при самостоятельном изучении в
уч.пос., ч.1), если X1=1;
2)содержащей логические операции (формулу 2 взять у преподавателя, а при самостоятельном изучении - из уч.пос., ч.2), если X1=2 или 2,3,4 и т.д.;
3)содержащей сдвиг логический, арифметический, циклический и циклический с переносом (формулу взять у преподавателя, а при
самостоятельном изучении в прил.3), если X1= N;
Результат выводится на экран (после очистки строк) со знаком.
13
2.РАЗЛИЧИЯ МЕЖДУ ПРОГРАММАМИ
ВEXE- И COM-ФАЙЛАХ
2.1.Сравнение EXE-программ и COMпрограмм
Cуществуют определенные различия между программой, выполняемой как EXE-файл, и программой, выполняемой как COMфайл.
  | 
	
  | 
	
  | 
	
  | 
	Таблица 2.1  | 
  | 
	
  | 
	Сравнение EXE-программ и COMпрограмм  | 
||
  | 
	
  | 
	
  | 
	
  | 
	
  | 
№  | 
	Отличия  | 
	EXE-программа  | 
	COMпрограмма  | 
	Примечания  | 
п/п  | 
	
  | 
	
  | 
	
  | 
	
  | 
1  | 
	2  | 
	3  | 
	4  | 
	5  | 
1  | 
	Размер  | 
	Может иметь  | 
	Ограничен раз-  | 
	COM-файл всегда  | 
  | 
	прог-  | 
	любой размер  | 
	мером одного  | 
	меньше, чем  | 
  | 
	раммы  | 
	
  | 
	сегмента и не  | 
	соответствующий EXE-  | 
  | 
	
  | 
	
  | 
	превышает 64К  | 
	файл  | 
2  | 
	Сег-  | 
	Определяет  | 
	Стек генерируется  | 
	При создании ассемб-  | 
  | 
	мент  | 
	программист  | 
	автоматически  | 
	лерной программмы,  | 
  | 
	стека  | 
	
  | 
	
  | 
	которая будет преобра-  | 
  | 
	
  | 
	
  | 
	
  | 
	зована в COM-файл,  | 
  | 
	
  | 
	
  | 
	
  | 
	сегмент стека прог-  | 
  | 
	
  | 
	
  | 
	
  | 
	рамммистом не задается  | 
3  | 
	Сег-  | 
	Сегмент данных  | 
	Сегмент данных  | 
	Простой способ  | 
  | 
	мент  | 
	обычно опреде-  | 
	отсутствует (все  | 
	решения этого вопроса  | 
  | 
	данных  | 
	ляяется, а ds  | 
	данные должны  | 
	– см. ниже  | 
  | 
	
  | 
	инициализирует  | 
	быть определены в  | 
	
  | 
  | 
	
  | 
	-ся адресом это-  | 
	сегменте кода)  | 
	
  | 
  | 
	
  | 
	го сегмента  | 
	
  | 
	
  | 
4  | 
	Инициа-  | 
	Программируют-  | 
	Т.к. COM-про-  | 
	Когда COM-программа  | 
  | 
	лизация  | 
	ся запись нуле-  | 
	грамма не имеет  | 
	начинает работать, все  | 
  | 
	
  | 
	вого слова в стек  | 
	ни стека, ни  | 
	сегментные регистры  | 
  | 
	
  | 
	и инициализа-  | 
	сегмента данных,  | 
	содержат адрес префик-  | 
  | 
	
  | 
	ция регистра ds  | 
	то эти шаги  | 
	са программного сег-  | 
  | 
	
  | 
	
  | 
	отсутствуют  | 
	мента (PSP), 256-  | 
  | 
	
  | 
	
  | 
	
  | 
	байтового блока т.к.  | 
  | 
	
  | 
	
  | 
	
  | 
	адресация начинается со  | 
  | 
	
  | 
	
  | 
	
  | 
	смещения 100h от  | 
  | 
	
  | 
	
  | 
	
  | 
	начала PSP, то в  | 
  | 
	
  | 
	
  | 
	
  | 
	программе после  | 
  | 
	
  | 
	
  | 
	
  | 
	директивы  | 
  | 
	
  | 
	
  | 
	
  | 
	segment идёт директива  | 
  | 
	
  | 
	
  | 
	
  | 
	org 100h  | 
  | 
	
  | 
	
  | 
	14  | 
	
  | 
  | 
	
  | 
	
  | 
	
  | 
	Окончание табл. 2.1  | 
1  | 
	2  | 
	3  | 
	4  | 
	5  | 
5  | 
	Обра-  | 
	См. уч.пос., ч.1  | 
	См. выше  | 
	Отличается параметром  | 
  | 
	ботка:  | 
	(подраздел 2.3) и  | 
	(подраздел 2.3)  | 
	/tdc для tlink  | 
  | 
	ассемб-  | 
	ч.2 (подраздел  | 
	
  | 
	
  | 
  | 
	лиро-  | 
	2.3)  | 
	
  | 
	
  | 
  | 
	вание и  | 
	
  | 
	
  | 
	
  | 
  | 
	компо-  | 
	
  | 
	
  | 
	
  | 
  | 
	новка  | 
	
  | 
	
  | 
	
  | 
Когда программа создается для выполнения как COM-файл, то компоновщиком будет выдано сообщение:
Warning: No STACK Segment
(Предупреждение: Сегмент стека не определен)
Это сообщение можно игнорировать, так как определение стека в программе не предполагалось.
Пример COM-программы приведен ниже [6, с. 124]. 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  | 
	
  | 
Эта COM-программа выполнит те же действия, что и приведенная ниже EXE-программа (измененные и удаленные из этой программы строки выделены прописными буквами и заливкой)
STACKSG SEGMENT PARA SТACK 'Stack'
DB 32 DUP(?)
STACKSG ENDS ;-------------------------------------------------
DATASG SEGMENT PARA 'Data'
15
flda  | 
	dw 250  | 
	;определение данных  | 
||||||
fldb  | 
	dw 125  | 
	
  | 
||||||
fldc  | 
	dw ?  | 
	
  | 
||||||
DATASG ENDS  | 
	
  | 
	
  | 
	
  | 
	
  | 
	
  | 
	
  | 
	
  | 
|
;-------------------------------------------------  | 
	
  | 
	
  | 
	
  | 
	
  | 
	
  | 
	
  | 
	
  | 
	
  | 
codesg segment para 'Code'  | 
	
  | 
|||||||
begin proc far  | 
	
  | 
|||||||
assume cs:codesg,ds:codesg,ss:codesg,es:nothing  | 
||||||||
  | 
	
  | 
	
  | 
	
  | 
	
  | 
	
  | 
	
  | 
	;записать ds в стек  | 
|
  | 
	PUSH DS  | 
|||||||
  | 
	SUB AX,AX  | 
	
  | 
	
  | 
	
  | 
	;записать в стек  | 
|||
  | 
	PUSH AX  | 
	
  | 
	
  | 
	
  | 
	
  | 
	; нулевой адрес  | 
||
  | 
	MOV AX,DATASG  | 
	
  | 
	;поместить адрес DATASG  | 
|||||
  | 
	MOV DS,AX  | 
	
  | 
	
  | 
	; в регистр ds  | 
||||
  | 
	mov ax,flda  | 
	;переслать 0250 в ax  | 
||||||
  | 
	add ax,fldb  | 
	;прибавить 0125 к ax  | 
||||||
  | 
	mov fldc,ax  | 
	;записать сумму в fldc  | 
||||||
  | 
	ret  | 
	;вернуться в DOS  | 
||||||
begin endp  | 
	
  | 
|||||||
codesg ends  | 
	
  | 
|||||||
  | 
	end begin  | 
	
  | 
||||||
Обратите внимание на следующие изменения в COM-программе (по сравнению с EXE-программой):
-сегмент стека и сегмент данных отсутствуют;
-директива assume указывает ассемблеру установить относительные адреса с начала сегмента кодов. Регистр cs также содержит этот адрес, являющийся к тому же адресом префикса программного сегмента (PSP). Директива org служит для резервирования 100h байтов от начального адреса под PSP;
-директива org 100h устанавливает относительный адрес для начала выполнения программы. Программный загрузчик использует этот адрес для командного указателя;
-команда jmp используется для обхода данных, определенных в программе.
Если элементы данных определяют после команд, то первая команда jmp не требуется. Кодирование элементов данных перед командами позволяет ускорить процесс ассемблирования и является методикой, рекомендуемой в руководстве по ассемблеру.
16
2.2. Стек для COM-программы
Для COM-файла DOS автоматически определяет стек и устанавливает oдинаковый общий сегментный адрес во всех четырех сегментных pегистрах. Если для программы размер сегмента в 64К является достаточным, то DOS устанавливает в регистре SP адрес конца cегмента – шестнадцатеричное fffe (FFFEh). Это будет верх стека. В обоих случаях DOS записывает затем в стек нулевое слово.
Возможность использования стека зависит от размера программы и ограниченности памяти. С помощью команды dir можно определить pазмер файла и вычислить необходимое пространство для стека.
2.3. Программы в виде COMфайлов
Пример 1
;Умножение двойных слов
codesg  | 
	segment para 'Code'  | 
||
assume cs:codesg,ds:codesg,ss:codesg  | 
|||
org  | 
	100h  | 
	
  | 
	
  | 
begin:  | 
	jmp short main  | 
	
  | 
|
; ---------------------------------------------  | 
	
  | 
	
  | 
	
  | 
multcnd  | 
	dw  | 
	3206h  | 
	;элементы данных  | 
  | 
	dw  | 
	2521h  | 
	
  | 
multplr  | 
	dw  | 
	6400h  | 
	
  | 
  | 
	dw  | 
	0A26h  | 
	
  | 
product  | 
	dw  | 
	0  | 
	
  | 
  | 
	dw  | 
	0  | 
	
  | 
  | 
	dw  | 
	0  | 
	
  | 
;  | 
	dw  | 
	0  | 
	
  | 
  | 
	
  | 
	
  | 
|
main proc  | 
	near  | 
	
  | 
	;основная процедура  | 
call  | 
	e10xmul  | 
	;вызвать 1-е умножение  | 
|
call  | 
	z10zero  | 
	;очистить произведение  | 
|
call  | 
	f10xmul  | 
	;вызвать 2-е умножение  | 
|
ret  | 
	
  | 
	
  | 
	
  | 
main endp  | 
	
  | 
	
  | 
	
  | 
;Умножение двойного слова на слово:
; -----------------------------------------------
e10xmul proc  | 
	
  | 
|
mov  | 
	ax,multcnd+2  | 
	; умножить правое слово  | 
mul  | 
	multplr  | 
	; множимого  | 
mov  | 
	product+4,ax  | 
	;записать произведение  | 
  | 
	
  | 
	17  | 
mov  | 
	product+2,dx  | 
	
  | 
mov  | 
	ax, multcnd  | 
	;умножить левое слово  | 
mul  | 
	multplr  | 
	; множимого  | 
add  | 
	product+2,ax  | 
	; сложить с полученным ранее  | 
adc  | 
	product,dx  | 
	
  | 
ret  | 
	
  | 
	
  | 
e10xmul endp
;Умножение двух двойных слов:
;--------------------------------------------
f10xmul proc  | 
	
  | 
|
mov  | 
	ax, multcnd+2  | 
	; слово-2 множимого  | 
mul  | 
	multplr+2  | 
	; * слово-2 множителя  | 
mov  | 
	product+6,ax  | 
	; сохранить результат  | 
mov  | 
	product+4,dx  | 
	
  | 
mov  | 
	ax, multcnd+2  | 
	; слово-2 множимого  | 
mul  | 
	multplr  | 
	; * слово-1 множителя  | 
add  | 
	product+4,ax  | 
	; сложить с предыдущим  | 
adc  | 
	product+6,dx  | 
	
  | 
adc  | 
	product,00  | 
	;прибавить перенос  | 
mov  | 
	ax, multcnd  | 
	; слово-1 множимого  | 
mul multplr+2  | 
	; * слово-2 множителя  | 
|
add product+4, ax  | 
	; сложить с предыдущим  | 
|
adc product+6,dx  | 
	
  | 
|
adc product,00  | 
	; прибавить перенос  | 
|
mov ax,multcnd  | 
	; слово-1 множимого  | 
|
mul multplr  | 
	; * слово-1 множителя  | 
|
add product+2,ax  | 
	; сложить с предыдущим  | 
|
adc product,dx  | 
	
  | 
|
ret  | 
	
  | 
	
  | 
f10xmul endp  | 
	
  | 
|
;Очистка области результата:
;----------------------------------------
z10zero proc
mov product,0000 mov product+2,0000 mov product+4,0000 mov product+6,0000 ret
z10zero endp codesg ends
18
end begin
-----------------------------------------------------------
  | 
	Пример 2  | 
	
  | 
|
;  | 
	Организация бесконечного цикла с помощью jmp  | 
||
codesg segment para 'Code'  | 
	
  | 
||
  | 
	assume cs:codesg,ds:codesg,ss:codesg,es:codesg  | 
||
  | 
	org 100h  | 
	
  | 
|
main proc near  | 
	
  | 
||
  | 
	mov ax,01  | 
	;инициализация ax  | 
|
  | 
	mov bx,01  | 
	;инициализация bx  | 
|
a20:  | 
	mov cx,01  | 
	;инициализация cx  | 
|
add ax,01  | 
	;прибавить 01 к ax  | 
||
  | 
|||
  | 
	add bx,ax  | 
	;прибавить ax к bx  | 
|
  | 
	shl cx,1  | 
	;удвоить cx  | 
|
  | 
	jmp a20  | 
	;переход на a20  | 
|
main endp  | 
	
  | 
||
codesg ends  | 
	
  | 
||
  | 
	end main  | 
	
  | 
|
После ассемблирования получится программа:
;Организация цикла с помощью jmp
0100  | 
	
  | 
	codesg segment para 'Code'  | 
|
0100  | 
	
  | 
	assume cs:codesg,ds:codesg,ss:codesg,es:codesg  | 
|
0100  | 
	
  | 
	org 100h  | 
	
  | 
0100  | 
	
  | 
	main proc near  | 
	
  | 
0100  | 
	B8 0001  | 
	mov ax,01  | 
	;инициализация ax  | 
0103  | 
	BB 0001  | 
	mov bx,01  | 
	; инициализация bx  | 
0106  | 
	B9 0001  | 
	mov cx,01  | 
	; инициализация cx  | 
0109  | 
	
  | 
	a20:  | 
	
  | 
0109  | 
	05 0001  | 
	add ax,01  | 
	; прибавить 01 к ax  | 
010C  | 
	03 D8  | 
	add bx,ax  | 
	; прибавить 01 к bx  | 
010E  | 
	D1 E1  | 
	shl cx,1  | 
	; удвоить cx  | 
0110  | 
	EB F7  | 
	mp a20  | 
	; переход на a20  | 
0112  | 
	
  | 
	main endp  | 
	
  | 
0112  | 
	
  | 
	codesg ends  | 
	
  | 
0112  | 
	
  | 
	end main  | 
	
  | 
-----------------------------------------------------------
Пример 3
; Организация цикла командой loop codesg segment para 'Code'
assume cs:codesg,ds:codesg,ss:codesg,es:codesg org 100h
19
main proc near  | 
	
  | 
mov ax,01  | 
	; инициализация ax  | 
mov bx,01  | 
	; инициализация bx  | 
mov dx,01  | 
	; инициализация dx  | 
mov cx,10  | 
	; число циклов  | 
;  | 
	
  | 
a20:  | 
	
  | 
inc ax  | 
	; прибавить 01 к ax  | 
add bx,ax  | 
	; прибавить ax к bx  | 
shl dx,1  | 
	; удвоить dx  | 
loop a20  | 
	; уменьшить cx и повторить цикл, если  | 
;  | 
	не нуль, т.е. переход на a20  | 
ret  | 
	;завершить работу  | 
begin endp  | 
	
  | 
codesg ends  | 
	
  | 
end begin  | 
	
  | 
Контрольные вопросы
1.Каков максимальный размер СОМ-программы?
2.Какие сегменты можно определить в программе, которая будет преобразована в COM-файл?
3.Как преобразовать исходный текст EXE-программы в СОМпрограмму?
4.Два варианта размещения данных в СОМ-программе.
5.Отличие директивы assume СОМ-программы от директивы assume EXE-программы.
6.Как формируется стек для СОМ-программ?
20
