Рефераты. Вивід вмісту каталогу y середовищі MS DOS

cld ; збільшення на 1 si і di

rep movsb ; копіювання cx байтів із ds:si в es:di

; ------Перетворення пробілів в 0 і встановлення numParams

@@30:

push es

pop ds ; ds = es

pop cx ; відновлення cx (довжину)

xor bx, bx ; обнуління bx, лічильник параметрів

jcxz @@60 ; пропуск циклу якщо cx=0 (довжина)

mov si, offset params ; поміщення адреси параметрів в si

@@40:

call Separators ; перевірка на пробіли, табуляцію,

; повернення каретки

jne @@50 ; перехід, якщо не знайдено роздільник

mov [byte ptr si], 0 ; заміна роздільника на 0

inc bx ; збільшення лічильника кількості

; параметрів

@@50:

inc si ; переміщення указника на наступний

; символ

loop @@40 ; виконувати в циклі, доки cx ? 0

@@60:

mov [numParams], bx ; збереження в numParams кількість

; параметрів

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

pop bx

pop dx

pop si

pop di

ret ; повернення до батьківської програми

ENDP GetParams

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

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

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

; Вхід cx номер параметра (має бути менше значення в numParams)

; Вихід di зміщення ASCII рядка із потрібним параметром

; Регістри di

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

PROC GetOneParam

push ax ; збереження регістрів ax і cx

push cx

xor al, al ; обнуління al (ініціалізація шуканого

; значення 0)

mov di, offset params ; адреса параметрів рядка

jcxz @@99 ; якщо номер параметра (cx) дорівнює 0,

; то вихід

cmp cx, [numParams] ; порівняння cx із кількістю параметрів

jae @@99 ; вихід, якщо передано неіснуючого

; параметру

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

@@10:

scasb ; пошук нульового обмежувача

jnz @@10 ; повтор, доки не знайдено 0

loop @@10 ; повтор, доки в cx не буде 0

@@99:

pop cx ; відновлення регістрів cx, ax

pop ax

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

ENDP GetOneParam

END

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

3.1.2. Модуль STRIO.asm

Оскільки важливою частиною основної програми, згідно із завданням, буде вивід текстових рядків на екран, то є необхідність у створенні спеціального програмного модуля, який би містив процедури для обробки і виводу ASCII рядків на екран. Пряме використання функцій DOS в основній програмі є незручним, оскільки є потреба у спрощенні коду для його сприйняття.

З цих міркувань було розроблено програмний модуль STRIO.asm, в якому міститься п'ять спеціальних функцій: StrLength (визначає кількість символів, записаних в ASCII рядку), дві функції виводу ASCII-рядків на екран - StrWrite і StrWrite2, а також функцію NewLine (перехід на новий рядок) та WriteSimv (виводить на екран заданий символ необхідну кількість разів).

Слід зазначити, що даний програмний модуль не містить функцій читання із консолі в рядок, однак основна програма отримує дані із PSP DOS-а і опрацьовує вже створені дані, а тому не потребує якихось додаткових вказівок через консоль від користувача, всі необхідні специфічні дані (наприклад, маска файлів) користувач може задати в командному рядку при визові основної програми.

Код програмного модуля STRIO.ASM приведений нижче:

IDEAL

MODEL small

ASCnull EQU 0 ; ASCII нуль

ASCcr EQU 13 ; ASCII символ повернення каретки

ASClf EQU 10 ; ASCII символ вертикальної табуляції

; (прогону рядка)

CODESEG

PUBLIC StrLength, StrWrite, StrWrite2, NewLine, WriteSimv

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

; StrLength підраховує кількість ненульових символів в рядку

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

; Вхід di адреса ASCII рядка

; Вихід cx кількість ненульових символів в рядку

; Регістри cx

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

PROC StrLength

push ax ; зберегти у стеку змінювані

push di ; регістри ax, di

xor al, al ; в al поміщується шуканий символ 0

mov cx, 0ffffh ; в cx максимальна глибина пошуку

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

repnz scasb ; шукати al, доки [di] або cx не стане 0

not cx ; логічне заперечення cx

dec cx ; зменшення cx на 1 - довжина рядка

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

pop ax

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

ENDP StrLength

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

; StrWrite вивід рядка на стандартний пристрій виводу

; StrWrite2 вивід заданої кількості символів рядка на консоль

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

; Вхід di адреса ASCII рядка

; cx кількість записуваних символів (для StrWrite2)

; Вихід символьний рядок виводиться на стандартний пристрій

; виводу

Регістри cx (для StrWrite)

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

PROC StrWrite

call StrLength ; встановити в cx довжину рядка

PROC StrWrite2 ; друга змінна точка входу

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

push bx

push dx

mov bx, 1 ; задання стандартного пристрою виводу

mov dx, di ; адресація ASCII рядка в ds:dx

mov ah, 40h ; в ax номер функції, що виконує запис

; в файл або на пристрій виводу

int 21h ; виклик 21 переривання DOS

pop dx ; відновлення збережених регістрів

pop bx ; із стеку

pop ax

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

ENDP StrWrite2

ENDP StrWrite

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

; NewLine перейти на новий рядок на стандартному пристрої виводу

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

; Вхід не має

; Вихід на пристрій виводу посилаються символи повернення

; каретки і прогону рядка

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

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

PROC NewLine

push ax ; збереження регістрів у стек

push dx

mov ah, 2 ; в ah номер функції виводу символу у DOS

mov dl, ASCcr ; в dl символ повернення каретки

int 21h ; вивести символ повернення каретки

mov dl, ASClf ; в dl символ прогону рядку

int 21h ; вивести символ прогону рядку

pop dx ; відновлення регістрів із стеку

pop ax

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

ENDP NewLine

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

; WriteSimv вивід на стандартний пристрій виводу заданий символ

; визначену кількість разів

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

; Вхід dl код символу

; cx кількість виводів символу

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

; переданий символ

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

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

PROC WriteSimv

push ax ; збереження регістрів

push cx

@@01:

mov ah,02 ; в ah номер функції DOS запису символу

int 21h ; вивести заданий символ

loop @@01 ; повторювати доки cx?0

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

pop ax

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

ENDP WriteSimv

END

Функції, надані програмним модулем STRIO.asm, є зручними і простими інструментами виводу інформації на стандартний пристрій виводу і будуть використані в основній програмі.

3.1.3. Модуль BINASC.asm

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

Страницы: 1, 2, 3, 4, 5, 6, 7



2012 © Все права защищены
При использовании материалов активная ссылка на источник обязательна.