Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1328.pdf
Скачиваний:
0
Добавлен:
07.01.2021
Размер:
1.07 Mб
Скачать

Министерство образования и науки Российской Федерации Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования «Сибирская государственная автомобильно-дорожная академия (СибАДИ)»

Л. Е. Олейник

ЯЗЫКИ

ПРОГРАММИРОВАНИЯ

Учебное пособие

Часть 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

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