Книга: Программирование для Linux. Профессиональный подход
9.2.1. Преобразование функции asm() в ассемблерные инструкции
9.2.1. Преобразование функции asm() в ассемблерные инструкции
Компилятор gcc
интерпретирует функцию asm()
очень просто: он генерирует ассемблерные инструкции, обрабатывающие указанные входные и выходные операнды, после чего заменяет вызов функции заданной инструкцией. Никакой дополнительный анализ не выполняется.
Например, следующий фрагмент программы:
double foo, bar;
asm("mycool_asm %1, %0" : "=r" (bar) : "r" (foo));
будет преобразован в такую последовательность команд x86:
movl -8(%ebp),%edx
movl -4(%ebp),%ecx
#APP
mycool_asm %edx, %edx
#NO_APP
movl %edx,-16(%ebp)
movl %ecx,-12(%ebp)
Переменные foo
и bar
занимают по два слова в стеке в 32-разрядной архитектуре x86. Регистр ebp
ссылается на данные, находящиеся в стеке.
Первые две команды копируют переменную foo в регистры edx
и ecx
, с которыми работает инструкция mycool_asm
. Компилятор решил поместить результат в те же самые регистры. Последние две команды копируют результат в переменную bar
. Выбор нужных регистров и копирование операндов осуществляются автоматически.
- Пошаговые инструкции для перехода на 3-й диалект
- Преобразование XML в реляционную базу данных
- Аргументы функции в Python
- 3. Функции
- Новые функции API для работы с Blob и массивами
- Преобразование строки в целое: stoi( )
- Приложение 21 Образец должностной инструкции начальника отдела по работе с сетевыми клиентами
- Приложение 19 Образец должностной инструкции мерчендайзера
- Математические функции
- Размытые функции
- 7.3. Финансовые функции
- 4.3. Логические функции и таблицы истинности