![]() |
|
|
![]()
|
|
| suvolod |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 20.8.2005 Репутация: нет Всего: 1 |
У меня есть программка на Си
И модуль на ассемблере:
Я создаю объектный файл из ассемблерного кода, добавляю его в проект VC++ 6.0, и соответственно хочу, чтобы при вызове фции fnSumm глобальная переменная var_ext1 изменила свое значение. Однако компилятор сыплет ошибками: 1// prim_test.obj : error LNK2001: unresolved external symbol _var_ext1. Как я понял, MASM 8, которым я создаю из asm -> obj, добавляет к каждой переменной знак подчеркивания спереди. Я долго пытался избавиться от этого знака, перерыл все настройки Masm-а, но у меня ничего не получилось //2 Тогда я попробовал этот знак подчеркивания добавить к переменной в cpp-коде, и ничего не изменилось, компилятор по прежнему плюется ошибкой «unresolved external symbol _var_ext1». Как я понимаю, var_ext1 у меня в Си-коде объявлена глобальной, а значит видна всем модулям в пределах приложения, в том числе должна быть видна и объектному модулю из asm-а, тем более что эта переменная и так там явно объявлена как Extrn |
||||
|
|||||
| SergeCpp |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 955 Регистрация: 8.8.2005 Где: At Home Репутация: 1 Всего: 124 |
Using extern to Specify Linkage Это сообщение отредактировал(а) SergeCpp - 2.5.2006, 08:12 |
|||
|
||||
| suvolod |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 20.8.2005 Репутация: нет Всего: 1 |
Нет, не работает! Точнее, теперь компилируется нормально, но выводиться исключение при попытке запустить из Cи-шного кода фцию fnSumm.
Как я понимаю, заключив в Си-коде глобальную переменную var_ext1 в блок extern "C", мы фактически объявляем ее внешней по отношению к данному модулю (а не делаем определение глобальной перееменной), а модификатор «С» просто дает команду не искажать имена. Соответственно все компилируется нормально, так как компилятор считает, что var_ext1 в другом модуле определена, затем при вызове fnSumm мы уже работаем непосредственно с переменной, а поскольку она внешняя и для си-модуля, и для asm-модуля, генерируется исключение, так как реального определения переменной нигде не было. Я хочу еще раз подчеркнуть: мне по условию задачи надо изменить глобальную переменную var_ext1 си-шного модуля, используя фцию, релизованную на асме, которая не принимает и не возвращает никаких параметров. Фактически я пытаюсь просто разобраться, как можно «передать» переменную в asm-модуль, причем передать не в качестве параметра фции, а явно, чтобы и asm, и си-модуль реально общались с одной переменной, и чтобы изменения, произошедшие с переменной в asm-модуле, сразу же были отражены в си-модуле |
|||
|
||||
| Chingachguk |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: нет Всего: 18 |
suvolod,
Ну объяви ее во внешнем (асм) модуле - переменную эту, а в си экспортируй ее. А вообще что за задача такая ? Пиши "_asm {" - вставки и таких "очень интересных" проблем не будет. -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
| SergeCpp |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 955 Регистрация: 8.8.2005 Где: At Home Репутация: 1 Всего: 124 |
extern "C"
{ int var_ext1; // declaration void fnSumm(); } int var_ext1; // definition The extern keyword declares a variable or function... When modifying a variable, extern specifies that the variable has static duration (it is allocated when the program begins and deallocated when the program ends). The variable or function may be defined in another source file, or later in the same file. Это сообщение отредактировал(а) SergeCpp - 2.5.2006, 10:47 |
|||
|
||||
| suvolod |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 20.8.2005 Репутация: нет Всего: 1 |
SergeCpp, все, спасибо, разобрался. Ты прав оказался, extern "C" - это действительно определение в такой записи, а вылетала программа потому, что в asm-модуле надо было вместо ret указать ближний выход RETN, так как память то плоская...
|
|||
|
||||
| suvolod |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 20.8.2005 Репутация: нет Всего: 1 |
SergeCpp, вчитался повнимательнее в твой ответ, и понял, что ты пытался объяснить совсем другое: что переменную var_ext1 в пределах блока extern "C" мы вначале объявляем (как внешнюю???), а затем определеяем в этом-же модуле ниже по коду. Попробовал твой вариант, и ничего не вышло: компилятор пишет error C2086: 'var_ext1' : redefinition.
Что-то я совсем тогда запутался - как же все-таки истолковать объявление (определение???) переменной внутри extern "C"? Сдается мне, что это все-таки определение. Ведь глобальные переменные автоматически инициализируются нулем - а у меня это и происходит, в блоке extern "C". А раз значение переменной очищено от мусора (равно нулю), значит все-таки имело место определение. Да и код коректно работает без повторного определения var_ext1.... |
|||
|
||||
| SergeCpp |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 955 Регистрация: 8.8.2005 Где: At Home Репутация: 1 Всего: 124 |
Думается, всё-таки, что в блоке
extern "C" { int var_ext1; // определение, а не объявление, как я сказал... поторопился... void fnSumm(); } а вот тут extern "C" int var_ext1; // только объявление... Лучше всего это проверить по АСМ листингу, получающемуся в результате компиляции вот из блока (VC6)...
вот из однострочного... extern "C" int test; MAIN.OBJ : error LNK2001: unresolved external symbol _test Действительно, так Это сообщение отредактировал(а) SergeCpp - 2.5.2006, 16:21 |
|||
|
||||
| Doc_d0s |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 206 Регистрация: 15.12.2004 Где: в кресле Репутация: нет Всего: 3 |
дазассемблируй obj файлы и посмотри как функции компилятор обзывает
С по умолчанию добавляет подчеркивание --------------------
Админ- это вождь Apache'й :) |
|||
|
||||
![]()
|
| Правила форума "Asm: Общие вопросы" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Asm: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |