Но тогда нет никакой причины для инструкции CALL
. В конце концов, вы можете имитировать вызов:
sub esp,4
mov [esp-4], offset return_address
jmp myproc
И нет никакой необходимости в RET
инструкции, либо, потому что вы можете имитировать его:
mov eax,[esp]
add esp,4
jmp [eax]
Если вы посмотрите достаточно трудно, вы» Вы найдете множество инструкций, которые можно моделировать, комбинируя другие инструкции. В чем смысл?
Ответ на эти вопросы задается в длинной истории семейства процессоров x86 и в процессорах, которые были перед ним. Дизайнеры изучили, как программисты используют процессоры и создали набор команд, который был эффективен с точки зрения скорости выполнения и использования памяти.
В конце 70-х годов в 64 килобайтах было много оперативной памяти, а оперативная память была намного медленнее. Каждый байт инструкции был драгоценным, и было огромное количество накладных расходов, просто извлекая инструкцию из памяти. Это было не редкость, когда команда fetch занимала больше времени, чем выполнение. Таким образом, было огромное усиление производительности, которое можно было бы кодировать, используя как можно меньше байтов инструкций.
ОЗУ по-прежнему невероятно медленное по сравнению с тактовыми частотами процессора, поэтому по-прежнему можно получить усиление путем кодирования как можно меньше байтов инструкций. Это правда, что большой кеш процессора очень помогает, так же как и логика предсказания ветвей и prefetch, но каждый байт, переданный из ОЗУ в кеш процессора, по-прежнему дорогой. Платит быть экономным с кодировками инструкций.
о вызове процедур:
Стандартный способ вызова процедуры на ассемблере, чтобы раздвинуть параметры, а затем call
процедура.Например, это проходит два типа DWORD значения:
push eax
push ebx
call proc ; pushes the return address and jumps to proc
...
proc:
; at this point, [esp] contains the return address
ret
инструкция POPS обратный адрес в указатель команд.
Кто-то должен, конечно, очистить стопку. Вызывающий может очистить стек, увеличивая указатель стека. Или вызываемая процедура может очистить стек, используя ret 8
, который вытолкнет адрес возврата и увеличит указатель стека.
Для получения дополнительной информации о соглашениях о вызовах см. http://www.delorie.com/djgpp/doc/ug/asm/calling.html.
Это экономит место, а x86 на самом деле является дизайном CISC, поэтому почему бы и нет. – harold
@harold он не предоставляет никакой дополнительной функции, поэтому нет. ЦП по-прежнему тратит время на обе операции. – Hawken
Да .. но это дизайн CISC, поэтому он был разработан, чтобы облегчить работу программистов по сборке, предоставив инструкции, которые «делают многое». См. Также: 'leave',' enter', 'rep movsb' и т. Д. И это действительно экономит много места в байтах. – harold