Люди! Я не могу решить такую задачу.
Дан текст(непустая последовательность литер содержащий не более 100 элементов, с точкой в качестве признака конца текста.
Требуется написать программу на языке Ассемблера. Программа вводит с клавиатуры текст и записывает его в память ЭВМ. Программа определяет, обладает ли текст заданным свойством: Текст начинается латинской буквой и окончивается латинской буквой. Проверку оформить как процедуру COND с парамерами: BX - адрес начала массива с текстом , CX — количество литер в тексте. Результат процедуры: 1 —если условие выполнено и 2 --- если не выполнено, поместить в AX. Если текст обладет заданным свойством, то преобразоватьт текст следующим образом: Заменить каждую заглавную латинскую букву на следующую по алфавиту букву( A на B, B на C, C на D ......Z заменять на A). Преобразование оформить как процедуру RULE1 с параметрами: BX —адрет начала массива с текстом , CX — количество литер в тексте. Иначе преобразовть текст следующим образом : Удвоить каждую литеру
текста. Преобрзование оформить как процедуру RULE2 с параметрами: BX -адрес начала массива с текстом, CX — количество литер в тексте. После преобразования вывести на экран дисплея преобразонный текст, а также номер примененого правила.
Пытался решить вот, так, но что-то не получается,пожалуйста помогите:
INCLude io.asm
stack segment stack
dw 128 dup (?)
stack ENDS
data segment
X db 200 dup (?)
Y dw 255 dup (0)
n dw 0
n1 db 0
n2 db 0
n3 db 0
temp dw ?
data ENDS
code segment
assume ss:stack, DS:data, cs:code
Vitaminru
Люди! Я не могу решить такую задачу.Дан текст(непустая последовательность литер содержащий не более 100 элементов, с точкой в качестве признака конца текста.
Требуется написать программу на языке Ассемблера. Программа вводит с клавиатуры текст и записывает его в память ЭВМ. Программа определяет, обладает ли текст заданным свойством: Текст начинается латинской буквой и окончивается латинской буквой. Проверку оформить как процедуру COND с парамерами: BX - адрес начала массива с текстом , CX — количество литер в тексте. Результат процедуры: 1 —если условие выполнено и 2 --- если не выполнено, поместить в AX. Если текст обладет заданным свойством, то преобразоватьт текст следующим образом: Заменить каждую заглавную латинскую букву на следующую по алфавиту букву( A на B, B на C, C на D ......Z заменять на A). Преобразование оформить как процедуру RULE1 с параметрами: BX —адрет начала массива с текстом , CX — количество литер в тексте. Иначе преобразовть текст следующим образом : Удвоить каждую литеру
текста. Преобрзование оформить как процедуру RULE2 с параметрами: BX -адрес начала массива с текстом, CX — количество литер в тексте. После преобразования вывести на экран дисплея преобразонный текст, а также номер примененого правила.
Пытался решить вот, так, но что-то не получается,пожалуйста помогите:
INCLude io.asm
stack segment stack
dw 128 dup (?)
stack ENDS
data segment
X db 200 dup (?)
Y dw 255 dup (0)
n dw 0
n1 db 0
n2 db 0
n3 db 0
temp dw ?
data ENDS
code segment
assume ss:stack, DS:data, cs:code
cond PROC
PUSH BX
PUSH DX
MOV CX, 0
mov n3, 0
mov temp, bx
outint cx
newline
condL : INCH DL
CMP DL, '.'
JE condd
MOV BYTE PTR [BX], DL
inc bx
inc cx
jmp condl ;input
condd :
push bx
mov bx, temp
mov dl, byte ptr [bx]
mov n1, 'A'
mov n2, 'a'
condl1 :
cmp dl, n1
je condl2
inc n1
cmp n1, 'Z'
jna condl1
condl3 :
cmp dl, n2
je condl2
inc n2
cmp n2, 'z'
jna condl3
jmp condl4
condl2 :
newline
inc n3
condl4 : pop bx
mov byte ptr dl, [bx-1]
newline
mov n1, 'A'
mov n2, 'a'
condl5 :
cmp dl, n1
je condl6
inc n1
cmp n1, 'Z'
jna condl5
condl7 :
cmp dl, n2
je condl6
inc n2
cmp n2, 'z'
jna condl7
jmp condl8
condl6 :
inc n3
condl8 :
cmp n3, 2
jne condl9
mov ax, 1
jmp condfin
condl9 : mov ax, 2
condfin : mov dl, n3
mov dh, 0
POP DX
POP BX
RET
cond ENDP
ruLe1 proc
push AX
push BX
push CX
push DX
ruLe1L : cmp byte ptr [BX], 'Z'
ja ruLe1L1
cmp byte ptr [BX], 'A'
jb ruLe1L1
cmp byte ptr [BX], 'Z'
je ruLe1L2
add byte ptr [BX], 1
ruLe1L1 : inc BX;
loop ruLe1L
jmp ruLe1fin
ruLe1L2 : mov byte ptr [BX], 'A'
jmp ruLe1L1
ruLe1fin :
pop DX
pop CX
pop BX
pop AX
ret
ruLe1 endp
ruLe2 PROC
PUSH DI
PUSH SI
PUSH AX
PUSH DX
PUSH BX
PUSH CX
outch '7'
newline
push cx
push bx
mov ax, cx
add ax, ax
dec ax
mov si, cx
rule2L1: mov dl, byte ptr[bx]
mov byte ptr[bx+si], dl
inc bx
loop rule2L1
pop bx
pop cx
mov si, 0
mov di, cx
;12345678
rule2l2: mov dl, byte ptr[bx+di]
mov byte ptr[bx+si], dl
mov byte ptr[bx+si+1], dl
add si, 2
inc di
outch dl
newline
loop rule2L2
POP CX
add cx, cx
outint cx
newline
POP BX
POP DX
POP AX
POP SI
POP DI
RET
ruLe2 ENDP
start:
mov AX,data
mov DS,AX
lea BX, x
newline
call cond
outch '='
outint ax
newline
cmp AX, 1
je torule1
call ruLe2
jmp L1
torule1 :
call ruLe1
L1 : newline
outint cx
newline
L2 : mov dl, byte ptr [BX]
outch dl
inc BX
loop L2
newline
OUTInt aX
newline
finish
code ends
end start