Страница 1 из 1
Связка Ассемблер и С++
Добавлено: 09 мар 2005, 10:09
ZaikinMaxim
История такая. На асме написана внешняя процедура. Заголовок такой
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. В связи с этим вопрос. Как решить эту проблему ?
Добавлено: 09 мар 2005, 12:04
Romeo
Следует раздобыть 32-битный ASM компилятор, другого варианта не вижу.
Добавлено: 09 мар 2005, 14:35
ZaikinMaxim
У меня tasm 4.1. Является ли он 32 битным. Если нет то посоветуйте пожалуйста что-нибудь, если да то как тогда решить проблемму с вот этой ошибкой
Build
[Linker Fatal Error] Fatal: Unsupported 16-bit segment(s) in module ext_proc.asm
Добавлено: 11 мар 2005, 11:27
Romeo
Не очень разбираюсь в версиях TASM'а. Совет один и очень простой: поискать рядом с tasm.exe ещё и tasm32.exe или что-либо похожее. Это и будет 32-битная версия этого компилятора. Если такой исполняемый файл отсутствует - следует искать более поздние версии ASM'a (не важно TASM, MASM, WASM, kASM и т.д.).
Добавлено: 11 мар 2005, 23:40
Andy
Совет один и очень простой: поискать рядом с tasm.exe ещё и tasm32.exe или что-либо похожее. Это и будет 32-битная версия этого компилятора.
Совершенно верно.
Для C++ использую Borland C++ Builder 6.0
Скорее всего там есть необходимый тебе tasm32. В каталоге bin посмотри.
Выходит ошибка я ее на изусть непомню но суть такова, что якобы, при написании процедуры использована модел памяти win16 а надо win32. В связи с этим вопрос. Как решить эту проблему ?
НИКАК. Переписать процедуру заново. Она действительно (судя по твоему коду) 16-битная. Так что с кодом билдера она никак не срастётся.
Добавлено: 29 июн 2005, 18:40
BlackWolf
За результат не ручаюсь, но попробовать стоит:
Сделай исполняемый файл, потом запусти в дебагере и в поле дамп скопируй тот участок проги, который надо вставить в си (в машинном коде). Потом в си пишешь
_asm
{
Всавляешь код
}
Попробуй, может что получится :roll:
Добавлено: 05 июл 2005, 18:57
Serg79
Все процессы и программы в ситеме 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", после этой команды он сгенерирует файл на асемблере из исходного С.
Добавлено: 22 авг 2006, 15:22
Lenchik
Serg79 а у интеловского С++ как будут выглядеть параметры командной строки? Хочу тут мою же собственную прожку оптимизировать по быстродействию. Полностью на ASM переписывать хлопотно очень, ошибки искать тяжело. Если в ассемблерный файл превратить, то можно частями оптимизировать. Там много данных 64 разрядных обрабатывается, ХОР и сдвиг регистра. С++ наверняка неоптимально компилирует. Попробую команды MMX применить, может получится. Модуль длинный около 1500 сишных команд.