在NASM中实现strstr的问题

时间:2015-12-30 16:43:10

标签: c assembly nasm

我一直在努力在NASM中实现以下 strstr 功能:

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.我已经通过打印出eax所持有的值来测试 printf ,并且它始终是1或-1。谁能指出我在这里可能做错了什么?

1 个答案:

答案 0 :(得分:2)

在堆栈上按eax后,esp指向该内存位置。这条线

push    dword[esp + 4]

不会push n的值,而是预先推送的价值 用

替换该行
push dword[esp]

再试一次。