ОПРАЦЮВАННЯ ПОТОКОВИХ ДАНИХ ЗАСОБАМИ МОВИ АСЕМБЛЕР

Інформація про навчальний заклад

ВУЗ:
Інші
Інститут:
Не вказано
Факультет:
Не вказано
Кафедра:
Не вказано

Інформація про роботу

Рік:
2024
Тип роботи:
Розрахункова робота
Предмет:
Програмування частина 4 Технологія системного програмування

Частина тексту файла (без зображень, графіків і формул):

Мета: Ознайомитися та засвоїти особливості роботи з потоками вводу/виводу та написання програм для опрацювання потокових даних. ТЕОРЕТИЧНІ ВІДОМОСТІ Основні принципи роботи з потоками вводу/виводу Одне з основних призначень дискової операційної системи (DOS) було забезпечити доступ до дисків та файлів, які на них зберігаються. Перші версії DOS підтримували лише файлову систему FAT. Дана файлова система оперує файлами та директоріями, які можуть мати будь-яке ASCII символьне ім’я в форматі 8.3 (8 ASCII символів назви і 3 ASCII символи розширення розділені крапкою). Останні версії DOS забезпечують підтримку також і VFAT – модифікації FAT, яка підтримує довгі імена (до 255 символів). Кожен файл або директорія має байт атрибутів. Призначення бітів цього байту наступне: біт 7: резервний і завжди має бути рівним 0; біт 6: резервний і завжди має бути рівним 0; біт 5: архівний (визначає чи елемент FAT підлягає архівуванню); біт 4: директорія (вказує чи елемент FAT є файлом або директорією); біт 3: мітка тому (спеціальний атрибут, який мають лише унікальні файли нульового розміру в кореневій директорії, ім’я яких вважається міткою тому) біт 2: системний біт 1: прихований біт 0: тільки для читання При роботі з файлами і директоріями в запущеній на виконання програмі (процесі) одночасно можуть бути відкритими кілька файлів. Для їх ідентифікації використовується двохбайтний дескриптор файлу (ідентифікатор). Перші 5 дескрипторів зарезервовані за стандартними потоками вводу/виводу. Стандартні потоки вводу/виводу в ОС - це потоки процесу, що мають номер (дескриптор) і є зарезервовані для деякої «стандартної» функціональності. Стандартними дескрипторами (ідентифікаторами) потоків і відповідними їм назвами є: 0 : STDIN - стандартний потік вводу (зазвичай клавіатура); 1 : STDOUT - стандартний потік виводу (зазвичай екран); 2 : STDERR - стандартний потік помилок (завжди екран); 3 : AUX - потік послідовного порту (зазвичай СОМ1); 4 : PRN - потік паралельного порту (зазвичай LPT1). Розглянемо відмінності між файлами та потоками. У системі вводу/виводу, яку забезпечує DOS, підтримується єдиний інтерфейс, що не залежить від того, до якого конкретного пристрою здійснюється доступ (за винятком пристроїв обмін даними з якими відбувається лише за допомогою інструкцій IN та OUT). Тобто в цій системі між програмою й пристроєм перебуває щось загальніше, ніж сам пристрій. Такий узагальнений пристрій вводу або виводу (пристрій більше високого рівня абстракції) називається потоком, у той час як конкретний пристрій називається файлом. Файлова система DOS призначена для роботи із різними пристроями, у тому числі терміналами, дисководами, дисками й накопичувачами на магнітній стрічці. Навіть якщо якийсь пристрій сильно відрізняється від інших, буферизована файлова система представить його у вигляді логічного пристрою, що називається потоком. Всі потоки 4 мають схожу поведінку. І тому, що вони в основному не залежать від фізичних пристроїв, то та ж функція, що виконує запис у дисковий файл, може здійснювати запис і у інший пристрій, наприклад, у консоль чи у пристрій, що підключений через COM порт. Взаємодія потоків і файлів реалізується шляхом зв’язування потоку із певним файлом виконанням операції відкривання файлу. Як тільки файл відкритий, можна проводити обмін інформацією між ним і програмою. Але не у всіх файлів однакові можливості. Наприклад, до дискового файлу прямий доступ можливий, у той час як до деяких принтерів - ні. Таким чином, ми прийшли до важливої особливості системи вводу/виводу DOS: всі потоки однакові, а файли - ні. Якщо файл може підтримувати запити на місце розташування (покажчик поточної позиції), то при відкритті такого файлу покажчик поточної позиції у файлі встановлюється в початок. При читанні з файлу (або запису в нього) кожного символу покажчик поточної позиції збільшується, забезпечуючи тим самим просування по файлі. Файл від'єднується від певного потоку (тобто розривається зв'язок між файлом і потоком) за допомогою операції закривання. При закритті файлу, відкритого з метою виводу, уміст (якщо він є) пов'язаного з ним буферу записується на зовнішній пристрій. Цей процес, що звичайно називають дозаписом потоку, гарантує, що ніяка інформація випадково не залишиться в буфері файлу. Робота з файлами засобами мови асемблер принципово мало чим відрізняється від роботи з файлами засобами мови С. Перед тим як працювати файлом (потоком) його попередньо необхідно відкрити або створити, в результаті чого отримується дескриптор файлу (потоку). Для цього використовуються функції 21 переривання DOS: 3Ch – функція створення файлу, 3Dh – функція відкривання існуючого файлу (потоку), 5Bh – функція створення та відкривання нового файлу, 5Ah – функція створення та відкривання тимчасового файлу. Після одержання дескриптора файлу (потоку) можна: читати вміст файлу (функція 3Fh), переміщувати вказівник по вмісту файлу (функція 42h), записувати у файл (функція 40h), записувати вміст файлових буферів DOS в потік (функція 68h) та записувати вміст всіх буферів в потік (функція 0Dh). Після завершення роботи з файлом (потоком) його треба закрити (функція 3Еh) та, при потребі, видалити (функція 41h). Існує також набір функцій для пошуку елементів FAT (файлів та папок). Для цього використовуються функції DOS 4Eh, 1Ah, 4Fh. Програма ; main.asm головна програма EXTRN Input :FAR, Calculation :FAR, Output :FAR PUBLIC erFlag STACKSG SEGMENT PARA STACK 'Stack' DW 127 DUP(0) STACKSG ENDS DATASG SEGMENT PARA PUBLIC 'Data' erFlag DB 0 DATASG ENDS CODESG SEGMENT PARA PUBLIC 'Code' main: ASSUME CS:CODESG,DS:DATASG,SS:STACKSG MOV AX,DATASG MOV DS,AX CALL Input cmp erFlag,0 jne A30 CALL Calculation cmp erFlag,0 jne A30 CALL Output cmp erFlag,0 jne A30 A30: mov ah,4Ch int 21h CODESG ENDS END main ;Input.asm модуль вводу даних EXTRN erFlag:BYTE PUBLIC A,B,C,E,F MY_MUL MACRO X,Y,Z mov z,0 mov z+2,0 MOV AX,X MUL Y MOV Z,AX MOV Z+2,DX MOV AX,X+2 MUL Y ADD Z+2,AX mov ax,Z mov dx,Z+2 ENDM DATASG SEGMENT PARA PUBLIC 'Data' ifname db 'in.txt',0 buf db 0h A dw 00h B db 00h C dd 00h E db 00h F db 00h Temp1 dw 00h Temp2 dw 00h Temp3 dw 00h Temp4 dw 00h X dw 00h,00h mark db 00h bf dw 0h TempStr db 10 dup (0) TempBin dw 0,0 MaxLen dw 0 Mult10 dw 1,0 my_z dw 0,0 MESSG_X DB 13,10,'X=A2*B1+C4/(K-E1*F1) K=10974759 (A77627h)','$' MESSG_A DB 13,10,'A= ','$' MESSG_B DB 13,10,'B= ','$' MESSG_C DB 13,10,'C<= From file','$' MESSG_E DB 13,10,'E<= From file','$' MESSG_F DB 13,10,'F= ','$' MESSG_X1 DB 13,10,'X= ','$' erStr1 db 13,10,'Data not input_variable',13,10,'$' erStr2 db 13,10,'Incorrectly data ',13,10,'$' erStr2_1 db 13,10,' B =0 --> divide by zero ',13,10,'$' erStr2_2 db 13,10,' E =0 --> divide by zero ',13,10,'$' erStr3 db 13,10,'Data is too long ',13,10,'$' DATASG ENDS CODESG SEGMENT PARA PUBLIC 'CODE' ASSUME DS:DATASG, CS:CODESG input proc FAR public Input ;Відкриття файлу для читання ;mov ah,3Dh ; Вказуємо номер функції для відкривання існуючих файлів ;mov al,00h ; Вказуємо режим відкривання файлу ( 0 - на читання) ;mov dx,offset ifname ; Вказуємо шлях до файлу ('d:\Home\KI-2\input.txt') ;mov cx,0 ; Вказуємо режим відкривання файлу - на читання ;int 21h ; Відкриваємо файл в режимі читання ;mov [bp],ax ; Зберігаємо ідентифікатор файлу на читання в локальній змінній 1 mov ah,3Dh mov al,00h mov dx,offset ifname mov cx,0 int 21h mov bf,ax LEA DX,MESSG_X ;X=A2/B1+C2-D1*E1+K К=1558 (616h) MOV AH,09 INT 21H LEA DX,MESSG_A MOV AH,09 INT 21H mov di,offset A mov MaxLen,5 mov cx,MaxLen call input_variable LEA DX,MESSG_B MOV AH,09 INT 21H mov di,offset B mov MaxLen,3 mov cx,MaxLen call input_variable cmp B,0 jne dali mov ah,09 mov dx, offset erStr2_1 int 21h mov ah,4Ch int 21h dali: LEA DX,MESSG_C MOV AH,09 INT 21H mov di,offset C mov MaxLen,10 mov cx,MaxLen mov mark,1 call input_variable mov mark,0 LEA DX,MESSG_E MOV AH,09 INT 21H mov di,offset E mov MaxLen,3 mov cx,MaxLen mov mark,1 call input_variable mov mark,0 LEA DX,MESSG_F MOV AH,09 INT 21H mov di,offset F mov MaxLen,3 mov cx,MaxLen call input_variable mov ah, 3Eh mov bx,[bp] int 21h ret ret input endp input_variable PROC mov si,0 In_00: call input_file cmp al,0Dh je In_1 cmp al,'-' jne In_0 mov erFlag,1 jmp In_00 In_0: mov dl,al call CHECK_BYTE mov TempStr[si],dl inc si loop In_00 In_1: push si dec si cmp cx,MaxLen jne In_2 LEA DX,erSTR1 MOV AH,09 INT 21H mov erFlag,1 jmp In_5 In_2: mov bh,0 mov bl,TempStr[si] MY_MUL Mult10,bx,my_z add TempBin,ax adc TempBin+2,dx mov bh,0 mov bl,10 MY_MUL Mult10,bx,my_z mov Mult10,ax mov Mult10+2,dx dec si cmp si,0 jge In_2 mov ax,TempBin mov dx,TempBin+2 pop si cmp si,MaxLen jl In_3 cmp MaxLen,10 jl In_2_1 js In_Err cmp dx,0FFFFh ja In_Err jmp In_3 In_2_1:cmp MaxLen,5 jl In_2_2 cmp dx,00 ja In_Err cmp ah,0FFh ja In_Err jmp In_3 In_2_2:cmp ax,00FFh jbe In_3 In_Err:LEA DX,erSTR3 MOV AH,09 INT 21H mov erFlag,1 jmp In_5 In_3:cmp erFlag,1 jne In_4 mov bx,0 sub bx,ax mov ax,bx mov bx,0 sbb bx,dx mov dx,bx In_4: mov [di],ax mov [di+2],dx mov TempBin,0 mov TempBin+2,0 mov Mult10,1 mov Mult10+2,0 mov erFlag,0 In_5: RET input_variable ENDP ;Читання з файлу ;mov ah,3Fh ; Вказуємо номер функції для читання з файлу ;mov bx,[bp] ; Записуємо ідентифікатор файлу на читання з локальної.. ; ..змінної 1 у dx ;mov cx,20 ; Вказуємо кількість байт, які необхідно прочитати ;mov dx, offset buf ; Вказуємо адресу буферу для зберігання прочитаних даних ;int 21h ; Читаємо з файлу ;mov [bp+4],ax ; Зберігаємо кількість реально прочитаних байт з файлу.. ; ..в локальній змінній 3 input_file PROC cmp mark,1 je mark2 Mark1:mov ah,01 int 21h jmp mark3 Mark2: push cx mov ah,3Fh mov bx,bf mov cx,1 mov dx, offset buf int 21h mov al,buf pop cx cmp al,20h je mark2 Mark3: ret input_file ENDP CHECK_BYTE PROC sub dl,30h cmp dl,00 jl ErS cmp dl,0Ah jl GO ErS: LEA DX,erSTR2 MOV AH,09 INT 21H GO: RET CHECK_BYTE ENDP CODESG ENDS END ; calc.asm модуль обчислень EXTRN A:WORD,B:BYTE,C:DWORD,E:BYTE,F:BYTE PUBLIC X;,MESSG_Sign DATASG SEGMENT PARA PUBLIC 'Data' K_low EQU 6982h K_high EQU 0005h Temp1 dw 00h,00h Temp2 dw 0000h Temp3 dw 00h,00h Temp4 dw 00h,00h X dw 00h,00h DATASG ENDS CODESG SEGMENT PARA PUBLIC 'CODE' ASSUME DS:DATASG, CS:CODESG MOV AX,DATASG MOV DS,AX calculation proc Far public calculation xor ax,ax xor bx,bx xor cx,cx xor dx,dx mov ax,0 mov al,B mul A mov Temp1,ax;=0002 mov Temp1+2,dx;=0000 mov ax,0 mov al,E mul F mov Temp2,ax ;=4B0 mov dx,K_high mov ax,K_low mov bx,Temp2 sub ax,bx sbb dx,0 mov Temp3,ax;=7177 mov Temp3+2,dx;=00A7 mov ax,word ptr[C] mov dx,word ptr[C+2] div Temp3 mov Temp4,ax mov dx,0 mov ax,Temp4 add Temp1,ax adc Temp1+2,0 mov X,ax mov X+2,dx ret calculation endp CODESG ENDS END ;Output.asm модуль виводу результату EXTRN X:DWORD;, MESSG_Sign :BYTE DATASG SEGMENT PARA PUBLIC 'Data' ofname db 'out.txt',0 bff dw 0h X_Str db 10 dup (0),0 X_Str2 db 10 dup (0),0 MESSG_X1 DB 13,10,'X= ','$' X_div2 dw 0,0 Y_div2 dw 0 DATASG ENDS CODESG SEGMENT PARA PUBLIC 'CODE' ASSUME DS:DATASG, CS:CODESG MOV AX,DATASG MOV DS,AX output PROC FAR Public output ;Створення файлу та відкриття його для читання ;mov ah,3Ch ; Вказуємо номер функції для створення файлів ;mov cx,0 ; Вказуємо атрибути майбутнього файлу (звичайний файл) ;mov dx,offset ofname ; Вказуємо назву майбутнього файлу (out.txt) ;int 21h ; Створюємо новий файл і відкриваємо його в режимі запису ;mov [bp+2],ax ; Зберігаємо ідентифікатор створеного і відкритого на запис... ; ..файлу в локальній змінній 2 mov ah,3Ch mov cx,0 mov dx,offset ofname int 21h mov bff,ax mov di,0 mov Y_div2,10 mov cx,word ptr X mov bx,word ptr X+2 O_1:mov X_div2,cx mov X_div2+2,bx call my_div2 add dl,30h mov X_Str[di],dl inc di cmp bx,0 ja O_1 cmp cx,10 jae O_1 add cl,30h mov X_Str[di],cl mov dx,offset MESSG_X1 mov ah,09 int 21h O_2: mov dl,X_Str[di] mov ah,02h int 21h dec di jge O_2 mov di,10 mov si,0 mov cx,10 markk: mov al,X_Str[di] mov X_Str2[si],al inc si dec di loop mark ;Запис у файл ;mov ah,40H ; Записуємо номер функції для запису у файл в аh ;mov bx,[bp+2] ; Вказуємо ідентифікатор відкритого на запис файлу ;mov cx,[bp+4] ; Вказуємо кількість байт, які необхідно записати ;mov dx,offset buf ; Вказуємо адресу буферу з даними, які необхідно записати ;int 21h ; Записуємо в файл mov ah,40h mov bx,bff mov cx,10 mov dx,offset X_Str2 int 21h ret output ENDP MY_DIV2 proc sub cx,cx sub bx,bx mov dx,X_div2+2 mov ax,X_div2 M2_D1: cmp dx,Y_div2 jb M2_D3 sub ax,Y_div2 sbb dx,00 add cx,01 adc bx,0 jmp M2_D1 M2_D3: div Y_div2 add cx,ax adc bx,00 ret MY_DIV2 ENDP CODESG ENDS END
Антиботан аватар за замовчуванням

19.12.2013 23:12-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!