Требования к программе
1. Вывод исходного текста должен быть выполнен сразу после его записи в память - до его анализа и преобразования. 2. Вывод преобразованного текста должен быть выполнен только после его окончательного формирования. 3. Алгоритмы преобразования текста по правилам 1 и 2 должны быть оформлены в виде процедур. 4. В программе использовать операции ввода-вывода INCH, OUTCH, OUTSTR и операцию останова FINISH, описанные в [1].
Реализация
В данном разделе будут приведены описания реализованных функций и макросов, будет изложена основная логика выбранных алгоритмов и код самой программы.
Функции и макросы использованные в программе
В реализованной программе были написаны следующие макросы:
show_mas
show_str
В реализованной программе были написаны следующие процедуры:
is_number
is_letter
smal_to_big_letter
turn
Процедуры 3) и 4) являются обязательными по условию задачи, остальные написаны исходя из алгоритмических соображений.
Далее приведены подробные описания вышеизложенных процедур и макросов:
show_mas
Данный макрос создан с целью упрощения процесса написания команд для вывода массива. Т.к. эта операция несколько раз встречается в теле программы, и кроме того не редко требовалась для отладки.
show_mas macro M
local L
mov si,2; В силу специфики функции 0Аh прерывания 21h фактические ;элементы начинают заполнять буфер (массив) с индекса 2.
mov ch,00h
mov cl,M[1]
newline
L:
outch M[si]
inc si
Loop L
newline
endm
show_str
Данный макрос создан с целью упрощения процесса написания команд для вывода строки. Т.к. эта операция несколько раз встречается в теле программы, и кроме того не редко требовалась для отладки.
show_str macro S
newline
lea dx,S
outstr
newline
endm
is_number
Данная процедура проверяет является ли данный символ цифрой.
;bh-передаваемый параметр bl - результат '1'/'0', '1' – символ ;помещенный в регистр bh является цифрой, '0' – в противном случае
is_number proc
cmp bh,'9'
jbe L3
jmp fin
L3:
cmp bh,'0'
jae L4
jmp fin
L4:
mov bl,'1'
ret
fin:
mov bl,'0'
ret
is_number endp
is_letter
Данная процедура проверяет является ли передаваемый символ маленькой английской буквой.
;bh-передаваемый параметр bl - результат '1'/'0', '1' – символ ;помещенный в регистр bh является маленькой английской буквой, '0' – ;в противном случае
is_letter proc
cmp bh,'z'
jbe L5
jmp fin1
L5:
cmp bh,'a'
jae L6
jmp fin1
L6:
mov bl,'1'
ret
fin1:
mov bl,'0'
ret
is_letter endp
smal_to_big_letter
Данная процедура реализует преобразование указанное в задании (Правило 1)
Т.к. разность между ascii кодами букв отличающихся лишь уровнем регистра одна и та же, то преобразование осуществляется посредством прибавления соответствующей дельты.
smal_to_big_letter proc
mov si,2
mov ch,0h
mov cl,M[1]
L7:
cmp M[si],'.'
jne bypass
jmp q2
bypass:
mov bh,M[si]
call is_letter
cmp bl,'0'
je q1
mov ah,M[si]
mov al,32
sub ah,al
mov M[si],ah
q1:
add si,1
loop L7
q2:
ret
smal_to_big_letter endp
turn
Данная процедура реализует преобразование указанное в задании (Правило 2). Преобразование массива осуществляется путем применения двух указателей на начало и конец соответственно, и их последующего сближения при последовательном обмене элементов на которые они указывают.
turn proc
.186
pusha
mov si,2
add count,2
mov cx,count
L8:
cmp cx,si
jle konec
mov al,M[si]
push si
mov si,cx
mov ah,M[si]
xchg ah,al
pop si
mov M[si],al
push si
mov si,cx
mov M[si],ah
pop si
inc si
loop L8
;-----------
konec:
popa
ret
turn endp
