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

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

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

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

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

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

<дабл-пост>
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 18.06.2013 в 00:23.
BDA вне форума Ответить с цитированием
Старый 18.06.2013, 08:16   #12
NewLamer&Programer
Форумчанин
 
Регистрация: 23.11.2012
Сообщений: 428
По умолчанию

тоже нихрена не понял, прокомментируйте пожалуйста

п.с. не работает кстати, выводит первую запись все время с этой функцией

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

Не работает, потому что я задумался и изменил логику функции.
Она возвращает true, если строки совпадают, и false, если не совпадают.
Код:
bool
_equal(char *str1, char *str2)
{
    while (*str1 && *str2) //пока оба символа не равны 0, выполняем цикл
        if (*(str1++) != *(str2++)) return false;//если текущие символы не совпадают, то возвращаем false, иначе, сдвинув оба адреса по строке дальше, повторяем цикл
    return (!*str1 && !*str2);//если обе строки закончились, то возвращаем true (не нулевое значение)
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 18.06.2013, 15:02   #14
NewLamer&Programer
Форумчанин
 
Регистрация: 23.11.2012
Сообщений: 428
По умолчанию

заработало, только мне теперь еще это надо же перевести на ассемблер

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

Большинство необходимых команд уже привел waleri в 4 посте.
В простейшем случае возвращаемое значение должно находится в регистре eax.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 18.06.2013, 15:39   #16
NewLamer&Programer
Форумчанин
 
Регистрация: 23.11.2012
Сообщений: 428
По умолчанию

начал, не знаю как сделать true

Код:
__declspec(naked)
bool _strcmp(char *str1, char *str2)
{
	__asm
	{
		push eax
		push ebx
		again:
		mov eax, str1
		mov ebx, str2
		mov al, [eax]
		mov ax, [ebx]
		inc eax
		inc ebx
		cmp al, ax
		je again
		mov eax, false
		exit:
		pop ebx
		pop eax
		ret
	}
}
п.с. да еще у al и ax конфликт размеров операндов

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

Лучше, наверное, возвращать int.
Насчет конфликта размеров - Регистры процессора. Вы задействуете один и тот же регистр. И никакого push eax, pop eax - иначе никакого смысла в функции не будет.

Примерно это выглядит:
Код:
__asm
{
    push ebx
    push ecx
    push edx
    mov eax, 1
    mov ebx, str1
    mov ecx, str2   
    again:
        mov dh, [ebx]
        mov dl, [ecx]
        cmp dh, 0
        je next
        cmp dl, 0
        je next
        inc ebx
        inc ecx
        cmp dh, dl
    je again
    fl:
    mov eax, 0
    jmp exit
    next:
    cmp dh, 0
    jne fl
    cmp dl, 0
    jne fl
    exit:
    pop edx
    pop ecx
    pop ebx
    ret
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 18.06.2013 в 16:03.
BDA вне форума Ответить с цитированием
Старый 18.06.2013, 16:06   #18
NewLamer&Programer
Форумчанин
 
Регистрация: 23.11.2012
Сообщений: 428
По умолчанию

1. а чем bool то не подходит? я же хочу реализацию написанной вами выше функции написать на ассемблере
2. в смысле один и тот же? al и ax это же разные регистры о_О во всяком случае мне так казалось... ошибка возникает в строке cmp если что
3. ааа понял про push, pop да точно бред
NewLamer&Programer вне форума Ответить с цитированием
Старый 18.06.2013, 16:10   #19
NewLamer&Programer
Форумчанин
 
Регистрация: 23.11.2012
Сообщений: 428
По умолчанию

п.с. понял про ax, al, не заметил ссылочку, заменил ax на ah

Код:
__declspec(naked)
bool _strcmp(char *str1, char *str2)
{
	__asm
	{
		again:
		mov eax, str1
		mov ebx, str2
		mov ah, [eax]
		mov al, [ebx]
		inc eax
		inc ebx
		cmp ah, al
		je again
		mov eax, false
		ret
	}
}
теперь мне пишет только что error C2094: метка "false" не была определена
NewLamer&Programer вне форума Ответить с цитированием
Старый 18.06.2013, 16:16   #20
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Цитата:
Сообщение от NewLamer&Programer Посмотреть сообщение
теперь мне пишет только что error C2094: метка "false" не была определена
Ну вот. Самый простой способ - отказаться от bool в пользу int.
Во-вторых, у Вас в eax адрес строки. Как Вы думаете, что с ним произойдет после mov ah, [eax]? В-третьих, в "цикле" again в eax и ebx все время оказываются адреса начал строк. Посмотрите примерный код выше.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
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