Я предполагаю, что это хвостовой вызов, означающий, что либо текущая функция возвращает результат вызванной функции без изменений, либо (для функции, возвращающей void), возвращается сразу после вызова функции.В любом случае нет необходимости использовать call
.
. Инструкция call
выполняет две функции.Во-первых, он помещает адрес инструкции после вызова в стек как адрес возврата.Затем он переходит к месту назначения вызова.ret
извлекает адрес возврата из стека и переходит в это место.
Поскольку вызывающая функция возвращает результат вызванной функции, для операции нет причин возвращаться к ней после возврата вызванной функции.,Поэтому, когда это возможно и если уровень оптимизации позволяет это, GCC уничтожит свой кадр стека перед вызовом функции, так что на вершине стека будет указан адрес возврата для функции, которая его вызвала, а затем просто перейдет к вызываемой функции.В результате, когда вызываемая функция возвращается, она возвращается непосредственно к первой функции вместо вызывающей функции.