Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.01.2014, 12:17   #1
zla9_kolu4ka
Форумчанин
 
Регистрация: 16.09.2013
Сообщений: 149
По умолчанию не состыковывается Borland C++ и asm

Использую Borland C++
Почему в файле prim.cpp на строке
prim();
это вызов функции асма выдает ошибку
undefined simbol _prim in module primc.cpp


prim.cpp
Код:
#include <conio.h>
#include <iostream.h>
#include <limits.h>

inline  int     test(long int a)
     {return ((a>>15)+1)&~1;}

int     primC(int a, const int b, const int c, const int d)
{ double z = (2.0*a+1.0*b*c)/(d-a); 
  if (z > SHRT_MIN && z < SHRT_MAX) return z;
   else
    { cout << "\n!!!!!!!!!!! Limits of int value !!!!!!!!!!!\n  x = "
           << z << endl;
      return SHRT_MIN; //-32768
     }
 }

extern "C"
{   void prim (void);}

int X,a;

void main(void)
{   char ch;
    const b=-333;
    const c= 1000;
    const d=-10;
    long int a1;
    do {X = 0;
        //clrscr();
        cout << "\n    x=(2*a+b*c)/(d-a);  int x,a,b=-333,c=1000,d=-10;" << endl;
        do{ cout<<"\n    Enter a [-32768..32767], a!= " << d << " ====> ";
            cin>> a1; 
           }while (test(a1) || d - a1 == 0 || test (d-a1));
        a = a1;
        X = primC(a, b, c, d);
        if (X!=SHRT_MIN)
         { cout << " Result (C++) x = " << X << endl;
           X = 0;
           prim();
           cout << " Result (ASM) x = " << X << endl;
          }
        cout << "\n\nExit? - (y/n)\n";
        ch = getch();
       } while (!(ch=='y' || ch =='Y'));
}

prim.asm
Код:
        title Арифметические выражения
        model  large,C
        ; tasm PRIM.ASM /l /ml !!!!!!!!!!!!!!!!!!!!!!!!
        ; CopyRight by Голубь Н.Г., 1993-1997, 2000
        ; Пример 6.2.
        ;x=(2*a + b*c)/(d-a), d<>a !!!
        ;int x,a,b,c,d;
        CODESEG
;============= ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ
        Extrn   C X:word
        Extrn   C a:word

;=========== ЛОКАЛЬНЫЕ ПЕРЕМЕННЫЕ - КОНСТАНТЫ
b       dw      -333
c       dw      1000
d       dw      -10
;===================================================
        Public  C prim
prim    proc    far
        mov     ax,2
        Imul    a       ; <dx>:<ax>=2*a
        mov     bx,dx   ; bx <=== ст.часть (dx)
        mov     cx,ax   ; cx <=== мл.часть (ax)
        mov     ax,b
        Imul    c       ; <dx>:<ax>=b*c
        add     ax,cx   ; <ax>=<ax>+<cx>  (мл.часть)
        adc     dx,bx   ; <dx>=<dx>+<bx>  (ст.часть)
        mov     cx,d
        sub     cx,a    ; <cx>=<cx>-a
        Idiv    cx      ; <ax>=<dx>:<ax>/<cx>
        mov     X,ax
        ret
prim    endp
        end
zla9_kolu4ka вне форума Ответить с цитированием
Старый 11.01.2014, 12:40   #2
Ezhik Kihze
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 639
По умолчанию

гуглим декорирование имен функций в с++ и называем функцию с _
ICQ: 677936656 Gmail: ekEmbed@gmail.com
Ezhik Kihze вне форума Ответить с цитированием
Старый 11.01.2014, 13:13   #3
zla9_kolu4ka
Форумчанин
 
Регистрация: 16.09.2013
Сообщений: 149
По умолчанию

Цитата:
гуглим декорирование имен функций в с++ и называем функцию с _
все равно не идет
Он ищет в файле .cpp, ассемблерный файл вообще не видит

Последний раз редактировалось zla9_kolu4ka; 11.01.2014 в 13:24.
zla9_kolu4ka вне форума Ответить с цитированием
Старый 11.01.2014, 15:21   #4
FataLL
Форумчанин
 
Аватар для FataLL
 
Регистрация: 29.01.2013
Сообщений: 319
По умолчанию

А как подключен prim.asm?
FataLL вне форума Ответить с цитированием
Старый 12.01.2014, 20:38   #5
zla9_kolu4ka
Форумчанин
 
Регистрация: 16.09.2013
Сообщений: 149
По умолчанию

Код:
все равно не идет
Он ищет в файле .cpp, ассемблерный файл вообще не видит
хотя нет, видит, потому что создает .obj ассемблерного файла
Цитата:
называем функцию с _
бесполезно, назовешь с _(одной чертой), выдаст ошибку, что не нашел с __(двумя чертами)
Цитата:
А как подключен prim.asm?
никак, он и так видит, потому что создает .obj

просто функцию объявляешь так
Код:
extern "C"
{   void prim (void);}
а сам файл вроде не надо подключать

Последний раз редактировалось zla9_kolu4ka; 13.01.2014 в 00:53.
zla9_kolu4ka вне форума Ответить с цитированием
Старый 13.01.2014, 17:04   #6
FataLL
Форумчанин
 
Аватар для FataLL
 
Регистрация: 29.01.2013
Сообщений: 319
По умолчанию

zla9_kolu4ka
Смысл в том, что компилятор должен "понимать", что в поисках некоей функции ему надо просмотреть объектные файлы [в данном случае - prim.obj].
_prim [с подчёркиванием] надо назвать только в асме. В С всё так и остаётся
Код:
extern "C"
{   void prim (void);}
FataLL вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
изменить код asm x32 под asm x64 за вознаграждение Ecosasha Фриланс 2 28.11.2013 14:11
Передача параметров asm-asm Maksimall89 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 22.12.2011 11:54
unable to rename 'C:\ProgramFiles\Borland\Delphi7\Bi n\Delphi32.$$$' to 'C:\Program Files\Borland\Delphi7\ KazBoy Помощь студентам 1 12.04.2011 18:07
не могу запустить ехешник ,Borland 5 и Borland 6 error_13 Общие вопросы C/C++ 0 31.01.2010 14:04
[c++]asm Nightwalker Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 14.10.2008 19:39