Uploaded by Mikhail Putyrsky

Examining the calling convention-ru

advertisement
Machine Translated by Google
Изучение соглашения о вызовах
Добавление ассемблерного модуля в проект
Настройка проекта
В некоторых проектах может возникнуть необходимость написания определенных фрагментов исходного кода на языке ассемблера. Учебник
сначала демонстрируется, как компилятор может быть полезен при изучении соглашения о вызовах, с которым вы должны быть знакомы при вызове модулей
ассемблера из модулей C/C++ или наоборот. Кроме того, в этом руководстве показано, как можно легко комбинировать исходные модули, написанные на C, с
модулями на ассемблере, но эта процедура применима и к проектам, содержащим исходные модули, написанные на C++.
В этом руководстве предполагается, что вы знакомы с основами интегрированной среды разработки IAR Embedded Workbench®, описанной в
предыдущие уроки.
ИЗУЧЕНИЕ СОГЛАШЕНИЯ О ЗВОНКАХ
Когда вы пишете подпрограмму на ассемблере, которая вызывается из подпрограммы C, вы должны знать соглашение о вызовах, которое использует компилятор.
Если вы создаете каркас кода на C и позволяете компилятору создать из него выходной файл на ассемблере, вы можете изучить созданный выходной файл на
ассемблере и найти детали соглашения о вызовах.
В этом примере вы заставите компилятор создать выходной файл на ассемблере из файла Utilities.c.
Создайте новый проект в тех же учебных пособиях рабочей области, что и в предыдущем учебном проекте, и назовите 1
проект проект2.
2Добавьте в проект файлы Tutor.c и Utilities.c.
Чтобы отобразить обзор рабочей области, щелкните вкладку « Обзор », доступную в нижней части окна «Рабочая область».
Чтобы просмотреть только вновь созданный проект, щелкните вкладку проект2 . На данный момент представление project2 должно быть видно.
3Чтобы установить параметры, выберите «Проект»> «Параметры» и выберите категорию « Общие параметры ». Нажмите «ОК».
4Чтобы установить параметры на узле уровня файла, в окне «Рабочая область» выберите файл Utilities.c.
Выберите «Проект»> «Параметры». Вы заметите, что доступны только категории C/C++ Compiler и Custom Build .
5В категории « Компилятор C/C++ » выберите « Переопределить унаследованные параметры » и проверьте следующие параметры:
Страница
Вариант
Оптимизации
Уровень: Нет (лучшая поддержка отладки)
Список
Выходной ассемблерный файл
Включить источник
Включить информацию о кадре вызова (необходимо отменить выбор).
Примечание. В этом примере вы должны использовать низкий уровень оптимизации при компиляции кода, чтобы показать доступ к локальным и глобальным
переменным. Если вы используете более высокий уровень оптимизации, необходимые ссылки на локальные переменные могут быть удалены. Однако
фактическое объявление функции не изменяется уровнем оптимизации.
6Нажмите « ОК » и вернитесь в окно «Рабочее пространство».
Скомпилируйте файл Utilities.c. Вы можете найти выходной файл Utilities.s в 7
подкаталог проекты\отладка\список.
Примечание. Если у вас ограниченная установка продукта, может быть невозможно создать файл ассемблера. В этом случае вы можете вместо этого изучить
предварительно сгенерированный файл, расположенный в каталоге репетитора.
Чтобы изучить соглашение о вызовах и посмотреть, как код C или C++ представлен на языке ассемблера, откройте файл Utilities.s.
8
Теперь вы можете изучить, где и как передаются параметры, как вернуться в программу, из которой была вызвана функция, и как вернуть
результирующее значение. Вы также можете увидеть, какие регистры должна сохранять подпрограмма на уровне ассемблера.
Machine Translated by Google
Примечание . Сгенерированный исходный файл ассемблера может содержать внутреннюю информацию компилятора, например директивы CFI.
Эти директивы доступны для целей отладки, и вы должны игнорировать эти детали.
Чтобы получить правильный интерфейс для ваших собственных функций приложения, вы должны создать скелетный код для каждой
необходимой вам функции.
Дополнительные сведения о соглашении о вызовах, используемом в компиляторе, см. в Руководстве по разработке IAR C/C++ для ARM®.
ДОБАВЛЕНИЕ МОДУЛЯ АССЕМБЛЕРА В ПРОЕКТ
В этом руководстве показано, как легко создать проект, содержащий как модули ассемблера, так и модули C.
Вы также скомпилируете проект и просмотрите файл выходного списка ассемблера.
Вы добавите ассемблерный модуль, содержащий функцию __write. Эта функция является примитивной функцией вывода, которая используется
putchar для обработки всего вывода символов. Стандартная реализация __write перенаправляет вывод символов в окно ввода/вывода терминала CSPY®. Ваша собственная версия __write также делает то же самое с дополнительной функцией, заключающейся в том, что она выводит знак * перед
каждым записанным символом.
Настройка проекта
1 Измените проект2, добавив файл Write.s.
Примечание. Чтобы просмотреть файлы ассемблера в диалоговом окне « Добавить файлы », выберите «Проект»> «Добавить файлы» и выберите «
Файлы ассемблера » в раскрывающемся списке «Тип файлов» .
Выберите узел уровня проекта в окне Workspace, выберите Project>Options. Используйте настройки по умолчанию в категориях « Общие
параметры», « Компилятор C/C++» и « Компоновщик ». Выберите категорию « Ассемблер », перейдите на вкладку « Список », 2
и выберите опцию Выходной файл списка.
Нажмите «ОК».
3 Выберите файл Write.s в окне Workspace и выберите Project>Compile , чтобы собрать его.
Предполагая, что исходный файл был успешно собран, создается файл Write.o, содержащий связываемый объект
код.
Просмотр файла списка ассемблера
Откройте файл списка, дважды щелкнув файл Write.lst, доступный на значке выходной папки в рабочей области.
4 окно.
В конце файла содержится сводка сгенерированных ошибок и предупреждений.
Дополнительные сведения о формате файла списка см. в Справочном руководстве по ассемблеру ARM® IAR.
5 Выберите «Проект»> « Создать» , чтобы повторно связать проект2.
Запустите C-SPY, чтобы запустить приложение project2.out, и убедитесь, что оно ведет себя так же, как приложение из предыдущего
6 руководства, но с * перед каждым написанным символом.
Выйдите из отладчика, когда закончите.
Download