У меня есть три фрагмента кода ассемблера, и я должен определить правильное соглашение о вызове (CDECL, STDCALL, FASTCALL) для каждого фрагмента. Чтобы идентифицировать соглашение о вызовах, я искал очиститель стека, который является либо вызывающим, либо вызываемым. Но что, если я не могу найти код очистки, который, как я полагаю, выглядит как «добавить esp, 8». Я ошибаюсь в своем подходе. Должен ли я искать другие характеристики конференц-связи? Ниже приведены фрагменты кода.Как идентифицировать вызывающие соглашения в коде сборки
Фрагмент 1
push ebp
mov ebp , esp
sub esp , 0x8
mov [ ebp-0x4 ] , eax
mov [ ebp-0x8 ] , edx
mov eax , [ ebp-0x8 ]
mov edx , [ ebp-0x4 ]
add edx , eax
mov eax , ecx
add eax , edx
leave
ret
Фрагмент 2
push ebp
mov ebp , esp
mov eax , [ ebp+0xC]
mov edx , [ ebp+0x8 ]
add edx , eax
mov eax , [ ebp+0x10 ]
add eax , edx
pop ebp
ret 0xC
Фрагмент 3
push ebp
mov ebp , esp
mov eax , [ ebp+0xC]
mov edx , [ ebp+0x8 ]
add edx , eax
mov eax , [ ebp+0x10 ]
add eax , edx
pop ebp
ret
WTB выделения для ассемблере на StackOverflow :( –
'добавить особ ...' это не единственный способ, [RET работает] (HTTP://переполнение стека.com/questions/1396909/ret-retn-retf-how-to-use-them) – Diego
поэтому в случае 'ret' обратный адрес выставляется из стека и помещается в' eip'. Так что до звонящего, чтобы очистить стек, не так ли? – Dennis1818