Страница 1 из 1
Изменение регистров букв
Добавлено: 07 май 2009, 02:25
GRIPH
В общем, задание такое: Поменять маленькие(или большие) русские буквы, в большие(или маленькие). Строка вводится с клавиатуры.
з.ы. Лучше маленькие в большие, хотя там особой разницы нету.
з.з.ы. Дело в том что в русском алфавите между а..п и р..я есть разрыв в 48 позиций, и этот разрыв нужно учесть. В общем вот что смог:
Код: Выделить всё
code segment
assume cs: code, ds:data, ss: stek
prog PROC near
cmp al,'А'
jb ext
cmp al,'П'
ja ext
cmp al,'Р'
jb ext
cmp al,'Я'
ja ext
sub al,'А'
add al,'а'
ext:
ret
prog ENDP
Bust PROC near
mov di,si
conv:
lodsb
cmp al,0h
je eend
call prog
stosb
jmp conv
eend:
ret
Bust ENDp
start:
mov AX, data
mov DS, AX
lea dx,[strr]
mov ax,0h
mov ah,0Ah
int 21h
mov si,dx
mov dx, offset strr
mov ah,9h
int 21h
mov ax,4c00h
int 21h
code ends
data Segment
sstop db '$'
newline db 10
strr db 'check'
data ends
stek segment stack
dw 10 dup (?)
stek ends
end Start
Совсем забыл сказать... Процессор 8086, использую TASM и TLINK. Другое пока нам запрещено

Re: Изменение регистров букв
Добавлено: 07 май 2009, 10:32
BBB
Если я еще помню ассемблер, то функция никогда ничего не будет делать.
Рассмотрим пошагово:
1. cmp al,'А'
jb ext
Переходим на ext, если в al символ с кодом, меньшим 'A'
2. cmp al,'П'
ja ext
Переходим на ext, если в al символ с кодом, бОльшим 'П'.
Т.е. продолжаем идти, если в al символы между 'A' и 'П' (включительно).
Поэтому на следующем шаге: ....
3. cmp al,'Р'
jb ext
Мы ВСЕГДА перейдем на ext, т.к. коды всех символов ['A' .. 'П'] меньше 'Р'.
Таким образом, при ЛЮБОМ al мы никогда не дойдем до операторов:
sub al,'А'
add al,'а'
Re: Изменение регистров букв
Добавлено: 07 май 2009, 15:19
somewhere
Рациональнее с точки зрения быстродействия, проще в написании кода и надежнее в работе - использовать измененную символьную таблицу. Минус только один - хавает лишних 256 байт

Re: Изменение регистров букв
Добавлено: 07 май 2009, 22:10
GRIPH
Хм.. И как мне делать? А компиляторов с делфи в асм нету?

) в делфи написать 10 минут)
Я хз как тут дальше сделать... Можете обход разрыва подсказать?
Re: Изменение регистров букв
Добавлено: 07 май 2009, 22:50
airyashov
Можно дизасемблером проити код делфи, но если Вы сами такое задание не можите написать, то там разобраться будет еще сложнее.
Совет таков пишите по частям и проверяте сначала для 1 диапазона, потом добавьте второй и т.д.
Re: Изменение регистров букв
Добавлено: 09 май 2009, 12:48
Vaper
Да зачем дизасемблировать. Это самое последнее дело. Можно слегка изменить вашу процедуру проверки букв.
Код: Выделить всё
prog PROC near
cmp al,'А'
jb ext
cmp al,'Я' ;проверка по внешнему кольцу
;(без учёта разрыва в символах)
ja ext
cmp al,'П' ;проверка по внутреннему кольцу
ja nxt
cmp al,'Р'
ja ext
nxt:
sub al,'А'
add al,'а'
ext:
ret
Теперь то же самое надо сделать для строчных
Re: Изменение регистров букв
Добавлено: 14 май 2009, 11:27
GRIPH
Вот я как сделал. Только до ума довести все равно не могу.. Дело ещё в том что в маленьких буквах разрыв, а в больших его нету...
Код: Выделить всё
code segment
assume cs: code, ds:data, ss: stek
prog PROC near
cmp al,'а'
jb ext
cmp al,'я' ;проверка по внешнему кольцу
;(без учёта разрыва в символах)
ja ext
cmp al,'р' ;проверка по внутреннему кольцу
ja nxt2
cmp al,'п'
jb nxt
ret
nxt:
sub al,'а'
add al,'А'
nxt2:
sub al,'р'
add al,'Р'
ext:
ret
prog ENDP
Bust PROC near
mov ax,ds
mov es,ax
lea di,[nstrr]
add di,2
conv:
lodsb
cmp al,24h
je eend
call prog
stosb
jmp conv
eend:
ret
Bust ENDp
start:
mov AX, data
mov DS, AX
lea dx,strr
mov si,dx
add si,2
call Bust
lea dx,[nstrr]
mov ah,9h
int 21h
mov ax,4c00h
int 21h
code ends
data Segment
strr db 15,9,'проверка','$'
nstrr db 15,9,9 dup(0),'$'
newline db 10
freeze db 20 dup (0)
data ends
stek segment stack
dw 10 dup (?)
stek ends
end Start
Re: Изменение регистров букв
Добавлено: 15 май 2009, 11:35
BBB
Походу, при "проверке по внутреннему кольцу" надо использовть нестрогое равенство, а так 'п' и 'р' не преобразуются. Краевой эффект-с у Вас ))
Код: Выделить всё
cmp al,'р' ;проверка по внутреннему кольцу
jae nxt2
cmp al,'п'
jbe nxt
......
Re: Изменение регистров букв
Добавлено: 16 май 2009, 21:58
GRIPH
И как поправить?