Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

epd629

.pdf
Скачиваний:
17
Добавлен:
02.05.2015
Размер:
1.05 Mб
Скачать

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

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