Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.06.2009, 14:51   #1
Zeneth
Пользователь
 
Регистрация: 16.06.2009
Сообщений: 21
По умолчанию Очередной запрос помощи. Процедуры...

Разработать две подпрограммы, одна из которых преобразует любую заданную букву в заглавную (в том числе для русских букв), а другая - преобразует букву в строчную. Разработать программу, которая вводит с клавиатуры строку и заменяет первые буквы всех слов на заглавные, а остальные буквы - на строчные.

Помогите пожалуйста организацией процедур..
Со строками я относительно разбрался, только незнаю, как осуществить преобразование Верхнего и нижнего регистров буквы.

Заранее спасибо
Zeneth вне форума Ответить с цитированием
Старый 17.06.2009, 19:03   #2
MalCer
Форумчанин
 
Аватар для MalCer
 
Регистрация: 15.07.2008
Сообщений: 615
По умолчанию

Был у меня пример, только для Делфи\паскаля. Вот пример:
Код:
             function UpperCase(S: String): String; assembler;
             asm
               push        ds
               cld
               lds         si,Str
               les         di@Result
               lodsb
               stosb
               xor         ah,ah
               xchg        ax,cx
               jcxz        @3
             @1:
               lodsb
               cmp         al,'a'
               ja          @2
               cmp         al,'z'
               jb          @2
               sub         al,20H
             @2:
               stosb
               loop       @1
             @3:
               pop        ds
             end;
Теперь можем рассмотреть на конкретном примере. Я продебажил крекми CrueHead'а, там как раз есть перевод введенных символов в верхний регистр:
Код:
.....
00401383  |> /8A06          /MOV AL,BYTE PTR DS:[ESI]    ; В al из esi кладем мое имя(и сверяем каждую букву)
00401385  |. |84C0          |TEST AL,AL                  ; Если все заглавный, то выход, если нет, то продолжим, короче-проверка!
00401387  |. |74 13         |JE SHORT CRACKME.0040139C
00401389  |. |3C 41         |CMP AL,41                   ; Я думаю ты сообразишь, что эта за буква :)
0040138B  |. |72 1F         |JB SHORT CRACKME.004013AC
0040138D  |. |3C 5A         |CMP AL,5A   ; и эта
0040138F  |. |73 03         |JNB SHORT CRACKME.00401394
00401391  |. |46            |INC ESI    
00401392  |.^ EB EF         |JMP SHORT CRACKME.00401383
00401394  |> |E8 39000000   |CALL CRACKME.004013D2
00401399  |. |46            |INC ESI    ; следующий символ
0040139A  |.^\EB E7         \JMP SHORT CRACKME.00401383
....

004013D2  /$  2C 20         SUB AL,20       ; А это сам перевод
004013D4  |.  8806          MOV BYTE PTR DS:[ESI],AL
004013D6  \.  C3            RETN
Здесь вроде все понятно, если что нет то отпишись
xor eax, eax
xchg [eax], eax
MalCer вне форума Ответить с цитированием
Старый 17.06.2009, 20:02   #3
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Вот кусочек из одной моей программы. Переводит текст, по аддресу в bx в маленькие буквы и закидывает его в [di]. Работает как с латинскими буквами, так и с кирилицей. Ес-но это только для дос кодировки.
Код:
NEXT_CHAR:

	mov al,[bx]				; берем символ из имени
	test al,al				; это еще не конец?
	jnz l2					
	mov byte ptr [di],'$'	; если конец, то закидываем последним символом $ для того, чтобы можно было его вывести
	jmp END_STR				
	
l2:

	cmp al,'A'		; если файлы, то проверяем, чтобы символ был большой буквой
	jb l3
	cmp al,'Z'
	ja l3
	add al,20h		; если это так,то переводим в строчную букву
l3:
	cmp al,080h
	jb l4
	cmp al,08fh
	ja l4
	add al,20h
l4:
	cmp al,90h
	jb l5
	cmp al,9fh
	ja l5
	add al,50h
l5:
	mov	[di],al		; сохраняем символ в буфере
	inc di			; увеличиваем счетчики
	inc bx

    jmp SHORT NEXT_CHAR  ;cлeдующий cимвoл
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4

Последний раз редактировалось Goodwin98; 17.06.2009 в 20:14.
Goodwin98 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Последние прошение о помощи(Процедуры) kempers Помощь студентам 1 12.12.2008 02:48
Procedure,function,Stringgrid (#004) Очередной вопрос начинающего. Albert2008 Компоненты Delphi 4 01.08.2008 21:30
Задачки или очередной бред? Stilet Свободное общение 8 23.07.2008 19:24
Видимо очередной вопрос по БД... Amaranth Помощь студентам 1 16.12.2007 00:56
Завершился очередной конкурс по созданию игр mutabor Свободное общение 1 29.09.2007 08:48