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 максимальна глибина пошуку
repnz scasb ; шукати al, доки [di] або cx не стане 0
not cx ; логічне заперечення cx
dec cx ; зменшення cx на 1 - довжина рядка
pop di ; відновлення регістрів
ENDP StrLength
; StrWrite вивід рядка на стандартний пристрій виводу
; StrWrite2 вивід заданої кількості символів рядка на консоль
; 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 ; із стеку
ret ; повернення до визиваючої програми
ENDP StrWrite2
ENDP StrWrite
; NewLine перейти на новий рядок на стандартному пристрої виводу
; Вхід не має
; Вихід на пристрій виводу посилаються символи повернення
; каретки і прогону рядка
; Регістри не має
PROC NewLine
push ax ; збереження регістрів у стек
mov ah, 2 ; в ah номер функції виводу символу у DOS
mov dl, ASCcr ; в dl символ повернення каретки
int 21h ; вивести символ повернення каретки
mov dl, ASClf ; в dl символ прогону рядку
int 21h ; вивести символ прогону рядку
pop dx ; відновлення регістрів із стеку
ENDP NewLine
; WriteSimv вивід на стандартний пристрій виводу заданий символ
; визначену кількість разів
; Вхід dl код символу
; cx кількість виводів символу
; Вихід на пристрій виводу задану кількість разів посилається
; переданий символ
;Регістри не має
PROC WriteSimv
push ax ; збереження регістрів
@@01:
mov ah,02 ; в ah номер функції DOS запису символу
int 21h ; вивести заданий символ
loop @@01 ; повторювати доки cx?0
pop cx ; відновлення регістрів
ENDP WriteSimv
Функції, надані програмним модулем STRIO.asm, є зручними і простими інструментами виводу інформації на стандартний пристрій виводу і будуть використані в основній програмі.
3.1.3. Модуль BINASC.asm
Мови високого рівня надають програмісту можливість безпосередньо зчитувати і виводити числові значення. Нажаль, мова асемблера таких інструментів не має. В основній програмі значна частина роботи пов'язана з виводом із деякого буфера даних на екран . Однак дані в буфері зберігаються у вигляді двійкових слів того чи іншого типу. З'являється необхідність перетворення двійкових даних у ASCII-рядки, щоб у подальшому їх можна було вивести на екран. Дану проблему і покликані вирішити функції модуля BINASC.asm. Модуль складається із чотирьох функцій: допоміжних функцій HexDigit (перетворення чотирьохбітового значення у ASCII-цифру) і NumToAscii (перетворення беззнакового двійкового числа у ASCII-рядок), а також двох функцій BinToAscHex і BinToAscDec, які встановлюють систему числення і викликають вищезгадані функції.
Страницы: 1, 2, 3, 4, 5, 6, 7