Інститут менеджменту та економіки “Галицька Академія”
КУРСОВА РОБОТА
Тема - Використання операційної системи MS DOS для роботи із файлами
Зміст
Розробка блок-схеми алгоритму
Розробка Assembler програми
Список використаної літератури
РОЗРОБКА ASSЕMBLER –ПРОГРАМИ
model small
;======== СЕГМЕНТ ДАНИХ ====================================
dataseg
f1 db 's:\Tasm\F1.txt',0
f2 db 's:\Tasm\F2.txt',0
f3 db 's:\Tasm\F3.txt',0
descr1 dw ? ;дескриптор файла 1
descr2 dw ? ;дескриптор файла 2
descr3 dw ? ;дескриптор файла 3
ZM db ?,?,? ;змінна через яку будем записувати дані у файл
;======== СЕГМЕНТ КОДIВ =====================================
codeseg
start:
;========== ІНІЦІАЛІЗАЦІЯ РЕГІСТРА DS =========================
mov ax,@data
mov ds,ax
;========= ВІДКРИТТЯ ФАЙЛІВ =================================
mov ah,3ch ;створення файла
xor cx,cx ;
mov dx,offset f1 ;записуєм адресу пам'яті f1 в регістр dx
int 21h
mov [descr1],ax ;зберiгаємо дескриптор файла
mov ah,3ch ;створення файла
mov dx,offset f2 ;записуєм адресу пам'яті f2 в регістр dx
int 21h
mov [descr2],ax ;зберiгаємо дескриптор файла
mov ah,3ch ;створення файла
mov dx,offset f3 ;записуєм адресу пам'яті f3 в регістр dx
int 21h
mov [descr3],ax ;зберiгаємо дескриптор файла
mov si,0000h ;
m7:
;============ВВІД ЧИСЛА=====================================
mov ah,1 ;вводимо старшу тетраду
int 21h
mov [ZM],al ;зберiгаємо ASCII-код старшої тетради
sub al,30h ;ASCII-корекція
cmp al,10 ;перевірка на літеру
jc m1 ;введено цифру -> перехід по мітці
sub al,7 ;введено літеру -> корекція для літери
m1:
mov dl,al ;зберігаємо старшу тетраду в dl
shl dl,1 ;зсуваємо старшу тетраду на 4 розряди вліво
shl dl,1
shl dl,1
shl dl,1
mov ah,1 ;вводимо молодшу тетраду
int 21h
mov [ZM+1],al ;зберiгаємо ASCII-код молодшої тетради
sub al,30h ;ASCII-корекція
cmp al,10 ;перевірка на літеру
jc m2 ;введено цифру -> перехід по мітці
sub al,7 ;введено літеру -> корекція для літери
m2:
add dl,al ;зберігаємо молодшу тетраду
xor dh,dh ;розширюємо введене число до слова
mov di,dx ;збегіраємо введене число в регістрі DI
;====== ПИШЕМО ВВЕДЕНЕ ЧИСЛО В ФАЙЛ f1 ====================
mov cx,2 ;заносимо кількість байтів, що необхідно записати
mov bx,[descr1] ;заносимо дескриптор файлу F1
mov ah,40h ;функцiя запису до файла
mov dx,offset ZM ;адреса буфера, де зберігаються дані для запису в фаїл
int 21h ;виклик функцiї запису
;======== МНОЖИМО ВВЕДЕНЕ ЧИСЛО НА 12.5 ===================
mov ax,di
shl ax,1 ;ax=x*2
shl ax,1 ;ax=x*4
mov bx,ax
shl bx,1 ;bx=x*8
add ax,bx ;ax=x*12
shr di,1 ;di=x/2
add ax,di ;ax=x*12.5
mov di,ax ;зберігаємо результат в DI
;============ ПЕРЕТВОРЮЄМО РЕЗУЛЬТАТ В ASCII ===============
;перетворення старшої тетради результату (0000 ХХХХ 0000 0000)
add ah,30h ;додаємо 30h для одержання ASCII-коду
cmp ah,3Ah ;перевірка на літеру
jc m3 ;не літера -> перехід на мітку
add ah,7 ;літера -> корекція для літери
m3: mov [zm],ah ;зберігаємо ASCII-код тетради
;перетворення середньої тетради результату (0000 0000 XXXX 0000)
shr al,1 ;зсув середньої тетради на 4 розряди вправо
shr al,1 ;
shr al,1
shr al,1
add al,30h ;додаємо 30h для одержання ASCII-коду
cmp al,3Ah ;перевірка на літеру
jc m4 ;не літера -> перехід на мітку
add al,7 ;літера -> корекція для літери
m4: mov [zm+1],al ;зберігаємо ASCII-код тетради
;перетворення молодшої тетради результату (0000 0000 0000 XXXX)
mov ax,di ;відновлення
and al,0Fh ;виділяємо молодшу тетраду
add al,30h ;додаємо 30h для одержання ASCII-коду
cmp al,3Ah ;перевірка на літеру
jc m5 ;не літера -> перехід на мітку
add al,7 ;літера -> корекція для літери
m5: mov [zm+2],al ;зберігаємо ASCII-код тетради
;=========== ПИШЕМО ДОБУТОК В ФАЙЛ f2 ======================
mov cx,3 ;заносимо кількість байтів, що необхідно записати
mov bx,[descr2] ;заносимо дескриптор файлу F2
mov ah,40h ;функцiя запису до файла
mov dx,offset ZM ;адреса буфера, де зберіг.дані для запису в файл
int 21h ;виклик функцiї запису
;========= ПРИ НЕОБХІДНОСТІ ПИШЕМО В ФАЙЛ f3 ===============
mov ah,[zm] ;зчитуємо старший байт
cmp ah,30h ;перевірка на '0'
jne m6 ;перехід якщо не '0'
mov cx,2 ;заносимо кількість байтів, що необхідно записати
mov bx,[descr3] ;заносимо дескриптор файлу F3
mov ah,40h ;функцiя запису до файла
mov dx,offset [ZM+1] ;адреса буфера, де зберігаються дані для запису в файл
int 21h ;виклик функцiї запису
m6:
inc si ;(SI = SI +1)
cmp si,0010h ;порівнюємо SI з кількістю чисел , що треба ввести (16)
je m8 ;перехід якщо SI = 16
jmp m7 ;перехід на ввід наступного числа
;========= ЗАКРИТТЯ ФАЙЛІВ =================================
m8:
mov ah,3Eh ;закриття файлу
mov bx,[descr1] ;дескриптор файлу F1
int 21h
mov ah,3Eh ;закриття файлу
mov bx,[descr2] ;дескриптор файлу F2
int 21h
mov ah,3Eh ;закриття файлу
mov bx,[descr3] ;дескриптор файлу F3
int 21h
;========== ЗАВЕРШЕННЯ ПРОГРАМИ ===========================
mov ah,4ch ;функція передачі управління MS-DOS
int 21h ;завершення програми
end start
РОЗРОБКА БЛОК-СХЕМИ АЛГОРИТМУ
Обсяг пам’яті: 260 байт
Кількість тактів, необхідних для виконання програми, не враховуючи виклики переривань: 5197