Изменение регистров букв

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

Ответить
GRIPH
Сообщения: 9
Зарегистрирован: 10 апр 2009, 17:42

В общем, задание такое: Поменять маленькие(или большие) русские буквы, в большие(или маленькие). Строка вводится с клавиатуры.
з.ы. Лучше маленькие в большие, хотя там особой разницы нету.
з.з.ы. Дело в том что в русском алфавите между а..п и р..я есть разрыв в 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. Другое пока нам запрещено :(
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Если я еще помню ассемблер, то функция никогда ничего не будет делать.
Рассмотрим пошагово:

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,'а'
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Рациональнее с точки зрения быстродействия, проще в написании кода и надежнее в работе - использовать измененную символьную таблицу. Минус только один - хавает лишних 256 байт :)
It's a long way to the top if you wanna rock'n'roll
GRIPH
Сообщения: 9
Зарегистрирован: 10 апр 2009, 17:42

Хм.. И как мне делать? А компиляторов с делфи в асм нету? :) ) в делфи написать 10 минут)

Я хз как тут дальше сделать... Можете обход разрыва подсказать?
airyashov
Сообщения: 441
Зарегистрирован: 02 ноя 2007, 10:31

Можно дизасемблером проити код делфи, но если Вы сами такое задание не можите написать, то там разобраться будет еще сложнее.
Совет таков пишите по частям и проверяте сначала для 1 диапазона, потом добавьте второй и т.д.
Vaper
Сообщения: 3
Зарегистрирован: 06 май 2009, 19:45

Да зачем дизасемблировать. Это самое последнее дело. Можно слегка изменить вашу процедуру проверки букв.

Код: Выделить всё

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
Теперь то же самое надо сделать для строчных
GRIPH
Сообщения: 9
Зарегистрирован: 10 апр 2009, 17:42

Вот я как сделал. Только до ума довести все равно не могу.. Дело ещё в том что в маленьких буквах разрыв, а в больших его нету...

Код: Выделить всё

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 
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Походу, при "проверке по внутреннему кольцу" надо использовть нестрогое равенство, а так 'п' и 'р' не преобразуются. Краевой эффект-с у Вас ))

Код: Выделить всё

cmp al,'р' ;проверка по внутреннему кольцу
jae nxt2
cmp al,'п'
jbe nxt
......
GRIPH
Сообщения: 9
Зарегистрирован: 10 апр 2009, 17:42

И как поправить?
Ответить