как вызовы процедуры работают в ассемблере?

включая файлы является медленным, и требование их еще медленнее. Если Вы будете использовать __ автозагрузка для включения каждого класса тогда, то это сложит. например.

я всегда немного опасаюсь пытаться быть слишком умным с точки зрения оптимизации кода, если она жертвует ясностью кода. Если бы необходимо сделать код неясным для создания его быстро, не было бы более дешево обновить hardwear вместо того, чтобы тратить впустую время, пытаясь настроить код? Циклы процессора являются более дешевыми, чем циклы программиста, в конце концов.

8
задан starblue 14 November 2009 в 09:26
поделиться

4 ответа

в ассемблере x86 параметр для инструкции ret означает:

RET немедленно

Возврат к вызывающей процедуре и немедленно pop ] байт из стека.

(цитата из Руководства разработчика программного обеспечения для архитектур Intel® 64 и IA-32 Том 2B )

Итак, когда вы набираете:

ret 0004

, вы говорите ЦП должен вернуться к инструкции сразу после вызова и удалить 4 байта из стека. Это замечательно, если вы поместили 4 байта в стек перед вызовом.

push eax
call dword ptr[123]

Обратите внимание, что это не имеет ничего общего с возвращаемым значением. Фактически, процедура в Assembly не может указать, что значение является возвращаемым значением. Все это делается условно. Большинство компиляторов, о которых я знаю, будут использовать EAX для хранения возвращаемого значения, но это верно только потому, что вызывающая функция ожидает там результата.

Итак, ваш вызывающий код будет:

call dword ptr [123]
mov dword ptr [result], eax

, а ваша функция, которая возвращает значение 4, будет:

mov eax, 4
ret
12
ответ дан 5 December 2019 в 12:11
поделиться

Все зависит от используемого соглашения о вызовах . Я не буду здесь повторять статью из Википедии, просто прочтите определение.

В соглашении о вызовах C , например, возвращаемое значение будет в EAX / AX / AL. У вашей одиночной инструкции его нет: это функция void, принимающая около 4 байтов параметров (возможно, один int), которая ничего не делает. Поскольку в этом соглашении о вызовах обязанность вызываемого - очистить стек, игнорирование этого и замена вызова на 'mov ax' не работает.

Также я подозреваю, что вы можете возиться с 32-битной сборкой, пока чтение 16-битного документа. Это не большая проблема, но вы должны знать о различиях.

2
ответ дан 5 December 2019 в 12:11
поделиться
// possibly there are arguments pushed here
...
call dword ptr[123] // push next OP code offset in the stack and jump to procedure

// procedure
...
ret 0004 // pop offset, set EIP to that offset and decrease ESP by 4

мы дополнительно уменьшаем ESP, если мы поместили аргументы в стек перед вызовом процедуры.


Если есть проталкиваемые аргументы, ваша программа выйдет из строя, потому что вы этого не сделаете. ткнуть их. Смещение возврата для текущей процедуры будет неправильным, поскольку в качестве смещения она получит значение из одного из переданных аргументов.

1
ответ дан 5 December 2019 в 12:11
поделиться

Я не думаю, что возвращаемое значение хранится в регистре AX

-1
ответ дан 5 December 2019 в 12:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: