в чем разница между меткой и функцией в ассемблере

следили за учебным пособием по сборке на YouTube здесь с помощью синтаксиса AT&T. Я только что узнал об объявлении (если это правильный термин здесь) функции с директивой .type, например:

.type MyFunction, @function

Теперь я могу определить свою функцию следующим образом:

MyFunction:
    <code here>

И впоследствии вызывать его всякий раз, когда:

call MyFunction

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

MyLabel:
    <code here>

который затем можно было бы назвать так:

call MyLabel

Итак, мои вопросы:

В чем именно разница между функцией, объявленной с помощью .type, и «функцией», объявленной просто с помощью метки? Когда следует использовать один над другим, или это имеет значение?


person Davies Jeffrey    schedule 14.07.2015    source источник
comment
Метки часто используются для целей ветвления. Функции «экспортируются» в объектный файл и разрешаются компоновщиком, поэтому их можно вызывать из другого объекта. Поскольку вы упомянули AT&T, я предполагаю, что вы изучаете x86[-64] на Linux/BSD (или OSX)?   -  person Brett Hale    schedule 14.07.2015
comment
Да я учусь на x86_64 linux   -  person Davies Jeffrey    schedule 14.07.2015
comment
AT&T с GNU as (газ) не очень удобна для пользователя, но вам не нужно много директив для написания простых функций, и вы можете обратиться к выходным данным сборки от gcc, чтобы посмотреть, как транслируются простые функции C. Вы можете использовать nasm, если вам удобнее использовать синтаксис Intel. Существует также ELF ABI, в котором объясняются соглашения о вызовах и кадры стека для x86. -64 линукс.   -  person Brett Hale    schedule 14.07.2015
comment
и вы используете ассемблер gnu или что-то еще?   -  person old_timer    schedule 14.07.2015


Ответы (2)


Вот что говорится в документах binutils о директиве .type (при условии, что вы используете Ассемблер GNU):

Эта директива используется для установки типа символа.

...

Для целей ELF директива .type используется следующим образом:

.type name , type description

Согласно документации по типу символа:

Атрибут type символа содержит информацию о перемещении (разделе), любые настройки флага, указывающие, что символ является внешним, и (необязательно) другую информацию для компоновщиков и отладчиков. Точный формат зависит от используемого формата вывода объектного кода.

.type MyFunction, @function помечает метку MyFunction (которая является символом) как функцию для компоновщика или отладчика.

При написании чистых ассемблерных файлов вручную в этом нет необходимости. Вот пример файла , в котором вызывается функция itoa. Как видите, перед меткой нет никаких директив.

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

person Calculuswhiz    schedule 19.12.2019

Я думаю, что какую бы сборку вы ни использовали, это команда возврата. Какое бы имя для "возврата" в вашем ассемблере не использовалось. Вызов функции отличается от ветвления тем, что некоторые данные контекста (статусный регистр с битами N, C, V, программный счетчик) помещаются/сохраняются в стек. При выполнении команды возврата данные из стека восстанавливаются. Это необходимо для возможности продолжения выполнения программы с адреса сразу после вызова вашей функции.

person Shkodzer    schedule 27.08.2019