Продолжение табл.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