Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > C + asm


Автор: Fedor 8.2.2006, 23:01
В общем, есть какой-то минимальный asm-модуль. Пусть он просто выводит на экран строку. Например:
Код

include macros.asm

.model small
.stack 64h
.data
    
  szTestMessage db "Test message",'$'

.code
  assume cs : @code, ds : @data, ss : @stack

  public pppp

pppp proc far
     push ds
     xor ax,ax
     push ax
     mov ax,@data
     mov ds,ax

  prints szTestMessage
ret
endp pppp
end  

Макрос prints определен в macros.asm и просто выводит строку на экран. Но это не суть важно.

Тасмом делаем из этого файла obj.

Как мне теперь использовать процедуру pppp в СPP, как подключить этот obj-файл?

Я пытался как библиотеку в опциях линковщика прицепить, но ругается.
Я как бы даже не прошу мне решение подсказать, ибо интересно самому нарыть, но просто подскажите, в какую сторону рыть, ибо я не смог составить поисковый запрос на msdn, чтоб нашло то, что мне нужно.

Использую msvc2003.


Автор: cardinal 8.2.2006, 23:17
http://vingrad.ru/VB-VB-002158
Думаю, что нужно идти в похожем направлении...

Автор: Ignat 9.2.2006, 11:19
Fedor, чем ты компилировал asm? obj файлы имеют разный формат у различных компиляторов... Если не ошибаюсь, то у мелкософта это COFF. Выходом будет компиляция тем же C-шным компилерром в asm-вставке.
__asm{
...
}

Автор: Fedor 9.2.2006, 15:55
Ignat
Цитата(Fedor @ 8.2.2006, 23:01 Найти цитируемый пост)

Тасмом делаем из этого файла obj


Асм-вставка не подходит. Нужно именно в отдельном файле.


З.Ы. Я кое-что нарыл на сырцах, буду разбиратся. Если вопросы появятся, буду задавать. Пока что спасибо за помощь smile

Автор: Ignat 9.2.2006, 16:00
сорри, не заметил, что тасм.
Fedor, кстати, возможно тасмовский obj имеет формат OMF, применяемый борландом, тогда можно попробовать компилировать борландовским bcc.

Автор: Fedor 9.2.2006, 16:17
хм. А если я хочу использовать Visual C++, то я не могу tasm-ом объектники создавать? Выход - masm?

Автор: Ignat 9.2.2006, 16:27
Цитата(Fedor @ 9.2.2006, 16:17 Найти цитируемый пост)

Выход - masm?

Теоретически да, но майкрософтовцы не сразу перешли к COFF формату. А в асмовских компиллерах я не силен.
Как вариант, можно написать весь проект в VC++, создать студией Makefile, а затем переправить его под борландовский компиллятор, он вполне корректно жует MFC со всеми её макросами. Но предварительно стоит убедиться, что bcc корректно прилинкует тасмовый obj.

Автор: Fedor 9.2.2006, 17:11
Ага. МСДН:
Цитата
LINK accepts .obj files that are either Common Object File Format (COFF) or 32-bit Object Module Format (OMF). Microsoft's Visual C++ compiler creates COFF .obj files.

LINK automatically converts 32-bit OMF objects to COFF. However, there are limitations to OMF to COFF conversions. OMF can represent some things that cannot be represented in COFF. If there are errors when the linker converts from OMF to COFF, then you will need to use COFF .obj files instead of OMF .obj files as input to the linker.


Значит, можно использовать тасмовские объектники.

Автор: Ignat 9.2.2006, 17:17
Цитата(Fedor @ 9.2.2006, 17:11 Найти цитируемый пост)

Значит, можно использовать тасмовские объектники.

Не факт smile мне не удавалось.

Цитата

If there are errors when the linker converts from OMF to COFF, then you will need to use COFF .obj files instead of OMF .obj files as input to the linker.

Переведешь?

Автор: Fedor 9.2.2006, 17:25
Цитата(Ignat @ 9.2.2006, 17:17 Найти цитируемый пост)

If there are errors when the linker converts from OMF to COFF, then you will need to use COFF .obj files instead of OMF .obj files as input to the linker.

Хм. Ну возможно, именно поэтому у меня и не получается.

Ок. Вечером скачаю masm, буду его юзать.

Автор: Ignat 9.2.2006, 17:48
Цитата(Fedor @ 9.2.2006, 17:25 Найти цитируемый пост)

Ок. Вечером скачаю masm, буду его юзать.

Результат расскажи, интересно-таки smile

Автор: Fedor 9.2.2006, 19:30
В общем, закачал MASM. Делаю объектный файл. Вроде, все ок. Файл формата coff.

Далее в вижуал студии в опциях проекта в опциях линковщика ставлю Additional Dependencies файл asm.obj.

Объявляю функцию как extern "C", вызываю ее в программе

Билдю, и вот тут линковщик ругается.
Говорит, что такой экстерн-функции нигде нету.

Автор: Ignat 9.2.2006, 19:36
Fedor, можешь скинуть мне этот obj на мыло?

Автор: Fedor 9.2.2006, 19:39
Не могу smile Ибо не знаю. В профиле не видно. smile
Леплю сюда.

Автор: Ignat 9.2.2006, 19:51
Fedor, я вообще не нашел заголовка экспортируемой функции в файле.

Автор: Fedor 9.2.2006, 20:40
В общем, в итоге виноватым оказался асм. Насколько я вижу, между тасмом и масмом есть некоторые отличия, а в масме я пока не работал, то буду с ним разбираться. Теперь насущные вопросы перестали относится к С. smile
Так что помечаем вопрос как решенный, а в случае неприятностей пойду в соотв раздел smile
Добавлено @ 20:41
Огромное спасибо Ignat за помощь.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)