2015-12-30 2 views
0

Я боролся с реализацией следующей 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. Может ли кто-нибудь указать, что я могу здесь делать неправильно?

+0

Вы ищете 'n' по правому адресу? Что такое поведение 'push eax'? – dlask

+0

Это может читать вне 's1' (и потенциально segfault), если' s2' намного длиннее 's1', если только' memcmp' всегда идет в порядке возрастания и никогда не читает ни одного байта, в котором '' \ 0'' в ' s1' не соответствует чему-то еще в 's2'. Вектор с надписью 'memcpy', который использует невыложенные нагрузки из 16 блоков или что-то может легко прочитать за конец' s1'. –

ответ

2

После нажатия eax на стек, esp указывает на это место памяти. Линия

push dword[esp + 4] 

не будет push значение n но значение толкнул заранее.
Заменить строку с

push dword[esp] 

и повторите попытку.