Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Состыковка асма с C++, Помогите!!!!!!!! 
:(
    Опции темы
Guest_Raven
  Дата 19.5.2003, 22:00 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Помогите решить одну мою проблему.

Код на асме

;Module1.asm
_text segment byte public 'code'
assume cs:_text
_SomeProc proc near
...
ret
_SomeProc endp
_text ends
public _SomeProc
end

;Module2.cpp
extern void SomeProc(void);

void main(void)
{
SomeProc();
}

Далее компонуем Module1.asm с Module2.cpp однако мой Borland C++ 5.02
выдаёт ошибку undefined symbol SomeProc in module Module2.cpp

К тому же по словам одного писателя ( Пирогова ) получается что если откомпиллировать файл со строкой void SomeProc(void){} в командной строке с ключом -S, то в получившемся асме выйдет нечто вроде
_SomeProc proc
...
_SomeProc endp
public _SomeProc
Однако мой bcc выплёвывает следующую абракадабру:
@SomeProc$qv proc
@SomeProc$qv endp
publc @SomeProc$qv

Изменение регистра символов, добавление символов @ и $, изменение
имени сегментов и модели компилляции не помогает.
Please help!!!!!!!

P.S. Заранее благодарю за любой ответ.
Raven
  Вверх
Chingachguk
Дата 20.5.2003, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Насколько я помню, надо не "Module1.asm" компоновать с *.cpp, а сначала сделать из него Module1.obj, а потом уже компоновать.

А вообще лучше делать асм-вставки в сишный (или любой другой) язык.


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


Опытный
**


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

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



А там, вроде, можно проект сделать. Вот один из файлов и будет асмовский. (В BC++ до версии 3.1 так и было). Только надо, что имена асмовского, cpp-шного, и проектного файла были разными.
А так - делай отдельно два obj файла и линкуй их потом.


--------------------
С уважением, А. Фролов.
PM MAIL ICQ   Вверх
Guest
Дата 20.5.2003, 20:48 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата(Chingachguk @ 20.5.2003, 09:46)
Насколько я помню, надо не "Module1.asm" компоновать с *.cpp, а сначала сделать из него Module1.obj, а потом уже компоновать.

А вообще лучше делать асм-вставки в сишный (или любой другой) язык.

Да делал я уже так, не помогает. sad.gif
  Вверх
Guest
Дата 20.5.2003, 20:48 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата(Alex101 @ 20.5.2003, 14:47)
А там, вроде, можно проект сделать. Вот один из файлов и будет асмовский. (В BC++ до версии 3.1 так и было). Только надо, что имена асмовского, cpp-шного, и проектного файла были разными.
А так - делай отдельно два obj файла и линкуй их потом.

И так я тоже уже делал. confused.gif
  Вверх
Guest
Дата 20.5.2003, 20:50 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата(Chingachguk @ 20.5.2003, 09:46)
А вообще лучше делать асм-вставки в сишный (или любой другой) язык.

В моём случае не покатит. mad.gif
  Вверх
acp
Дата 20.5.2003, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

;Module1.asm
_SomeProc proc near



1. Почему объявляешь именно с подчёркиванием? Может надо без?
2. Почему как near, когда надо, как far

Попробуй (IMHO глюк именно из-за 2-го)


Код

;Module1.asm
SomeProc proc far

PM WWW ICQ   Вверх
Chingachguk
Дата 21.5.2003, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата
QUOTE (Chingachguk @ 20.5.2003, 09:46)
А вообще лучше делать асм-вставки в сишный (или любой другой) язык.

В моём случае не покатит. 


Это почему ?! Нет абсолютно никакой разницы. Объясни, почему ты считаешь, что необходимо делать именно external - и я попробую объяснить, как это можно сделать и в asm-вставке.

Цитата

1. Почему объявляешь именно с подчёркиванием? Может надо без?


Кажется, сишные компилляторы всегда делают окончательные имена ф-ций с подчеркиванием. Т.е. если ты объявил в си-коде ф-цию My_Func(), то компиллятор будет искать _MyFunc().

Цитата
2. Почему как near, когда надо, как far


Совсем не обязательно, можно компилить сишную программу и tiny (*.com) модели. А если это под win ?! - тогда вообще занятно получается.

И еще. У каждого (ну, по крайней мере - у СИ и ПАСА) языка высокого уровня есть предопределенные имена сегментов: кода, данных. Например, я написал прогу на СИ:

Цитата

#include <stdio.h>
#include <conio.h>
#include <io.h>

void main( void )
{
  int i;

  clrscr();
  printf("\nStart...\n");

  for (i=0;i<10;i++)
    printf(".");

  printf("\nFinish !");
  return;
}


Скомпиллировал ее на BC3.1 и при этом указал компиллятору генерить asm-код:

Цитата

.286p
ifndef ??version
?debug macro
endm
publicdll macro name
public name
endm
endif
?debug V 300h
?debug S "TEST.C"
?debug C E9CE4E962F06544553542E43
?debug C E94019CA1819433A5C42432E3331305C494E434C5544455C535444+
?debug C 494F2E48
?debug C E94019CA1819433A5C42432E3331305C494E434C5544455C5F4445+
?debug C 46532E48
?debug C E94019CA181A433A5C42432E3331305C494E434C5544455C5F4E46+
?debug C 494C452E48
?debug C E94019CA1819433A5C42432E3331305C494E434C5544455C5F4E55+
?debug C 4C4C2E48
?debug C E94019CA1819433A5C42432E3331305C494E434C5544455C434F4E+
?debug C 494F2E48
?debug C E94019CA1816433A5C42432E3331305C494E434C5544455C494F2E+
?debug C 48
TEST_TEXT segment byte public 'CODE'
TEST_TEXT ends
DGROUP group _DATA,_BSS
assume cs:TEST_TEXT,ds:DGROUP
_DATA segment word public 'DATA'
d@ label byte
d@w label word
_DATA ends
_BSS segment word public 'BSS'
b@ label byte
b@w label word
_BSS ends
TEST_TEXT segment byte public 'CODE'
?debug C E80106544553542E43CE4E962F
  ;
  ; void main( void )
  ;
?debug L 5
assume cs:TEST_TEXT
_main proc far
?debug B
push bp
mov bp,sp
push si
?debug B
  ;
  ; {
  ;  int i;
  ;
  ;  clrscr();
  ;
?debug L 9
call far ptr _clrscr
  ;
  ;  printf("\nStart...\n");
  ;
?debug L 10
push ds
push offset DGROUP:s@
call far ptr _printf
add sp,4
  ;
  ;
  ;  for (i=0;i<10;i++)
  ;
?debug L 12
xor si,si
jmp short @1@114
@1@58:
  ;
  ;    printf(".");
  ;
?debug L 13
push ds
push offset DGROUP:s@+11
call far ptr _printf
add sp,4
?debug L 12
inc si
@1@114:
cmp si,10
jl short @1@58
  ;
  ;
  ;  printf("\nFinish !");
  ;
?debug L 15
push ds
push offset DGROUP:s@+13
call far ptr _printf
add sp,4
  ;
  ;  return;
  ;
?debug L 16
jmp short @1@170
@1@170:
  ;
  ; }
  ;
?debug L 17
pop si
pop bp
ret
?debug C E6016904040600
?debug E
?debug E
_main endp
?debug C E9
?debug C FA00000000
TEST_TEXT ends
_DATA segment word public 'DATA'
s@ label byte
db 10
db 'Start...'
db 10
db 0
db '.'
db 0
db 10
db 'Finish !'
db 0
_DATA ends
TEST_TEXT segment byte public 'CODE'
TEST_TEXT ends
public _main
extrn _clrscr:far
extrn _printf:far
_s@ equ s@
?debug C EA010C
?debug C E31800000023010400
?debug C EC055F6D61696E181800
?debug C E31900000023010400
?debug C EB075F636C727363721900
?debug C E31A00000023040401
?debug C EB075F7072696E74661A00
?debug C E60666706F735F740606000673697A655F740A06+
?debug C 00
end


Видно, что сегментом кода, содержащим основную функцию main, является сегмент с именем TEST_TEXT. Точно так же видно, что строковые константы компиллятор разместил в объединении сегментов DGROUP. Ну и так далее - это надо учитывать при присвоении имен сегментов в asm-файле.

Это сообщение отредактировал(а) Chingachguk - 21.5.2003, 08:58


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


Unregistered











1)Млин, я не хочу делать asm - вставки в код на си, т.к. си генерит много ненужной лажи. Есть такой файл c0m.asm ( или как - то так ) в котором ерунды всякой дохрена, а ещё есть файл, имени которого я не помню, дак там лажи ещё больше, и этот файл подключается к c0m.asm, а мне нужен чистый asm - код.

2)Изменял я и имя сегмента и near на far много раз и это не помогает.

3)Дальше - интереснее.

module1.cpp

#include <iostream.h>

void SomeProc(void){cout<<"Ok";}

/******************************************************************/

module2.cpp

void SomeProc(void);

void main(void)
{
SomeProc();
}

/*******************************************************************/

Если использовать командную строку, то выглядят следующие действия так.

bcc module1.cpp module2.cpp

Всё, естессьно, нормально компиллится и компонуется.
Далее генерируем ассемблерный код.

bcc -S module1.cpp -> module1.asm
bcc -S module2.cpp -> module2.asm

Теперича из асмовского кода получаем obj'ы

tasm module1.asm -> module1.obj
tasm module2.asm -> module2.obj

Прикол в следующем: если попробовать скомпоновать module1.obj c module2.obj,
то tlink не найдёт процедуру SomeProc и проблеет:

undefined symbol SomeProc in module module2.obj

Та же лажа выходит если использовать masm или bcc

хмЪ.
  Вверх
Unregistered
Дата 21.5.2003, 11:47 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Всё чуваки, я решил эу проблему следующим образом:

module1.asm

maincode segment
assume cs:maincode
public _SomeProc
_SomeProc proc
_SomeProc endp
maincode ends

module2.cpp

extern"C"
{
void SomeProc(void);
}
void main(void)
{
SomeProc();
}

Всё ништяк smile.gif
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

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

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


 




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


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

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