Другие языки программирования и технологии

Помогите разобраться с ассемблером

На скриншоте очень нужно разобраться что делает процедура check(), т. е. строчки от 00401000 до 0040310A, но в ассемблере практически ничего не понимаю, кому не сложно подскажите плиз.
Andrei Suvorov
Andrei Suvorov
163
Видимо, это функция, которой передаётся указатель на Unicode строку. Соглашение о передаче параметров - cdecl.

check proc cdecl
push ebp; сохранение ebp в стеке
mov ebp,esp; установка указателя ebp, для доступа к переданному параметру
push esi; сохранение esi в стеке
mov esi,dword ptr [ebp+8]; загрузка в esi переданного указателя на строку
push esi; заталкивание его в стек для вызова системной функции
call LStrLenW; Вызов системной функции для определения длины строки
cmp eax,8; Если длина строки не равна 8 символам, то
jnz @401038; переход на завершение функции
cmp word ptr [esi],73h; Если первый символ строки не равен 's', то
jnz @401020; переход на проверку второго символа
mov eax,52h; иначе замена первого символа строки на 'R'
mov word ptr [esi],ax; Вместо 's' записался 'R'
@401020:
cmp word ptr [esi+2],65h; Если второй символ не равен 'e', то
jnz @401030; переход на запись флажка 5
mov ecx,53h; иначе замена второго символа на 'S'
mov word ptr [esi+2],cx; Вместо 'e' записался 'S'
@401030:
xor eax,eax; Получение адреса какой-то глобальной переменной с адресом 00000000
mov dword ptr [eax],5; Запись в неё значения 5 (скорее всего, какой-то флажок)
@401038:
pop esi; восстановление регистра esi из стека
pop ebp; восстановление регистра ebp из стека
ret; возврат из функции
check endp

Функция может возвратить следующие значения:
- длина строки (не равная 8)
- 0, в противном случае
- дополнительно, если длина строки равна 8, то в какую-то глобальную переменную запишется значение 5.

Псевдокод:
function check(string) result dword
if length(string) = 8 then
if string[1] = 's' then
string[1] := 'R'
end if
if string[2] = 'e' then
string[2] := 'S'
end if
var := 5
return 0
else
return length(string)
end if
end function
Kanat Abishev
Kanat Abishev
51 590
Лучший ответ
push помещает слово или двойное слово в область памяти!