
Код программы
В данном разделе приводится код реализованной программы, а так же скриншоты иллюстрирующие её работу.
ПОЛНЫЙ КОД ПРОГРАММЫ:
include io.asm
stk segment stack
db 128 dup (?)
stk ends
D segment
x db ?
y db ?
count dw ?
tmp dw ?
range equ 100
limit equ 101
S db "Please enter your text$"
S1 db "Do you want to use program again? 1 - YES;0- NO$"
Er db "Error! Too many values!!!$"
End_prog db "Program was finished press any key...$"
udovl db "This text satisfies our rule$"
neudovl db "This text doesn't satisfies our rule$"
rule1 db "We used first rule$"
rule2 db "We used second rule$"
M db range,'?',range dup(' ')
D ends
C segment
assume cs:C, ss:stk,ds:D
;--------------------------------------------------
;Данный макрос создан с целью упрощения процесса написания команд ;для вывода массива.
;Т.к. эта операция несколько раз встречается в теле программы, и кроме ;того не редко требовалась для отладки.
show_mas macro M
local L
mov si,2
mov ch,00h
mov cl,M[1]
newline
L:
outch M[si]
inc si
Loop L
newline
endm
;--------------------------------------------------
;Данный макрос создан с целью упрощения процесса написания команд ;для вывода строки.
;Т.к. эта операция несколько раз встречается в теле программы, и кроме ;того не редко требовалась для отладки.
show_str macro S
newline
lea dx,S
outstr
newline
endm
;--------------------------------------------------
begin:
;Помещаю сегмент данных в регистр ds
mov ax,D
push ax
pop ds
;------------------------------------------
metka:
show_str S
lea dx,M ;Load string from user
mov ah,0Ah
int 21h
;show_mas M
mov ah,00h
mov al,M[1]
mov count,ax
dec count ;Т.к. последний символ у нас точка!
; newline
; outint count
; newline
;-----------------------------------------------------
;Проверяю удовлетворяет ли текст заданному свойтсву
mov ah,M[2]
mov ch,0h
mov cl,M[1]
mov si,cx
mov al,M[si]
cmp al,ah
je no_satisfy
mov x,ah
mov y,al
mov bh,x
call is_number
cmp bl,'0'
je no_satisfy
mov bh, y
call is_number
cmp bl,'0'
je no_satisfy
show_str udovl
;-----------------------------------------------------
;Тут обрабатываем текст по правилу 1
show_str rule1
call smal_to_big_letter
show_mas M
jmp eend
;-----------------------------------------------------
;Ниже обрабатывается случай когда текст НЕ удовлетворяет заданному ;свойству
no_satisfy:
show_str neudovl
;Тут обрабатываем текст по правилу 2
show_str rule2
call turn
show_mas M
; ;-----------------------------------------------------
;Корректное завершение программы
eend:
show_str S1
inch x
cmp x,'0'
je enough
jmp metka
enough:
show_str End_prog
inch x
finish
;-----------------------------------------------------
;Данная процедура проверяет является ли данный символ цифрой.
;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
; ;-----------------------------------------------------
; ;-----------------------------------------------------
;Данная процедура проверяет является ли передаваемый символ ;маленькой английской буквой.
;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
; ;-----------------------------------------------------
; ;-----------------------------------------------------
;Данная процедура реализует преобразование указанное в задании ;(Правило 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
; ;-----------------------------------------------------
; ;-----------------------------------------------------
;Данная процедура реализует преобразование указанное в задании ;(Правило 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
;-----------------------------------------------------
C ends
end begin