Я боролся с реализацией следующей strstr функции в NASM:Проблемы с реализации strstr в NASM
char *strstr(const char *s1, const char *s2) {
size_t n = strlen(s2);
while(*s1)
if(!memcmp(s1++,s2,n))
return s1-1;
return 0;
}
До сих пор у меня есть следующий код:
global _mystrstr
extern _strlen
extern _memcmp
_mystrstr:
; prologue goes here
; moving s1 to edi and s2 to esi
; pushing n onto the stack and jumping to the loop
; while(*s1)
.while_loop:
cmp byte[edi], 0
je .return_null
; memcmp(s1++,s2,n)
push dword[esp + 4]
push esi
push edi
call _memcmp
add esp, 12
inc edi
; if(!memcmp(s1++,s2,n))
cmp eax, 0
jne .while_loop
jmp .return_value
.return_value:
; blah blah
.return_null:
; standard stuff goes here
По какой-то причине memcmp никогда не возвращает 0. Я проверил его с printf, распечатав значения, которые имеет eax, и всегда 1 или -1. Может ли кто-нибудь указать, что я могу здесь делать неправильно?
Вы ищете 'n' по правому адресу? Что такое поведение 'push eax'? – dlask
Это может читать вне 's1' (и потенциально segfault), если' s2' намного длиннее 's1', если только' memcmp' всегда идет в порядке возрастания и никогда не читает ни одного байта, в котором '' \ 0'' в ' s1' не соответствует чему-то еще в 's2'. Вектор с надписью 'memcpy', который использует невыложенные нагрузки из 16 блоков или что-то может легко прочитать за конец' s1'. –