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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.06.2013, 10:53   #1
NewLamer&Programer
Форумчанин
 
Регистрация: 23.11.2012
Сообщений: 428
По умолчанию Asm аналог strcmp

помогите написать аналог strcmp (Си) на ассемблере, нужно для курсовой обязательно сделать ассемблерную вставку, это единственное место где я придумал ее присобачить, предположительно будет что то типа:

Код:
bool _strcmp(char str1, char str2)
{
	__asm
	{
	}
}
готовых аналогов не предлагать, хочу сам написать, просто не знаю с чего начать, предположительно думаю надо в цикле перебирать каждый символ первой и второй строки сравнивая их, как во первых сравнить два символа в ассемблере? во вторых может стоит указатель сделать на строки? а то в оригинале вообще const char * зачем то...
NewLamer&Programer вне форума Ответить с цитированием
Старый 17.06.2013, 11:10   #2
NewLamer&Programer
Форумчанин
 
Регистрация: 23.11.2012
Сообщений: 428
По умолчанию

сейчас извратился вот так, только не знаю как правильно вернуть значение функции, да и размер операндов не совпадает

Код:
__declspec(naked)
bool _strcmp(char str1, char str2)
{
	__asm
	{
		push eax
		push ebx
		mov eax, str1
		mov ebx, str2
		cmp eax, ebx
		je yes
		no:
		mov _strcmp, false
		jmp exit
		yes:
		mov _strcmp, true
		jmp exit
		exit:
		pop ebx
		pop eax
		ret
	}
}
NewLamer&Programer вне форума Ответить с цитированием
Старый 17.06.2013, 11:14   #3
NewLamer&Programer
Форумчанин
 
Регистрация: 23.11.2012
Сообщений: 428
По умолчанию

потом дошло что я всю строку сравниваю :D ладно буду думать -_- подскажите хоть как посимвольно брать от строки
NewLamer&Programer вне форума Ответить с цитированием
Старый 17.06.2013, 13:17   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

mov ebx, str1
mov al,[ebx]
inc ebx
jmp again

Другая пара регистров для второий строки и сравнивайте.
В вашем примере вы сравнили адреса строк а не их содержимое.
waleri вне форума Ответить с цитированием
Старый 17.06.2013, 17:49   #5
NewLamer&Programer
Форумчанин
 
Регистрация: 23.11.2012
Сообщений: 428
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
mov ebx, str1
mov al,[ebx]
inc ebx
jmp again

Другая пара регистров для второий строки и сравнивайте.
В вашем примере вы сравнили адреса строк а не их содержимое.
можете прокомментировать? не слишком понимаю значение mov al,[ebx], к тому же разве str1 влезет в ebx? да и цикл наверное проще по loop делать
NewLamer&Programer вне форума Ответить с цитированием
Старый 17.06.2013, 23:41   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

mov al,[ebx] читайт из ячейки памяти, чей адрес указан в регистре EBX.
В EBX влезает не строка str1 а ее адрес - чуствуете разницу?
loop может и проще, но надо знать длинну строки заранее.

Для начала напишите свою версию на С - когда все поймете и все заработает будет легче переводить на АСМ.
waleri вне форума Ответить с цитированием
Старый 17.06.2013, 23:58   #7
NewLamer&Programer
Форумчанин
 
Регистрация: 23.11.2012
Сообщений: 428
По умолчанию

что то навроде этого?

Код:
bool _strcmp(char *str1, char *str2)
{
	if (strlen(str1) != strlen(str2)) return false;
	for (size_t i = 0; i < strlen(str1)-1; i++)
	if (str1[i] != str2[i]) return false;
	return true;
}

Последний раз редактировалось NewLamer&Programer; 18.06.2013 в 00:00.
NewLamer&Programer вне форума Ответить с цитированием
Старый 18.06.2013, 00:02   #8
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Цитата:
Сообщение от NewLamer&Programer Посмотреть сообщение
что то навроде этого?

Код:
bool _strcmp(char *str1, char *str2)
{
	if (strlen(str1) != strlen(str2)) return false;
	for (size_t i = 0; i < strlen(str1)-1; i++)
	if (str1[i] != str2[i]) return false;
	return true;
}
Ага, только -1 лишняя
Лучше реализовать вариант без strlen, иначе придется и ее писать на asm.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 18.06.2013, 00:04   #9
NewLamer&Programer
Форумчанин
 
Регистрация: 23.11.2012
Сообщений: 428
По умолчанию

я не знаю как узнать длину строки иначе
NewLamer&Programer вне форума Ответить с цитированием
Старый 18.06.2013, 00:21   #10
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Си-строки заканчиваются нуль-терминантом.
Примерно это выглядит так:
Код:
bool
_strcmp(char *str1, char *str2)
{
    while (*str1 && *str2)
        if (*(str1++) != *(str2++)) return false;
    return (!*str1 && !*str2);
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сравнение строк через strcmp(), Си++ Evielle Помощь студентам 12 28.04.2012 17:14
strcmp,strcasecmp kilogram Общие вопросы Delphi 2 10.04.2012 20:31
Функция strcmp bot.bat Помощь студентам 12 23.11.2011 16:16
Функция strcmp() ts-alan Общие вопросы C/C++ 4 04.09.2010 23:00
strlen,strcpy,strcmp(Visual C++) crit Visual C++ 14 09.04.2009 19:10