Связка Ассемблер и С++
Модератор: Andy
-
- Сообщения: 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. В связи с этим вопрос. Как решить эту проблему ?
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" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
-
- Сообщения: 23
- Зарегистрирован: 23 фев 2005, 09:18
- Контактная информация:
У меня tasm 4.1. Является ли он 32 битным. Если нет то посоветуйте пожалуйста что-нибудь, если да то как тогда решить проблемму с вот этой ошибкой
Build
[Linker Fatal Error] Fatal: Unsupported 16-bit segment(s) in module ext_proc.asm
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" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Совершенно верно.Совет один и очень простой: поискать рядом с tasm.exe ещё и tasm32.exe или что-либо похожее. Это и будет 32-битная версия этого компилятора.
Скорее всего там есть необходимый тебе tasm32. В каталоге bin посмотри.Для C++ использую Borland C++ Builder 6.0
НИКАК. Переписать процедуру заново. Она действительно (судя по твоему коду) 16-битная. Так что с кодом билдера она никак не срастётся.Выходит ошибка я ее на изусть непомню но суть такова, что якобы, при написании процедуры использована модел памяти win16 а надо win32. В связи с этим вопрос. Как решить эту проблему ?
*provided AS IS
За результат не ручаюсь, но попробовать стоит:
Сделай исполняемый файл, потом запусти в дебагере и в поле дамп скопируй тот участок проги, который надо вставить в си (в машинном коде). Потом в си пишешь
_asm
{
Всавляешь код
}
Попробуй, может что получится :roll:
Сделай исполняемый файл, потом запусти в дебагере и в поле дамп скопируй тот участок проги, который надо вставить в си (в машинном коде). Потом в си пишешь
_asm
{
Всавляешь код
}
Попробуй, может что получится :roll:
Все процессы и программы в ситеме Win32 выполняются в сплошном защищенном режиме модели памяти и связать между собой модель памяти "smal" и "flat" ну ни как не получится.
Используй что то подобное:
Компилятор tasm32 можно взять сдесь http://sbt79.narod.ru.
И еще, если функция должна возврашать какой то результат, возвращай его через регистр EAX(int, char и любые указатели). Если он туда не помещается то используй EAX,EBX (float, duble).
ВНИМАНИЕ: это все верно для вызовов в стиле С/С++. В стиле pascal перед выходом из функции надо востановить стек после себя в первоночальное состояние (какой он был до вызова функции).
Хорошо писать на Assembler можно научиться у того же компилятора С/С++. На Borlande это выгледит так "bcc32 -S my_prog.c", после этой команды он сгенерирует файл на асемблере из исходного С.
Используй что то подобное:
Код: Выделить всё
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
И еще, если функция должна возврашать какой то результат, возвращай его через регистр EAX(int, char и любые указатели). Если он туда не помещается то используй EAX,EBX (float, duble).
ВНИМАНИЕ: это все верно для вызовов в стиле С/С++. В стиле pascal перед выходом из функции надо востановить стек после себя в первоночальное состояние (какой он был до вызова функции).
Хорошо писать на Assembler можно научиться у того же компилятора С/С++. На Borlande это выгледит так "bcc32 -S my_prog.c", после этой команды он сгенерирует файл на асемблере из исходного С.
Serg79 а у интеловского С++ как будут выглядеть параметры командной строки? Хочу тут мою же собственную прожку оптимизировать по быстродействию. Полностью на ASM переписывать хлопотно очень, ошибки искать тяжело. Если в ассемблерный файл превратить, то можно частями оптимизировать. Там много данных 64 разрядных обрабатывается, ХОР и сдвиг регистра. С++ наверняка неоптимально компилирует. Попробую команды MMX применить, может получится. Модуль длинный около 1500 сишных команд.