Моя первая задача на ассемблере и то не могу понять почему не работает первое правило(процедура))))Пожалуйста помогите с первой процедурой =)
остальное работает)))
Эсли свойство выполняется , то по первому правилу, если нет то по второму(В тексте всё есть)
yes6 - куда должен направиться вывод первой процедуры после проверки на первое правило
Свойство: Текст начинается цифрой и оканчивается цифрой, причем эти цифры различны.(работает)(первая процедура идёт на выход в no)(вторая в yes6)
Правило 1: Заменить каждую строчную латинскую букву на соответствующую заглавную букву.
Правило 2: Удалить из текста все повторные вхождения его первой литеры.(работает)
;;===========================================================
;;
;;
;;
;;===========================================================
include io.asm
s segment stack
dw 32 dup (?)
dw 64 dup (?)
s ends
data segment
N db 'A'-'a'
x db 100 dup (?), '$'
y db 101 dup (?)
prav1 db "Po pervomu pravilu.$"
prav2 db "Po vtoromu pravilu.$"
Many_chars db "mnogo simvolov!$"
Empty_string db "simvolov net!$"
data ends
code segment
assume cs:code,ds:data,ss:s
;;==================================================================================
;;Правило 1: Заменить каждую строчную латинскую букву на соответствующую заглавную букву.
;;==================================================================================
priv1 proc near
push bp
mov bp,sp
push di
push ax
push si
push cx
push dx
mov cx,[bp+4]
mov di,[bp+6]
mov si,[bp+8]
go: mov al,y[si]
cmp al,'a' ; проверка на mLat символ
jae zap1
jmp outing
zap1: cmp al,'z'
jbe zap2
jmp outing
zap2: add al, N;заменяю на заглавнуюв al
outing:
mov y[si],al
pop dx
pop cx
pop si
pop ax
pop di
pop bp
ret 6
endp priv1
;;=================================================================
;;Правило 2: Удалить из текста все повторные вхождения его первой литеры.
;;=================================================================
priv2 proc near
push bp
mov bp,sp
push di
push ax
push si
push cx
push dx
mov cx,[bp+4]
mov di,[bp+6]
mov si,[bp+8]
mov bl,[si]
cmp cx,0 ; если пробел
je Ending100
inc cx ;
inc si
Sikl1: mov al,[si]
cmp al,bl
jne Sikl3
Sikl2: inc si
loop Sikl1
jmp Sikl4
Sikl3: mov [di],al
inc di
jmp Sikl2
Sikl4:
mov cx,[bp+4]
inc cx
mov di,[bp+6]
mov si,[bp+8]
Sikl5: mov ah,[di]
mov [si],ah
inc si
inc di
loop Sikl5
Ending100:
pop dx
pop cx
pop si
pop ax
pop di
pop bp
ret 6
endp priv2
;;=======================
;;Старт программы asmi.exe
;;Error_100-много символов
;;Error_0-нет символов
;;=======================
start: mov ax,data
mov ds,ax
xor di,di; зануляем di
outch '>'
Vvod: cmp di,99
ja error_100
inch cl
cmp cl,'.'
je Vivod
mov x[di],cl
inc di
jmp Vvod
Vivod: mov si,di
cmp di,0
je error_0
mov x[di],'.'
mov x[di+1],'$'
newline
jmp Sifra_proc
error_0: mov dx,offset Empty_string
outstr
jmp Ending
error_100: mov dx,offset Many_chars
outstr
jmp Ending
;;============================================================================
;;Свойство: Текст начинается цифрой и оканчивается цифрой, причем эти цифры различны.
;;============================================================================
Sifra_proc:
;;занулятор
xor di,di
mov ah,x[di]
mov al, x[di]
;; Цифра ли?
cmp al, '0' ;проверка первого числа
jae yes1
jmp no
yes1: cmp al, '9'
jbe yes2
jmp no
yes2: cmp al, '.' ;доходим до последнего символа
je yes3
inc di
mov al,x[di]
jmp yes2
yes3: dec di
mov al, x[di]
cmp al, '0' ; проверка второго числа
jae yes4
jmp no
yes4: cmp al, '9'
jbe yes5
jmp no
yes5: cmp al,ah ; проверка на совпадение
jne yes6
no:
mov dx, offset prav2
outstr
newline
mov ax, offset x
push ax
mov ax, offset y
push ax
push si
call priv2 ;Правило 2
jmp Final
yes6:
mov dx,offset prav1
outstr
newline
mov ax,offset x
push ax
mov ax,offset y
push ax
push si
xor di,di
mlit: mov al, x[di]
cmp al, '.'
je Final
mov [si],al
call priv1
mov al,[si]
mov x[di], al
inc di
jmp mlit
;;============================================================================
Final:
mov dx,offset x
outstr
Ending:
finish
code ends
Исправить нужно только первую процедуру и её выход(yes6)