Сколько машинных инструкций необходимо для вызова функции в C? - PullRequest
1 голос
/ 25 марта 2011

Я хотел бы знать, сколько инструкций необходимо для вызова функции в программе на C, скомпилированной с gcc для платформ x86 от начала до конца.

Ответы [ 4 ]

3 голосов
/ 25 марта 2011
  • Напишите код.
  • Скомпилируйте его.
  • Посмотрите на разборку.
  • Подсчитайте инструкции.

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

1 голос
/ 25 марта 2011

Если вы используете -mno-accumulate-outgoing-args и -Os (или -mpreferred-stack-boundary=2, или 3 на 64-битной), то издержки равны ровно одному push на аргумент размером с слово, одному call и add чтобы настроить указатель стека после возврата.

Без -mno-accumulate-outgoing-args и с 16-байтовым выравниванием стека по умолчанию, gcc генерирует код примерно такой же скорости, но примерно в пять раз больше для вызовов функций, без веской причины.

1 голос
/ 25 марта 2011

я бы ожидал хотя бы одного

CALL Function

если, конечно, он не встроен.

1 голос
/ 25 марта 2011

Это действительно сложный вопрос, на который трудно ответить, и он может варьироваться.

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

Затем в вызываемой процедуре первыми инструкциями будет выделение локальных переменных.Обычно это делается за 3 операции:

PUSH EBP
MOV EBP, ESP
SUB ESP, xxx

После этого у вас будет код сборки функции.

После кода, но до возврата восстановятся ebp и esp:

MOV ESP, EBP
POP EBP

Наконец, у вас будет инструкция ret , которая в зависимости от соглашения о вызовах отменяет параметры стека или оставляет его вызывающей стороне.Вы можете определить это, если RET с числом в качестве параметра или если параметр равен 0, соответственно.В случае, если параметр равен 0, у вас будут инструкции POP в вызывающей программе после инструкции CALL .

...