Реферат: Структурне програмування на асемблері
Название: Структурне програмування на асемблері Раздел: Рефераты по астрономии Тип: реферат | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
МІНІСТЕРСТВО ОСВІТИ УКРАЇНИ ЧЕРНІВЕЦЬКИЙ ДЕРЖАВНИЙ УНІВЕРСИТЕТім. Ю. ФЕДЬКОВИЧА ФІЗИЧНИЙ ФАКУЛЬТЕТ КАФЕДРА ЕОМ СТРУКТУРНЕ ПРОГРАМУВАННЯНА МОВІ АСЕМБЕЛЕРА Курсова робота з курсу “Системне програмування” Студент 3-го курсу Беднарський І.Я. Керівник Федорук В.І. 199 9 ЗМІСТ ЧАСТИНА і Вступ...................................................................................................................................................................... 4 Глава 1. Структурні оператори і структури логіки керування.......................... 5 умови у структурах логіки керування................................................................................. 6 Глава 2. Структура if................................................................................................................................. 5 структура if з чаСткою else............................................................................................................ 9 функціонування структури if...................................................................................................... 9 команди, що генеруються операторами $if-$endif................................................................ 10 команди, що генеруються операторами $if-$else-$endif................................................... 10 варіанти операнду................................................................................................................................. 11 операції and i or...................................................................................................................................... 11 дальні передачі управління................................................................................................................ 13 глава 3. структура do............................................................................................................................... 13 структура do until................................................................................................................................. 14 структура do while................................................................................................................................ 15 структура do complex.......................................................................................................................... 16 додаткові операнди.............................................................................................................................. 16 параметр loop........................................................................................................................................... 17 операції and и or..................................................................................................................................... 18 глава 4. структура search.................................................................................................................... 18 структура search until...................................................................................................................... 19 структура search while..................................................................................................................... 20 структура search complex.............................................................................................................. 21 додаткові операнди.............................................................................................................................. 21 глава 5. обмеження на використання умов ncxz і cxz............................................ 23 глава 6. упорядкування структурованих програм...................................................... 23 процедура...................................................................................................................................................... 23 розробка структурованих програм по методу “зверху вниз”............................................ 24 використання програми salut..................................................................................................... 25 пакет команд для програми salut................................................................................................. 25 переформатування вихідних текстів програмою salut......................................... 26 переформатування неструктурованих програм...................................................................... 26 ЧАСТИНА іі ЛІСТИНГ ПРОГРАМИ ДРУКУ ДИСКОВОГО asCII ФАЙЛУ............................................................ 28 список використаної літератури................................................................................................ 32 СТРУКТУРНЕ ПРОГРАМУВАННЯ Одним із найцінніших якостей Макроасемблера версії 2 є те, що він дозволяє вам писати структуровані програми на мові асемблера. Під «структурованими» ми розуміємо програми, що містять оператори високого рівня і виконуючі цикли, умовні передачі керування та інші задачі керування, що при відсутності оператора зажадали б декількох команд на мові асемблера. У дійсноcті структурні оператори забезпечують ті ж види складаних операцій, що і мова Бейсік. Наприклад, одне із сімейств структурних операторів (або логічних структур ) виконує ті ж дії, що й оператор IF-THEN-NEXT. Але структурне програмування зовсім не зводиться до простої заміни команд на структурні оператори. Воно, скоріше, являє собою філософію розробки програмного забезпечення, в основу якої покладені такі елементи: - розробка за методу «зверху вниз». (нагадаємо, що при цьому методі розробка програм починається з коментарів, до яких послідовними кроками додаються все нові і нові деталі). - Програмування без міток. - Програмування без оператора GOTO (тобто без команд умовної або безумовної передачі керування). - Запис тексту програми з відступами, що показують рівень вкладеності логічних структур. - У достатній мірі лістинги, що самодокументуються. Все це призначено для підвищення якості програм на мові асемблера. Якісні поліпшення повинні бути явними в наступних аспектах: - розробник повинен краще розуміти логіку програми; - лістинг повинен бути зрозумілий тим, хто намагається внести власні зміни в чужі програми; - оскільки програма більш зрозуміла, у ній повинно бути менше помилок; - підвищується гнучкість і полегшується супровід програми. Це означає, що програма виявиться більш стійкою до зміни зовнішніх ситуацій, ніж це передбачено в проекті, і наступні модифікації органічно ввійдуть в існуючу структуру програми і не внесуть нових помилок; - програма повинна бути зручною для читання, це допоможе зробити лістинг кращою документацією програми. Можливість користуватися структурними операторами забезпечується програмою SALUT (Structured Language Utility - сервісна програма структурного програмування на мові асемблера). Ви повинні набрати текст своєї програми, а потім викликати програму SALUT для перетворення структурних операторів у стандартні команди на мові асемблера. Після цього треба як завжди відтранслювати програму і завантажити її. У цій главі описані структурні оператори програми SALUT і приведені приклади і вказівки по їхньому застосуванню. У ній також обговорюються кроки, що треба виконати для трансляції і форматування структурованих програм. СТРУКТУРНІ ОПЕРАТОРИ І СТРУКТУРИ ЛОГІКИ КЕРУВАННЯІснує більше десяти різних структурних операторів, але ними треба користуватися в строго визначених сполученнях, що у посібнику з Макроасемблеру називаються структурами логіки керування . Нижче визначені вісім різних структур логіки управління, але ми можемо розбити їх на три групи: структура IF (якщо) -- реалізує прийняття рішень Вона змушує мікропроцесор виконувати або пропускати групу команд у залежності від того, задовольняється задана умова чи ні. Структура IF аналогічна оператору IF-THEN на мові Бейсік. - Структура DO (виконати), що забезпечує повторення групи команд. Вона змушує мікропроцесор циклічно виконувати одну або декілька груп команд, поки не задовольниться задана умова. Структура DO аналогічна операторам FOR-NEXT у мові Бейсік. - Структура SEARCH (шукати) також пов'язана з повторенням команд, але використовується в тому випадку, коли вам необхідно знати, яка саме з декількох умов привела до завершення виконання циклу. Структура SEARCH виконує свій блок команд для кожної умови виходу з циклу. УМОВИ У СТРУКТУРАХ ЛОГІКИ КЕРУВАННЯУ табл. 1 показані умови, якими можна скористатися для керування структурами IF, DO і SEARCH. СТРУКТУРА IFСтруктура IF змушує мікропроцесор виконувати або пропускати групу команд в залежності від того, істинна чи хибна задана умова. Її основна форма: $IF умова А $ENDIF де умова -- умова що перевіряється (одна з тих, що перераховані в табл. 1), а А -- блок команд. Якщо умова істинна, то мікропроцесор виконує ці команди, у протилежному випадку він переходить до оператора, що слідує безпосередньо за оператором $ENDIF. (звернемо увагу, що цей порядок дій протилежний до того, по якому слідують команди умовної передачі керування: останні пропускають команди, якщо умова істинна). На мал. 1, а показана блок-схема структури IF. Наприклад, для перетворення числа, що знаходиться в регістрі BX на його абсолютне значення ми повинні скористатися операторами CMP BX, 0 ;Від’ємне значення? $IF L NEG BX ;Якщо так, змінити знак $ENDIF Таблиця 1. Умови в структурах логіки управління
СТРУКТУРА IF З ЧАСТКОЮ ELSEЯк і в мові Бейсік, ви можете вставити ELSE і змусити мікропроцесор виконувати альтернативну групу команд у випадку, якщо умова не істинна. Тоді структура IF буде мати вигляд: $IF умова A (здійснюється, якщо умова істинна) $ELSE B (здійснюється, якщо умова не істинна) $ENDIF На мал. 1,б показана блок-схема, що пояснює дію структури $IF-$ELSE-$ENDIF.
|
Структурний оператор |
NCXZ |
CXZ |
$IF умова |
Так |
Ні |
$IF умова, OR |
Ні |
Так |
$IF умова, AND |
Так |
Ні |
$LEAVE умова |
Ні |
Так |
$LEAVB умова, OR |
Ні |
Так |
$LEAVE умова, AND |
Так |
Ні |
$EXITIF умова |
Так |
Ні |
$EXITIF умова, AND |
Так |
Ні |
$EXITIF умова, OR |
Ні |
Так |
$EXITIF умова, AND, NUL |
Так |
Ні |
$EXITIF умова, OR, NUL |
Ні |
Так |
$EXITIF умова, NUL |
Ні |
Так |
$ENDLOOP умова |
Так |
Ні |
$ENDLOOP умова, AND |
Так |
Ні |
$ENDLOOP умова, OR |
Ні |
Так |
$ENDDO умова |
Так |
Ні |
$ENDDO умова, AND |
Так |
Ні |
$ENDDO умова, OR |
Ні |
Так |
ОБМЕЖЕННЯ НА ВИКОРИСТАННЯ УМОВ NCXZ І CXZ
Як згадувалося вище, програма SALUT транслює структурні оператори в їхні еквіваленти на мові асемблера. Зокрема, вона перетворить умовні оператори в команди Jx або JMP, а оператори $ENDIF, $DO, $SEARCH і $ENDSRCH -- у мітки. При цьому програма SALUT у багатьох випадках повинна перетворювати умовний оператор у протилежну команду умовної передачі керування. Наприклад, вона перетворить оператор $IF А в команду JNA L1 (де L1 -- мітка, що стоїть на місці оператора $ENDIF). Але через це при застосуванні умови CXZ можуть виникнути проблеми, оскільки команди JNCXZ немає. У табл. 2 перераховані ті оператори, в яких можуть використовуватися умови CXZ і NCXZ, і вказано, в яких випадках ці умови допустимі.
УПОРЯДКУВАННЯ СТРУКТУРОВАНИХ ПРОГРАМ
ПРОЦЕДУРА
При впорядкуванні структурованих програм можна користуватися тими ж прийомами, що і при впорядкуванні звичайних програм, із тією лише різницею, що текст програми треба опрацювати програмою SALUT для перетворення структурних операторів у стандартні команди на асемблері. Крім того, програма SALUT буде формувати вашу вихідну програму, розташовуючи елементи операторів по визначених стовпчиках. Таким чином, треба виконати такі кроки:
1. Набрати текст програми за допомогою редактора. Дати йому ім'я виду ім'я_файла. SAL, де SAL -- абревіатура від Structured Assembly Language (структурована мова асемблера).
2. Опрацювати файл типу SAL програмою SALUT. В результаті отримається файл з форматованою вихідною програмою ім'я_файла. SAL і проміжний робочий файл ім'я_файла. ASM. програма SALUT перейменує створений вами файл з неформатованою програмою в ім'я_файла. BAK.
3. Відтранслюйте проміжний робочий файл за допомогою Асемблера.
4. Знищити проміжний робочий файл типу ASM. При бажанні можна видалити і файл типу BAK.
5. Скористайтеся завантажувачем для створення виконуваного модуля.
РОЗРОБКА СТРУКТУРОВАНИХ ПРОГРАМ МЕТОДОМ «ЗВЕРХУ ВНИЗ»
Відповідно до методу розробки “зверху вниз” програма формується послідовною вставкою деталей у її початковий текст (що складається частіше всього лише з коментарів). Цей метод можна застосувати і для розробки структурованих програм. Для цього спочатку потрібно набирати керуючі оператори логічних структур, а потім вставляти команди, що повинні бути між ними. Щоб побудувати, наприклад, структуру IF, треба почати з операторів
$IF ;Якщо вказане правильне значення
$ELSE ;Тому що вказане неправильне значення
$ENDIF ;Кінець перевірки значення на правильність
Ця конструкція поки ще не може бути відтрансльована належною чином, оскільки в операторі $IF треба вказувати умову. Додаючи умову, отримуємо
$IF E ;Якщо вказане правильне значення
$ELSE ;Тому що вказане неправильне значення
$ENDIF ;Кінець перевірки значення на правильність
тепер ми маємо умову “дорівнює”, котрій повинне передувати порівняння значень. Вставляючи це порівняння, отримуємо
CMP AX,100 ;Перевірити на рівність із необхідним
Значенням
$IF E ;Якщо вказане правильне значення
$ELSE ;Тому що вказане неправильне значення
$ENDIF ;Кінець перевірки на правильність
Звернемо увагу на те, що тепер ми одержали щось прийнятне як для трансляції, так і для виконання. Тому ми на якийсь час можемо залишити цей фрагмент програми, а пізніше повернутися до нього для того, щоб заповнити “істинну” і “хибну” частини перевірки. Зрештою, ескіз, що ми одержали, цілком придатний для документування призначення цього фрагмента, а деталі можна додати і пізніше.
Важливим моментом цього прикладу є та обставина, що коментарі в тексті з'явилися одночасно з командами. Найкраще документувати програму в момент її написання, оскільки саме в цей час ви найкраще розумієте її.
ВИКОРИСТАННЯ ПРОГРАМИ SALUT
Для виклику програми SALUT одержите на екрані запрошення до вводу С>, а потім введіть команду типу
С>с:salut ім'я_файлу
Коли програма SALUT завершить свою роботу, у робочій директорії з’являться три файли: початкова вихідна програма ім'я_файлу.ВАК, переформатована версія вихідної програми ім'я_файлу.SAL і проміжний робочий файл ім'я_файлу.ASM. Тепер можна звичайним чином відтранслювати файл ім'я_файлу.АSМ, а потім завантажити об'єктний модуль ім'я_файлу.ОВJ і одержати виконуваний модуль ім'я_файлу.ЕХЕ.
ПАКЕТ КОМАНД ДЛЯ ПРОГРАМИ SALUT
Взагалі говорячи, після завершення роботи програми SALUT уже не потрібний файл із початковою вихідною програмою (з розширенням ВАК). А після завершення трансляції не потрібний і файл із розширенням ASM (якщо в програмі були помилки, то Вам треба виправляти не файл із розширенням ASM, а файл із розширенням SAL.) Тому потрібно видалити ці два файли. Щоб не робити це щоразу вручну, створіть пакет команд, що викликає програму SALUT і Макроасемблер, а потім видаляє файли з розширенням ВАК і ASM. Для цього (припускаючи, що ви хочете дати пакету команд ім'я ASMSAL.BAT) наберіть зазначені нижче рядки:
C>copy con: asmsal.bat
c:salut %1
erase %1.bak
c:masm %1,,;
erase %1. asm (натисніть клавішу F6)
Для виконання цього пакета введіть команду виду
C> c:asmsal ім'я_файлу
Врахуйте, що третя команда пакета, на жаль, автоматично створює файл із лістингом вихідної програми (із розширенням LST). Якщо він не потрібний, створіть інший пакет команд, указавши команду с:masm % 1; замість цього рядка.
ПЕРЕФОРМАТУВАННЯ ВИХІДНИХ ТЕКСТІВ ПРОГРАМОЮ SALUT
Якщо задаються інші параметри, то програма SALUT буде переформатовувати вихідну програму в такий спосіб:
1.Початковою позицією міток і самостійних коментарів буде стовпчик 1.
2.Початковою позицією структурних операторів і мнемокодів команд буде стовпчик 9.
3.Початковою позицією операндів буде стовпчик 17.
4.Початковою позицією коментарів буде стовпчик 41.
5.Всередині структур оператори зміщуються на чотири позиції вправо. При бажанні можна задати інші початкові позиції.
ПЕРЕФОРМАТУВАННЯ НЕСТРУКТУРОВАНИХ ПРОГРАМ
Потрібно врахувати що в програми SALUT функція переформатування відділена від функції опрацювання структур. Отже, якщо ми і не користуємося структурами, проте можемо викликати програму SALUT для переформатування своєї програми, написаної на мові асемблера. Для цього потрібно набрати текст програми як звичайно (скажемо, розділяючи елементи операторів одним пропуском або символом табуляції), потім зберегти його у файлі і ввести команду виду
С>с:salut ім'я_файлу.asm, ім'я_файлу. asm, nul
Програма SALUT переформатує файл ім'я_файлу.АSМ і перейменує неформатовану версію в ім'я_файлу.ВАК.
ЛІСТИНГ ПРОГРАМИ ДРУКУ ASCII ФАЙЛІВ print
; ДРУК ДИСКОВИХ ASCII ФАЙЛІВ
; ТЕХНIЧНI ЗАСОБИ, ЩО ВИКОРИСТОВУЮТЬСЯ:
;Програма виконується на ПК сумiсному з IBM PC базової конфiгурацiї ;монiтор, клавiатура).Мiнiмальнi вимоги: процесор фiрми Intel 8086 i ;старший , наявнiсть 3,5"дисковода або наявнiсть HDD, наявність EPSON-;сумісного матричного принтера.
;Програмне забезпечення: базова версія DOS.
; Для використання програми необхiдно запустити файл print.exe
;і на запрошення до вводу ввести повний шлях до файлу, який потрібно ;роздрукувати. Якщо задати тільки ім’я файлу, то програма шукатиме ;його в текучому каталозі.
ideal
model small
stack 256
;_______________________________________________________________
dataseg
filenam db 32 dup(' ') ;список параметрiв для
maxlen db 32 ;вводу
namelen db 0 ;iменi файлу
sector db 512 dup(' ') ;область вводу файлу
disarea db 120 dup(' ') ;область виводу
count dw 00
endcde dw 00
handle dw 0
openmsg db '***Open error***',10,13
prompt db 'Name of file? '
;-------------------------------------------------------------------
codeseg
start:
mov ax,@data
mov ds,ax
mov es,ax
call clrscr ;очистити екран
call cursor ;встановити курсор
loop1:
mov [endcde],00 ;початкова установка
call inp_filename ;получити iм"я файлу
cmp [namelen],00 ;є запит?
je a90 ;нi - вийти
call open_file ;вiдкрити файл, встановити DTA
cmp [endcde],00 ;помилка при вiдкриттi?
jne a80 ;так - повторний запит
call readsector ;прочитати 1-й сектор
cmp [endcde],00 ;кiнець файлу, нема даних
je a80 ;так - повторити запит
call printing ;роздрукувати сектор
a80:
jmp loop1
a90: jmp buy
; П/програма запиту iменi файлу:
; ------------------------------
proc inp_filename
mov ah,40h ;функцiя виводу на екран
mov bx,01
mov cx,13
lea dx,[prompt]
int 21h
mov ah,0ch
mov al,0ah ;функцiя вводу з клвiатури
lea dx,[filenam]
int 21h
mov bl,[filenam+1] ;записати
xor bh,bh ;00 в кiнець
mov [filenam+bx+2],0 ;iменi файлу
mov [byte namelen],bl
c90: ret
endp inp_filename
; Вiдкриття дискового файлу:
; --------------------------
proc open_file
mov ah,3dh ;функцiя вiдкриття
mov al,00 ;тiльки читання
lea dx,[filenam+2]
int 21h
jnc e20 ;перевiрити ознаку CF
call errormsg ;помилка, якщо встановлена
ret
e20:
mov [handle],ax ;зберегти номер файлу
lea di,[sector]
mov ax,2020h
mov cx,256 ;очистити пропусками
rep stosw ;область сектора
ret
endp open_file
; Пiдготовка i друк даних:
; --------------------------
proc printing
cld ;напрям злiва направо
lea si,[sector] ;початкова установка
g20:
lea di,[disarea]
mov [count],00
g30:
lea dx,[sector+512]
cmp si,dx ;кiнець сектора?
jne g40
call readsector ;так - читати наступний
cmp [endcde],00 ;кiнець файлу?
je g80 ;так - вийти
lea si,[sector]
g40:
mov bx,[count]
cmp bx,80 ;кiнець областi виводу?
jb g50 ;нi - обiйти,
mov [Word bx+di],0d0ah ;так - записати CR/LF
call print
lea di,[disarea] ;початок областi вивлду
g50:
lodsb ;записати [SI] в AL, збiльшити SI
mov bx,[count]
mov [di+bx],al ;записати символ
inc bx
cmp al,1ah ;кiнець файлу
je g80 ;так - вийти
cmp al,0ah ;кiнець строки?
jne g60 ;нi - обiйти
call print ;так - друкувати
jmp g20
g60:
cmp al,09h ;символ табуляцiї
jne g70
dec bx ;так - встановити BX:
mov [byte di+bx],20h ;замiнити ТАВ на пропуск
and bx,0fff8h ;обнулити правi 8 бiт
add bx,08 ;i додати 8
g70:
mov [count],bx
jmp g30
g80: mov bx,[count] ;кiнець файлу
mov [byte di+bx],0ch ;прогон сторiнки
call print ;друкувати останню строку
g90: ret
endp printing
; Пiдпрограма друку:
; ------------------
proc print
mov ah,40h ;функцiя друку
mov bx,04
mov cx,[count] ;довжина
inc cx
lea dx,[disarea]
int 21h
mov ax,2020h ;очистити область виводу
mov cx,60
lea di,[disarea]
rep stosw
ret
endp print
; Пiдпрогама зчитування сектора:
; ------------------------------
proc readsector
mov ah,3fh ;функцiя читання з файлу
mov bx,[handle] ;номер файлу
mov cx,512 ;довжина
xor dx,dx
mov dl,[offset sector] ;буфер
int 21h
mov [endcde],ax
ret
endp readsector
; Прокрутка екрану:
; -----------------
proc clrscr
mov ax,0600h
mov bh,0fh ;встановити колiр
mov cx,0000 ;прокрутка (скролiнг)
mov dx,184fh
int 10h
ret
endp clrscr
; Пoдпрограма встановлення курсора:
; ---------------------------------
proc cursor
mov ah,02 ;функцiя установки
mov bh,00 ;курсора
mov dx,00
int 10h
ret
endp cursor
; Вивiд повiдомлення про помилку:
; -------------------------------
proc errormsg
call clrscr
call cursor
mov ah,40h ;функцiя виводу на екран
mov bx,01 ;номер
mov cx,18 ;довжина
lea dx,[openmsg] ;адрес повiдомлення
int 21h
mov [endcde],01 ;ознака помилки
ret
endp errormsg
buy:
call clrscr
call cursor
mov ah,04ch
mov al,[byte endcde]
int 21h
end start
СПИСОК ВИКОРИСТАНОЇ ЛІТЕРАТУРИ:
1. П. Абель Я зык Ассемблера для IBM PC и программирование /Пер. с англ. Ю.В. Сальников.– М.:Высш. шк., 1992.–447с.:ил.
2. Л. Скэнлон Персональные ЭВМ IBM PC и ХТ. Програмирование на языке Ассемблера.–М.: Радио и связь.–1989.
* використовується при виконанні операцій над числами із знаком (в додатковому коді).