Страница 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
И как поправить?