Основну роботу виконує функція DirEngine, в яку, за допомогою регістру bx, передається зміщення функції Action (для подальшого виклику її за зміщенням)


перейти к полному списку дипломных проектов

Ссылка на скачивания файла в формате .doc находится в конце странички

Основну роботу виконує функція DirEngine, в яку, за допомогою регістру bx, передається зміщення функції Action (для подальшого виклику її за зміщенням)

З'являється необхідність перетворення двійкових даних у ASCII-рядки, щоб у подальшому їх можна було вивести на екран. Дану проблему і покликані вирішити функції модуля BINASC.asm. Модуль складається із чотирьох функцій: допоміжних функцій HexDigit (перетворення чотирьохбітового значення у ASCII-цифру) і NumToAscii (перетворення беззнакового двійкового числа у ASCII-рядок), а також двох функцій BinToAscHex і BinToAscDec, які встановлюють систему числення і викликають вищезгадані функції.

Слід зазначити, що функція BinToAscDec зручна для перетворення і подальшого виводу чисел типу "слово" у вигляді десяткового числа.

Функцію BinToAscHex можна використовувати для виводу подвійного слова у вигляді шістнадцятирічного числа, послідовно перетворюючи і виводячи спочатку молодші два, а потім і старші байти, на екран.

Це дозволяє вирішити проблему обробки чотирьохбайтових даних, оскільки звичайні регістри є двохбайтовими і перетворення такого числа у, наприклад, десяткове представлення є проблематичним.

Код програмного модуля BINASC.asm приведено нижче:

IDEAL

MODEL small

ASCnull EQU 0 ; нульовий ASCII-символ

DATASEG

CODESEG

PUBLIC HexDigit, NumToAscii

PUBLIC BinToAscHex, BinToAscDec

; -------------------------------------------------------------------------------------------

; HexDigit перетворює чотирьохбітове значення в ASCII-цифру

; -------------------------------------------------------------------------------------------

; Вхід dl значення від 0 до 15

; Вихід dl шістнадцятирічний еквівалент ASCII-цифри

; Регістри dl

; -------------------------------------------------------------------------------------------

PROC HexDigit

cmp dl, 10 ; перевірка, чи є dl < 10

; (тобто менше шістнадцятирічного 'А')

jb @@10 ; якщо так, то перехід

add dl, 'A'-10 ; перетворити в A, B, C, D, E або F

ret ; повернення до викликаючої програми

@@10:

or dl, '0' ; перетворити в числа від 0 до 9

ret ; повернення до викликаючої програми

ENDP HexDigit

; -------------------------------------------------------------------------------------------

; NumToAscii перетворює беззнакове двійкове значення у ASCII-рядок

; згідно із заданою системою числення

; -------------------------------------------------------------------------------------------

; Вхід ax двохбайтове число, яке перетворюється

; bx основа системи числення результату (2 – двійкова,

; 10 – десяткова, 16 – шістнадцятирічна)

; cx мінімальна кількість цифр, що виводяться

; di адреса рядка для результату

; Вихід di вказує на новостворений рядок із результатом

; Регістри не має

; -------------------------------------------------------------------------------------------

PROC NumToASCII

push dx ; збереження змінюваних регістрів

push di

push si

xor si, si ; встановити лічильник цифр у стеку в 0

jcxz @@20 ; якщо cx = 0, то перехід

@@10:

xor dx, dx ; обнуління dx; ax розширюється до

; 32-х-бітного dxax

div bx ; в ax результат ділення на bx, в dx залишок

call HexDigit ; перетворення числа в dl в ASCII-пару

push dx ; збереження цифри в стеку

inc si ; збільшення лічильника цифр у стеку

loop @@10 ; виконувати цикл, доки не оброблена

; мінімальна кількість цифр

@@20:

inc cx ; встановити cx=1, якщо не усі цифри

; оброблені

or ax, ax ; перевірка ax на обробку всіх цифр

jnz @@10 ; якщо ax?a, продовження перетворень

mov cx, si ; в cx поміщується кількість цифр у стеку

jcxz @@40 ; пропуск наступного циклу, якщо cx=0

cld ; автоматичне збільшення di

@@30:

pop ax ; в ax поміщується цифра із стеку

stosb ; запис цифри в рядок і збільшення di

loop @@30 ; в циклі вивід cx цифр

@@40:

mov [byte di], ASCnull ; записується 0 у кінець рядка

pop si ; відновлення регістрів

pop di

pop dx

ret ; повернення до викликаючої програми

ENDP NumToASCII

; -------------------------------------------------------------------------------------------

; BinTo AscHex перетворює двійкове значення в шістнадцятирічні

; ASCII-рядки

; -------------------------------------------------------------------------------------------

; Вхід ax двохбайтове значення, що перетворюється

; cx мінімальна кількість чисел, що виводиться

; di адреса рядка для результату

; Вихід di вказує на рядок із сформованим результатом

; Регістри не має

; -------------------------------------------------------------------------------------------

PROC BinToAscHex

mov bx, 16 ; в bx встановити основу шістнадцятирічної

; системи числення - 16

call NumToAscii ; перетворення числа із ax в ASCII-рядок,

; на який вказує di

ret ; повернення до викликаючої програми

ENDP BinToAscHex

; -------------------------------------------------------------------------------------------

; BinTo AscHex перетворює двійкове значення в десяткові ASCII-рядки

; -------------------------------------------------------------------------------------------

; Вхід ax двохбайтове значення, що перетворюється

; cx мінімальна кількість чисел, що виводиться

; di адреса рядка для результату

; Вихід di вказує на рядок із сформованим результатом

; Регістри не має

; -------------------------------------------------------------------------------------------

PROC BinToAscDec

mov bx, 10 ; в bx встановити основу десяткової

; системи числення – 10

call NumToAscii ; перетворення числа із ax в ASCII-рядок,

; на який вказує di

ret ; повернення до викликаючої програми

ENDP BinToAscDec

END

Таким чином програмний модуль BINASC.asm дає нам спеціальні функції, що дозволяють перетворити і вивести на екран дані із DTA, що описують файли.

3.2. Розробка основної програми DR.asm

Модулі PARAMS.asm, STRIO.asm і BINASC.asm складають функціональну базу програмних інструментів для розробки основної програми. Згідно із поставленою задачею, програма має знаходити файли, задані маскою, копіювати DTA, що їх описує, у власний буфер, обробляти отримані дані і виводити необхідну інформацію на екран, а потім переходити до наступного файлу, що відповідає масці, доки не обробить всі.

Таким чином задачу можна розбити на 3 частини:

Отримання конфігураційних даних із консолі і, при їх відсутності, встановлення стандартної маски файлів;

Пошук файлів, що відповідають масці, і заповнення внутрішнього буферу їх DTA (процедура DirEgine);

Саме обробка DTA, вивід даних на екран (процедура Action).

Спираючись на викладені міркування, було створено основну програму DR.asm:

IDEAL

MODEL small

STACK 256

FileName EQU 30 ; зміщення імені файлу в буфері dirData

DATASEG

exCode DB 0 ; код виходу

defaultSpec DB '*.*', 0 ; стандартній ASCII-шаблон маски

DTAseg DW ? ; сегмент для DTA

DTAofs DW ? ; зміщення для DTA

dirData DB 43 DUP (?) ; буфер для запису вмісту каталогу

buffer DB 6 DUP (?) ; буфер для збереження проміжних

; ASCII-рядків

point DB ' * ',0 ; ASCII-шаблон зірочки

tit1 DB 'The DIRWUER wersion 1.0',10,13, 'Romanov Alexander Urievich. KIT-13A NTU"KhPI"',10,13,'Copyright (C) 2005 by Romanov Alexander',0 ; інформація о програмі

tabl DB 'Filename OnR Skr Sys Tom Kat Arh Time

Data Size',0 ; заголовок таблиці

CODESEG

EXTRN GetParams:Proc, GetOneParam:Proc, ParamCount:Proc

із PARAMS.obj

EXTRN StrLength:Proc, StrWrite:Proc

EXTRN NewLine:Proc, WriteSimv:Proc, StrWrite2:Proc

; із STRIO.obj

EXTRN BinToAscHex:Proc, BinToAscDec:Proc

; із BINASC.obj

Start:

mov ax, @data ; встановлює в ax адресу сегмента даних

mov es, ax ; встановлює в es адресу сегмента даних

; ------Отримання даних із командного рядка

call GetParams ; отримати параметри із командного рядка

; (ds=PSP)

call NewLine ; перехід на новий рядок

; ------Виведення інформації о програмі

mov di,offset tit1 ; адреса рядка з інформацією о програмі

call StrWrite ; вивід інформації о програмі на консоль

call NewLine ; перехід на новий рядок

; ------Вибір маски

call ParamCount ; отримання в cx число параметрів

mov di, offset defaultSpec ; встановити di вказівником на

; стандартний шаблон маски

or cx, cx ; перевірка cx на наявність 0

jz @@10 ; якщо cx=0, перехід

xor cx, cx ; обнуління cx (номер параметру)

call GetOneParam ; отримати адресу параметра

; ------Виклик підпрограми обробника

@@10:

mov bx, offset Action ; поміщення в bx адреси процедури A

скачать бесплатно РОЗРОБКА ЗАДАЧІ НА МОВІ АСЕМБЛЕР

Содержание дипломной работы

Пройдено великий етап від мов структурного програмування (таких як С) до систем багатомовного програмування, на роль яких претендують такі бренди як С, Java, та ін
В AH поміщується номер функції; регістрова пара вказує на рядок, що задає маску імені файлу; в СХ міститься атрибут файлу
Серед них: процедури вводу/виводу даних на консоль, обробки ASCII рядків, а також перетворення числових даних у ASCII формат для подальшого їх виведення на екран
asm, є зручними і простими інструментами виводу інформації на стандартний пристрій виводу і будуть використані в основній програмі
Основну роботу виконує функція DirEngine, в яку, за допомогою регістру bx, передається зміщення функції Action (для подальшого виклику її за зміщенням)
Після цього DirEngine повертає старий DTA і передає курування основній програмі, яка завершує роботу і повертає код виходу
exe повністю відповідає поставленому завданню про створення програми мовою асемблера, яка виводить вміст директорії, атрибути, розмір і час/дату створення файлів і папок, які в ній містяться
Attrib and (1 shl i)) <>0 then write(' * ') {вивід зірочок навпроти файлів } else write(' '); {із відповідними атрибутами} {------Вивід часу створення файлу} Write(' ',((DTAAddress^
SYS * * * 22:22:0 5 /5 /1999 364B6 MSDOS
Інші приклади демонструють різноманітні засоби задання масок файлів із використанням символів "*" і "?", а також задання шляху до директорії, вміст якої необхідно вивести
Версия 1

заработать

Закачай файл и получай деньги