Связка Ассемблер и С++

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

Ответить
ZaikinMaxim
Сообщения: 23
Зарегистрирован: 23 фев 2005, 09:18
Контактная информация:

История такая. На асме написана внешняя процедура. Заголовок такой
MODEL smal,c
STACK 256
собственно процедура
.code
тело
Использую tasm
tlink /zi ext_proc.asm
получаем ext_proc.obj

Для C++ использую Borland C++ Builder 6.0
В проект добавляю ext_proc.obj
В начале прописываю внешнюю процедуру
external "C" собственно процедура.
Проблема возникает при компиляции на Builder
Выходит ошибка я ее на изусть непомню но суть такова, что якобы, при написании процедуры использована модел памяти win16 а надо win32. В связи с этим вопрос. Как решить эту проблему ?
С уважением Заикин Максим Викторович
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Следует раздобыть 32-битный ASM компилятор, другого варианта не вижу.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
ZaikinMaxim
Сообщения: 23
Зарегистрирован: 23 фев 2005, 09:18
Контактная информация:

У меня tasm 4.1. Является ли он 32 битным. Если нет то посоветуйте пожалуйста что-нибудь, если да то как тогда решить проблемму с вот этой ошибкой
Build
[Linker Fatal Error] Fatal: Unsupported 16-bit segment(s) in module ext_proc.asm
С уважением Заикин Максим Викторович
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Не очень разбираюсь в версиях TASM'а. Совет один и очень простой: поискать рядом с tasm.exe ещё и tasm32.exe или что-либо похожее. Это и будет 32-битная версия этого компилятора. Если такой исполняемый файл отсутствует - следует искать более поздние версии ASM'a (не важно TASM, MASM, WASM, kASM и т.д.).
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Andy
Сообщения: 238
Зарегистрирован: 17 фев 2004, 08:15
Откуда: Минск

Совет один и очень простой: поискать рядом с tasm.exe ещё и tasm32.exe или что-либо похожее. Это и будет 32-битная версия этого компилятора.
Совершенно верно.
Для C++ использую Borland C++ Builder 6.0
Скорее всего там есть необходимый тебе tasm32. В каталоге bin посмотри.
Выходит ошибка я ее на изусть непомню но суть такова, что якобы, при написании процедуры использована модел памяти win16 а надо win32. В связи с этим вопрос. Как решить эту проблему ?
НИКАК. Переписать процедуру заново. Она действительно (судя по твоему коду) 16-битная. Так что с кодом билдера она никак не срастётся.
*provided AS IS
BlackWolf
Сообщения: 16
Зарегистрирован: 29 июн 2005, 18:28
Контактная информация:

За результат не ручаюсь, но попробовать стоит:
Сделай исполняемый файл, потом запусти в дебагере и в поле дамп скопируй тот участок проги, который надо вставить в си (в машинном коде). Потом в си пишешь
_asm
{
Всавляешь код
}
Попробуй, может что получится :roll:
Serg79
Сообщения: 12
Зарегистрирован: 04 июл 2005, 22:50

Все процессы и программы в ситеме Win32 выполняются в сплошном защищенном режиме модели памяти и связать между собой модель памяти "smal" и "flat" ну ни как не получится.

Используй что то подобное:

Код: Выделить всё

title Примерный шаблон функции

.386p
model flat

_TEXT segment dword public use32 'CODE'
_my_proc proc near
  ; void my_proc(unsigned short int *items, int count) //прототип в С
  push ebp
  mov ebp,esp
  push ebx
  push esi

  ;  ESI = items, EDX = count
  mov esi,[ebp+8]
  mov edx,[ebp+12]

  ;
  ; Код процедуры
  ;

  pop esi
  pop ebx
  pop ebp
  ret
_my_proc endp
_TEXT ends

public _my_proc
end
Компилятор tasm32 можно взять сдесь http://sbt79.narod.ru.
И еще, если функция должна возврашать какой то результат, возвращай его через регистр EAX(int, char и любые указатели). Если он туда не помещается то используй EAX,EBX (float, duble).

ВНИМАНИЕ: это все верно для вызовов в стиле С/С++. В стиле pascal перед выходом из функции надо востановить стек после себя в первоночальное состояние (какой он был до вызова функции).

Хорошо писать на Assembler можно научиться у того же компилятора С/С++. На Borlande это выгледит так "bcc32 -S my_prog.c", после этой команды он сгенерирует файл на асемблере из исходного С.
Lenchik
Сообщения: 3
Зарегистрирован: 22 авг 2006, 14:17

Serg79 а у интеловского С++ как будут выглядеть параметры командной строки? Хочу тут мою же собственную прожку оптимизировать по быстродействию. Полностью на ASM переписывать хлопотно очень, ошибки искать тяжело. Если в ассемблерный файл превратить, то можно частями оптимизировать. Там много данных 64 разрядных обрабатывается, ХОР и сдвиг регистра. С++ наверняка неоптимально компилирует. Попробую команды MMX применить, может получится. Модуль длинный около 1500 сишных команд.
Ответить