в ассемблере x86 параметр для инструкции ret
означает:
RET <i>immediate</i>
Возврат к вызывающей процедуре и извлечение немедленных байтов из стека.
(цитата из Руководства разработчика программного обеспечения для архитектуры Intel® 64 и IA-32 Том 2B )
Поэтому, когда вы печатаете:
ret 0004
Вы говорите ЦПУ вернуться к инструкции сразу после call
и вытолкнуть 4 байта из стека. Это замечательно, если вы поместили 4 байта в стек перед вызовом.
push eax
call dword ptr[123]
Обратите внимание, что это не имеет ничего общего с возвращаемым значением. Фактически, процедура в Assembly не может указать, что значение является значением return . Это все сделано по соглашению. Большинство известных мне компиляторов будут использовать EAX
для хранения возвращаемого значения, но это верно только потому, что функция , вызывающая , будет ожидать результата там.
Таким образом, ваш телефонный код будет:
call dword ptr [123]
mov dword ptr [result], eax
и ваша функция, которая возвращает значение 4, будет:
mov eax, 4
ret