ASM_R3 (Взаимосвязь языков C и ассемблера)

2016-07-31СтудИзба

Описание файла

Документ из архива "Взаимосвязь языков C и ассемблера", который расположен в категории "". Всё это находится в предмете "информатика" из , которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "рефераты, доклады и презентации", в предмете "информатика, программирование" в общих файлах.

Онлайн просмотр документа "ASM_R3"

Текст из документа "ASM_R3"

Раздел 3: Вызов ассемблерных функций из С

3.1 Символы подчеркивания

Как показывает практика, все символы PUBLIC и EXTERN должны начинаться символами подчеркивания. Это необходимо делать только в ассемблерном модуле (но не в исходной про грамме С или C++), поскольку компилятор добавляет подчеркивание ко всем глобальным символам, если только не используется опция -u для компиляции программ. (Не стоит применять эту опцию, если только не надо также перекомпилировать всю используемую при выполнении С библиотеку, в которой предполагается, что все глобальные символы начинаются символом подчеркивания.) Если во время компоновки выходит сообщение об ошибке "undefined symbol" (неопределенный символ), то причиной может оказаться отсутствие подчеркивания в ассемблерном модуле.

3.2 Использование дальних данных

Если объявляются переменные в дальнем сегменте данных после ключевого слова FARDATA, то необходимо подготовить сегментный регистр к размещению переменных в памяти. Прежде всего, вслед за директивой FARDATA необходимо объявить данные:

FARDATA

_OuterLimits dw ?

Затем, в кодовом сегменте, следует перед использованием переменной подготовить сегментный регистр. Одним из возможных подходов является использование оператора SEG для загрузки адреса дальнего сегмента данных:

mov ax, SEG_OuterLimits;Адресует дальний сегмент ;данных

mov es, ах ;посредством es

mov [es:_OuterLimits], dx ;Резервируется dx для пере ;менной

Можно также использовать заранее определенный символ @fardata:

mov ах, @fardata

mov es, ах

mov [es:_OuterLimits], dx

3.3 Вызов ассемблерных функций из С

Чаще всего asm код оформляют в виде отдельных asm функций, которые потом соединяют на этапе загрузки. Ассемблерный код должен поддерживать стиль языка С для вызова функций, которые включают передачу параметров, возврат значений и правила сохранения регистров, которые требуются для С++ функций.

Компилятор и загрузчик должны работать совместно для обеспечения вызовов между модулями. Процесс называется исключением или ломкой имен. Предусматривает наличие информации о типе аргумента. Ломка имени изменяет имя функции, показывая, что за аргумент принимает функция. Когда мы конструируем на языке С++, то ломка имен происходит автоматически.

Когда же пишется модуль на asm, который должен быть подсоединен к модулю на языке С++, необходимо позаботиться о том, чтобы asm модуль содержал ломку имен (знак подчеркивания). Это можно сделать путем написания фиктивной функции на С++ и компилировать его в asm код. И ассемблерный файл, который будет сгенерирован компилятором С++, будет содержать ломку имен, которые мы можем потом использовать при написании asm функции:

@ имя класса @ исходное имя функции $g описание типов

, где

@ - связующий символ

$ - конец исходного имени функции

g - начало описания типов параметров

Пример:

void test() {}

void test(int...) {}

void test(int, int) {}

void test(float, double) {}

Что будет в ассемблере?

1. @ test $ gv proc near

push bp

mov bp, sp

pop bp

ret

@ test $ gv endp

2. @ test $ gi proc near

.............

@ test $ gi endp

3. @ test $ gii proc near

............

@ test $ gii endp

4. @ test $ gfd proc near

............

@ test $ gfd endp

BC++ разрешает использование неискаженных имен asm функций, определяя стандартные имена С функций в С программах. Для этого в программе определяется внешний С блок:

extern “C”{

int add(int *a, int b);

}

________________

public _add

_add proc ...и т.д.

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

С++ передает параметры функции через стек. Перед тем как вызвать функцию С++ помещает параметры в стек, начиная с последнего.

3.4 Ассемблирование и компоновка внешних модулей

Существует несколько методов ассемблирования, компиляции и компоновки отдельных модулей (и аналогичных многофайловых программ) для создания конечной .ЕХЕ программы. Проще всего предоставить проделать все это Turbo С:

tcc cfillstr cfill.asm/*первый модуль - cfillstr.c*/

Если используется Borland C++, надо ввести следующую команду (заменить bсс на tсс для Turbo C++):

bcc cfillstr.с cfill.asm

В любом случае команда сперва компилирует CFILLSTR.C в CFILLSTR.OBJ. Затем, распознав расширение имени файла .ASM как имя ассемблерного модуля, компилятор вызывает Turbo Assembler, чтобы ассемблировать CFILL.ASM в CFILL.OBJ. И наконец, компилятор вызывает Turbo Linker для объединения модулей с объектными кодами в CFILLSTR.EXE. Если компиляции и ассемблированию подлежит небольшое количество модулей, этот одношаговый метод наиболее прост для использования.

Если у имеется большое количество модулей, можно сэкономить время, осуществляя ассемблирование и компоновку раздельно. Первым шагом следует ассемблировать все .ASM файлы. Поскольку пример flllsrting обладает только одним таким файлом, все можно проделать с помощью единственной команды

tasm /ml cfill.asm

Опция /ml включает различение строчных и прописных символов, чтобы к примеру слова UpAndDown и upanddown рассматривались как различные - как это принято в программах С и C++. (Turbo Assembler обычно не обращает внимания на то, в каком регистре набраны символы, поэтому опция /ml необходима во избежание ошибок при компоновке.) После ассемблирования всех внешних модулей откомпилировать основную программу. Опять же, поскольку в этом примере имеется только один файл .С, для этого необходима только одна команда

tcc -с cfillstr.c

Если используется Borland C++, надо применить следующую команду (заменить bсс на tсс для Turbo C++):

bсс -с cfillstr.c

Опция -с означает "только компилировать", вызывая создание CFILLSTR.OBJ, но не компоновку программы в законченный кодовый файл. Для включения всех модулей необходимо выполнить этот шаг самим, вызывая Turbo Linker для объединения файлов с объектным кодом с соответствующими библиотечными подпрограммами для создания CFILLSTR.EXE. Существует два метода компоновки. Сначала рассмотрим более сложный метод:

t1ink с:\tc\lib\c0s cfillstr cfill, cfillstr,, с:\tc\lib\cs

При использовании Borland C++4 можно применить следующую команду:

tlink с:\bc4\lib\c0s cfillstr cfill, cfillstr,, с:\bc4\lib\cs

Первый член после tlink специфицирует файл объектного кода в директории \LIB для соответствующей модели памяти, в данном случае - COS.OBJ. Второй и третий члены перечисляют подлежащие компоновке файлы с объектным кодом .OBJ - они могут быть перечислены в любом порядке. Запятая отделяет список файлов .OBJ от имени, которое должно использоваться для конечного файла, в данном случае - CFILLSTR-EXE. Две запятые, следующие за этим, показывают место необязательного файла карты (*.map), не создающегося в данном примере. И наконец, специфицируется рабочая библиотека - также в каталоге \LIB.

Имена файла с объектным кодом COS и библиотечным файлом CS должны соответствовать модели памяти, используемой программой.

Упрощенный (но не очень быстрый) метод компоновки отдельных модулей состоит в использовании компилятора в качестве "первой части" Turbo Linker. Другими словами, вставляя различные команды компиляции, можно пропустить компиляцию и перейти прямо к компоновке. Это дает возможность избежать необходимости специфицировать имена рабочих библиотечных файлов и, следовательно, упрощает команду компоновки. Например, для ассемблирования, компиляции и компоновки CFILLSTR этим методом требуются три команды:

tasm /ml cfill.asm

tee -с cfillstr.c

tee -ms cfillstr.obj cfill.obj

Для Borland C++ надо ввести следующие команды (заменить bсс на tсс для Turbo C++):

tasm /ml cfill.asm

bee -с cfillstr.с

bee -ms cfillstr.obj cfill.obj

Первые две команды - те же, что были описаны выше. Третья вызывает компилятор во второй раз, используя опцию -ms для определения модели памяти, в данном случае small (малая). Вслед за опцией модели памяти идут файлы с объектным кодом, подлежащие компоновке. Хотя приходится включать расширение имен файлов .OBJ в перечисление каждого файла, этот не очень длинный метод компоновки упрощает большую часть черновой работы по непосредственному запуску Turbo Linker. Для того, чтобы узнать, какую опцию надо писать при TCC, можно воспользоваться следующей таблицей.

Таблица 3.1: Имена файлов рабочей библиотеки

Модель памяти

Объектный файл

Библиотечный файл

Опция TCC

Tiny

c0t.obj

cs.lib

-mt

Small

c0s.obj

cs.lib

-ms

Medium

c0m.obj

cm.lib

-mm

Compact

c0c.obj

cl.lib

-mc

Large

c0l.obj

cl.lib

-ml

Huge

c0h.obj

ch.lib

-mh

14


Свежие статьи
Популярно сейчас
Как Вы думаете, сколько людей до Вас делали точно такое же задание? 99% студентов выполняют точно такие же задания, как и их предшественники год назад. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Нашёл ошибку?
Или хочешь предложить что-то улучшить на этой странице? Напиши об этом и получи бонус!
Бонус рассчитывается индивидуально в каждом случае и может быть в виде баллов или бесплатной услуги от студизбы.
Предложить исправление
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5076
Авторов
на СтудИзбе
455
Средний доход
с одного платного файла
Обучение Подробнее