Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Использование ассемблерных .lib-файлов в программах на си  (Прочитано 13066 раз)
0 Пользователей и 1 Гость смотрят эту тему.
sysh
Гость
« : 14-12-2006 09:14 » 

Объясняю суть проблемы:

Я написал my.asm-файл, скомпилил его как библиотеку, получил my.lib. В my.asm была описана процедура myproc. Имеется также файл my.inc с прототипом myproc.

Вопросы такие:
 Не понял
1.Как подключить my.lib к my_c.c, чтобы можно было использовать myproc в сишной проге?
2.Нужно ли в my.asm перед описанием myproc писать что-то вроде extrn "C"?

Всем откликнувшимся заранее спасибо! Улыбаюсь
Записан
Scorp__)
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 14-12-2006 10:28 » 

Вообще у меня сделано было так:
В файле .c было объявление ассемблерных процедур как
Код:
extern void ProcessRead0(void);

В файле .asm эти процедуры объявлялись как PUBLIC и все.

Ну и наконец, линкеру указан объектный файл, получившийся в результате ассемблирования файла .asm, я думаю, что либа здесь тоже прокатит.

Файл .inc, при этом, использовался только для ассемблирования, а сишный компилятор про него ничего вообще не знал.
« Последнее редактирование: 14-12-2006 10:30 от Scorp__) » Записан

- А Вы сами-то верите в привидения?
- Конечно, нет, - ответил лектор и медленно растаял в воздухе.
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 15-12-2006 05:24 » 

Сдесь проблем никаких нет. Довольно много функций из стандартной библиотеки 'C' написанно именно на ассемблере.

Тут самое главное правильно правильно подготовить .obj файл из .asm и .lib из .obj.
Для того, что бы добавить файл .lib к своему проекту можно поступать двумя разными способами:

1 - сообщить линкеру о добавляемой библиотеке через его параметры в командной строке. Обычно библиотека дописывается в свойствах проекта.

2 - добавить в тексте программы (обычно в самом начале)такую строку:
Код:
#pragma comment(lib,"my.lib")
Что также является указанием для линкера.

Прототипы вызывающих из библиотеки функций, конечно же должны быть прописанны. Что бы избежать разных недоразумений лучше прописывать их примерно таким способом:
Код:
int __cdecl my_func_asm(int a, int b);
Сдесь явно указывается способ вызова функции как __cdecl, теперь компилятор в любом случае будет гинерировать код для вызова данной функции с использованием стандартного C-го соглашения.
Кстати, функция на asm должна использовать именно данное соглашени для получения параметров, возвращения результата и так же востанавливать после себя состояние определенных регистров.

Кстати: из этой темы получилась бы неплохая статья.
« Последнее редактирование: 15-12-2007 20:16 от Алексей1153++ » Записан
Scorp__)
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 15-12-2006 08:34 » 

Serg79, дополнение неплохое, но при объявлении прототипа придется все-таки поставить extern, иначе компилятор будет искать определение этих функций где-то рядом. А с extern он все предоставит линкеру.
Записан

- А Вы сами-то верите в привидения?
- Конечно, нет, - ответил лектор и медленно растаял в воздухе.
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 15-12-2006 08:58 » 

Конечно, если делать все по уму, то то все прототипы из библиотеки, например my_lyb.lib, заносим в файл my_lib.h и оформлям его следующим образом:
Код:
#ifndef _MY_LYB_H_
#define _MY_LYB_H_

#pragma comment(lib,"my_lib.lib")

#ifdef __cplusplus
extern "C" {
#endif

int __cdecl func_asm_1(int a, int b);
int __cdecl func_asm_2(int a, int b);

#ifdef __cplusplus
}
#endif

#endif  /* _MY_LYB_H_ */
И уже можно не заботить на чем ты пишеш, на 'C' или 'C++'.
« Последнее редактирование: 15-12-2007 20:16 от Алексей1153++ » Записан
sysh
Гость
« Ответ #5 : 15-12-2006 10:04 » 

Спасибо за советы, попробую как учите! :Улыбаюсь
Записан
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 15-12-2006 10:06 » 

Если, что не будет получаться, пиши поможем.  Ага
Записан
sysh
Гость
« Ответ #7 : 19-12-2006 13:41 » 

Что-то у меня даже при компиляции простейших файлов (на си) возникают какие-то ошибки (мне всё больше и больше нравиться ассемблер).

Не подскажете, какую версию СИ лучше использовать и где про её использование можно почитать начинающему сишнику?
Записан
Scorp__)
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 19-12-2006 20:43 » 

sysh, вообще-то можно использовать компиляторы С++. Для компиляции С исходников можно использовать ту же Visual Studio от Microsoft если это под Windows. Так что пользуйся последней версией С++ компилятора под целевую ОС.
Записан

- А Вы сами-то верите в привидения?
- Конечно, нет, - ответил лектор и медленно растаял в воздухе.
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 20-12-2006 06:13 » 

На страничке http://sbt79.narod.ru/download.html есть архив gde.zip, там описанно где взять компилятор Borland C++ Compiler. Так же показано на простом примере как им пользоваться.
Сразу предупреждаю, что данный компилятор вызывается из командной строки и не имеет никакого графического интерфейса. Но в этом есть большой плюс, поймешь принципы работы с компиляторами и научишься пользоваться такой утилитой как make.
Еще там есть компилятор ассемблера tasm32, так же от фирмы Borland, который очень хорошо уживается с Borland C++ Compiler.
Что бы удобно было с ними работать, советую скачать так же Far.

Добавлю, что данный компилятор позволяет собирать любые виды программ под Win32: консольные, оконные, сервисы. Только для оконных приложений файл ресурса (.rc) так же надо ручками набирать.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines