Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Никак не могу состыковать C++ и ассемблер, Прошу помощи 
:(
    Опции темы
suvolod
Дата 2.5.2006, 06:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 20.8.2005

Репутация: нет
Всего: 1



У меня есть программка на Си

Код

#include <iostream.h>

int var_ext1;
extern "C" {void fnSumm (void);}

void main()
{
    cout<<var_ext1<<endl;
    fnSumm();
    cout<<var_ext1<<endl;
}


И модуль на ассемблере:

Код

.386
.model flat, C

.code
Extrn    C    var_ext1:DWORD    ;эту переменную получаем из С-модуля
Public    C    fnSumm        ;фция, которая будет видна (вызываться) из С-модуля

fnSumm    PROC    far
    mov    WORD PTR var_ext1,1234h
    mov    WORD PTR var_ext1+2,5678h
    ret
fnSumm    endp
    end

Я создаю объектный файл из ассемблерного кода, добавляю его в проект VC++ 6.0, и соответственно хочу, чтобы при вызове фции fnSumm глобальная переменная var_ext1 изменила свое значение. Однако компилятор сыплет ошибками:
1//    prim_test.obj : error LNK2001: unresolved external symbol _var_ext1. Как я понял, MASM 8, которым я создаю из asm -> obj, добавляет к каждой переменной знак подчеркивания спереди. Я долго пытался избавиться от этого знака, перерыл все настройки Masm-а, но у меня ничего не получилось smile((
//2    Тогда я попробовал этот знак подчеркивания добавить к переменной в cpp-коде, и ничего не изменилось, компилятор по прежнему плюется ошибкой «unresolved external symbol _var_ext1». Как я понимаю, var_ext1 у меня в Си-коде объявлена глобальной, а значит видна всем модулям в пределах приложения, в том числе должна быть видна и объектному модулю из asm-а, тем более что эта переменная и так там явно объявлена как Extrn
 
PM MAIL   Вверх
SergeCpp
Дата 2.5.2006, 08:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

Репутация: 1
Всего: 124



Код
extern "C"
{
    int  var_ext1;
    void fnSumm();
}

Using extern to Specify Linkage  

Это сообщение отредактировал(а) SergeCpp - 2.5.2006, 08:12
PM MAIL WWW ICQ   Вверх
suvolod
Дата 2.5.2006, 08:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 20.8.2005

Репутация: нет
Всего: 1



Нет, не работает! Точнее, теперь компилируется нормально, но выводиться исключение при попытке запустить из Cи-шного кода фцию fnSumm. 
Как я понимаю, заключив в Си-коде глобальную переменную var_ext1 в блок extern "C", мы фактически объявляем  ее внешней по отношению к данному модулю (а не делаем определение глобальной перееменной), а модификатор «С» просто дает команду не искажать имена. Соответственно все компилируется нормально, так как компилятор считает, что var_ext1 в другом модуле определена, затем при вызове fnSumm мы уже работаем непосредственно с переменной, а поскольку она внешняя и для си-модуля, и для asm-модуля, генерируется исключение, так как реального определения переменной нигде не было. 
Я хочу еще раз подчеркнуть: мне по условию задачи надо изменить глобальную переменную  var_ext1 си-шного модуля, используя фцию, релизованную на асме, которая не принимает и не возвращает никаких параметров. Фактически я пытаюсь просто разобраться, как можно «передать» переменную в asm-модуль, причем передать не в качестве параметра фции, а явно, чтобы и asm, и си-модуль реально общались с одной переменной, и чтобы изменения, произошедшие с переменной в asm-модуле, сразу же были отражены в си-модуле 
 
PM MAIL   Вверх
Chingachguk
Дата 2.5.2006, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



suvolod,

Ну объяви ее во внешнем (асм) модуле - переменную эту, а в си экспортируй ее.

А вообще что за задача такая ? Пиши "_asm {" - вставки и таких "очень интересных" проблем не будет. 


--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
SergeCpp
Дата 2.5.2006, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 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
PM MAIL WWW ICQ   Вверх
suvolod
Дата 2.5.2006, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 20.8.2005

Репутация: нет
Всего: 1



SergeCpp, все, спасибо, разобрался. Ты прав оказался, extern "C" - это действительно определение в такой записи, а вылетала программа потому, что в asm-модуле надо было вместо ret указать ближний выход RETN, так как память то плоская... 
PM MAIL   Вверх
suvolod
Дата 2.5.2006, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 20.8.2005

Репутация: нет
Всего: 1



SergeCpp, вчитался повнимательнее в твой ответ, и понял, что ты пытался объяснить совсем другое: что переменную var_ext1 в пределах блока extern "C" мы вначале объявляем (как внешнюю???), а затем определеяем в этом-же модуле ниже по коду. Попробовал твой вариант, и ничего не вышло: компилятор пишет error C2086: 'var_ext1' : redefinition.

Что-то я совсем тогда запутался - как же все-таки истолковать объявление (определение???) переменной внутри extern "C"? Сдается мне, что это все-таки определение. Ведь глобальные переменные автоматически инициализируются нулем  - а у меня это и происходит, в блоке extern "C". А раз  значение переменной очищено от мусора (равно нулю), значит все-таки имело место определение. Да и код коректно работает без повторного определения var_ext1....
 
PM MAIL   Вверх
SergeCpp
Дата 2.5.2006, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

Репутация: 1
Всего: 124



Думается, всё-таки, что в блоке

extern "C"
{
    int   var_ext1; // определение, а не объявление, как я сказал... поторопился...
    void fnSumm();
}

а вот тут

extern "C" int var_ext1; // только объявление...

Лучше всего это проверить по АСМ листингу, получающемуся в результате компиляции

вот из блока (VC6)...
Код
PUBLIC    _test
_BSS    SEGMENT
_test    DD    01H DUP (?)
_BSS    ENDS


вот из однострочного...

extern "C" int test;
MAIN.OBJ : error LNK2001: unresolved external symbol _test

Действительно, так
     

Это сообщение отредактировал(а) SergeCpp - 2.5.2006, 16:21
PM MAIL WWW ICQ   Вверх
Doc_d0s
Дата 3.5.2006, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 206
Регистрация: 15.12.2004
Где: в кресле

Репутация: нет
Всего: 3



дазассемблируй obj файлы и посмотри как функции компилятор обзывает
С по умолчанию добавляет подчеркивание 
--------------------
Админ- это вождь Apache'й :)
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1683 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.