Строки:
mov dword ptr [ebp-24], edi
mov EAX , esi
mov BYTE PTR [ebp-28], al
предполагают, что для этой функции был выделен кадр стека, что не соответствует действительности;Я думаю, у вас должно быть что-то вроде:
sub esp, 32
после
mov ebp,esp
Кроме того, три строки после L2 кажутся запутанными.Единственный способ добраться до L2 - это обнаружение в строке байта nil (0), после чего код должен возвращать указатель NULL.Путь выхода в коде (L6) оставляет eax в покое, поэтому все, что нужно, это:
L2:
mov eax, 0
Это может упростить отладку, если поддерживать псевдоним в актуальном состоянии;Итак:
L2:
mov eax, 0
mov [ebp-24], eax
Кроме того, соглашение о вызовах, используемое здесь, немного странно: строка передается в edi, а символ в esi.Обычно в x86-32 они оба передаются в стек.Похоже, это мог быть код x86-64, преобразованный в x86-32 ....
Последнее замечание;этот код сборки выглядит как выход компилятора с отключенными оптимизациями.Зачастую генерация сборки с включенной оптимизацией создает более понятный код.Этот код, например, мог бы быть написан гораздо более кратко, как показано ниже, даже не переходя в странные операции Intel:
strchar:
mov edx, esi
mov eax, edi
L:
mov dh, [eax]
test dh, dh
jz null
cmp dh, dl
je done
inc eax
jmp L
null:
mov eax, 0
done:
ret