Смекни!
smekni.com

Структурне програмування на асемблері (стр. 4 из 4)

$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.


* використовується при виконанні операцій над числами із знаком (в додатковому коді).

[i1]