2015-02-08 2 views
0
push ebx 
push ebp 
mov ebp,[esp+14] 
push esi 
mov esi,[esp+14] 
push edi 
mov [esp+10],00000000 
cmp dword ptr [ebp+00],05 
jne aheadInThisFx 
mov eax,[esp+20] 
mov edi,[ebp+08] 
push eax 
push edi 
push esi 
call SomeItherFx 
//more code 
aheadInThisFx: 

Код, приведенный выше, является разборкой начала функции, это очень странно. Какой компилятор мог бы породить такую ​​бессмыслицу? Если вы уже столкнулись с чем-то похожим, пожалуйста, объясните мне это тоже. Я не понимаю конвенцию. В строке 3, что это означает: mov ebp,[esp+14] не должно быть: push ebp mov ebp,esp и аргументы, [ebp-4], [ebp-8]? СпасибоЗвонок по вызову странного собрания

+1

По-видимому, он использует регистр «ebp» в качестве общего назначения. В соглашении о вызове не указывается указатель на фрейм, а также стандартный стек стека. – Jester

+0

Представьте себе стек. ESP - это смещение самого верхнего элемента в стеке. [esp + 14] ссылается на значение, которое сохраняется на 7 словах ниже ESP. –

+0

См. [Что такое указатель базы и указатель стека? На что они указывают?] (Http://stackoverflow.com/questions/1395591/), в частности [этот ответ] (http://stackoverflow.com/a/1395646/902497), в котором обсуждается упущение указателя кадра (FPO) , –

ответ

0

Обычные соглашения о вызовах x86-32 определяют только то, как должны быть изложены аргументы в стеке, кто их удаляет и какие регистры должны быть сохранены. В частности, указатель кадра обычно не требуется, и код может использовать ebp как еще один зарегистрированный пользователем регистр. Допускаются аргументы относительно esp, зная структуру стека, предписанную соглашением, и любые корректировки стека, сделанные вашим собственным кодом.

Это далеко не «бессмыслица», это частая оптимизация. Учитывая, что x86-32 не дает вам очень много регистров, имеет смысл не тратить ebp на указатель кадра, если это не требуется.

Что касается цитируемого кода, ebx, ebp, esi и edi выталкиваются, потому что они сохраняемые вызываемые модуль регистры. Я предполагаю, что эти цифры в шестнадцатеричном, так что mov ebp,[esp+14] загружает 3-й аргумент, так как расположение стека в этой точке, начиная с esp, является: ebp, ebx, return address, arg1, arg2, arg3. Аналогичным образом, mov esi,[esp+14] загрузит второй аргумент, потому что к этому моменту esi также будет находиться в стеке.

+0

По-прежнему предполагая, что числа в шестнадцатеричном виде, любые идеи, почему функция будет нулевым своим обратным адресом? (** mov [esp + 10], 00000000 **) –

+0

@ user3144770 приятно поймать ... Я понятия не имею. – Jester