Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Отчет Попова М.С. по курсу Архитектура ЭВМ ВМК...docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
88.21 Кб
Скачать
    1. Код программы

В данном разделе приводится код реализованной программы, а так же скриншоты иллюстрирующие её работу.

ПОЛНЫЙ КОД ПРОГРАММЫ:

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