我一直在努力在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。谁能指出我在这里可能做错了什么?
答案 0 :(得分:2)
在堆栈上按eax
后,esp
指向该内存位置。这条线
push dword[esp + 4]
不会push
n
的值,而是预先推送的价值
用
push dword[esp]
再试一次。