![]() |
|
|
![]()
|
|
| Guest_Raven |
|
|||
|
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 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: нет Всего: 18 |
Насколько я помню, надо не "Module1.asm" компоновать с *.cpp, а сначала сделать из него Module1.obj, а потом уже компоновать.
А вообще лучше делать асм-вставки в сишный (или любой другой) язык. -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
| Alex101 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 891 Регистрация: 8.4.2002 Где: Москва Репутация: нет Всего: 10 |
А там, вроде, можно проект сделать. Вот один из файлов и будет асмовский. (В BC++ до версии 3.1 так и было). Только надо, что имена асмовского, cpp-шного, и проектного файла были разными.
А так - делай отдельно два obj файла и линкуй их потом. -------------------- С уважением, А. Фролов. |
|||
|
||||
| Guest |
|
|||
|
Unregistered |
Да делал я уже так, не помогает. |
|||
|
||||
| Guest |
|
|||
|
Unregistered |
И так я тоже уже делал. |
|||
|
||||
| Guest |
|
|||
|
Unregistered |
В моём случае не покатит. |
|||
|
||||
| acp |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 389 Регистрация: 4.2.2003 Где: Владимир Репутация: нет Всего: 2 |
1. Почему объявляешь именно с подчёркиванием? Может надо без? 2. Почему как near, когда надо, как far Попробуй (IMHO глюк именно из-за 2-го)
|
||||
|
|||||
| Chingachguk |
|
||||||||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: нет Всего: 18 |
Это почему ?! Нет абсолютно никакой разницы. Объясни, почему ты считаешь, что необходимо делать именно external - и я попробую объяснить, как это можно сделать и в asm-вставке.
Кажется, сишные компилляторы всегда делают окончательные имена ф-ций с подчеркиванием. Т.е. если ты объявил в си-коде ф-цию My_Func(), то компиллятор будет искать _MyFunc().
Совсем не обязательно, можно компилить сишную программу и tiny (*.com) модели. А если это под win ?! - тогда вообще занятно получается. И еще. У каждого (ну, по крайней мере - у СИ и ПАСА) языка высокого уровня есть предопределенные имена сегментов: кода, данных. Например, я написал прогу на СИ:
Скомпиллировал ее на BC3.1 и при этом указал компиллятору генерить asm-код:
Видно, что сегментом кода, содержащим основную функцию main, является сегмент с именем TEST_TEXT. Точно так же видно, что строковые константы компиллятор разместил в объединении сегментов DGROUP. Ну и так далее - это надо учитывать при присвоении имен сегментов в asm-файле. Это сообщение отредактировал(а) Chingachguk - 21.5.2003, 08:58 -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
||||||||||
|
|||||||||||
| Guest_Raven |
|
|||
|
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 |
|
|||
|
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(); } Всё ништяк |
|||
|
||||
![]()
|
| Правила форума "Asm: Общие вопросы" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Asm: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |