Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.12.2009, 00:52   #1
Dima88
 
Регистрация: 03.12.2009
Сообщений: 5
По умолчанию Вызвать функцию ассемблера из С++

Здравствуйте. У меня проблема с ассемблером.
Задание звучит так: подсчитать сумму элементов массива в ассемблере. Сама процедура должна вызываться из С++, размер массива - параметр.
Вот что у меня по есть по асм:
Код:
.model small
.code
public _sum

   _sum proc near
                        ; Вход в функцию:
   push    EBP          ; сохраним старое значение EBP
   mov     EBP, ESP     ; определим новое значение EBP
   push    EBX          ; сохраним значения регистров EBX,
   push    ECX          ;                             ECX
   push    EDX          ;                           и EDX.
                        ;
   mov     EAX, 0       ; EAX := 0
   mov     EBX, [EBP+8] ; EBX := a(первый эл. массива)
   mov     ECX, [EBP+12]; ECX := n(кол-во эл.)
L1:                     ; метка начала цикла
   cmp     ECX, 0       ;  сравнить ECX с нулем
   jle     L2           ;  если результат  ‹  = 0,
                        ;      то перейти на метку L2
   mov     EDX, [EBX]   ;  EDX := очередной эл-т массива
   add     EAX, EDX     ;  EAX := EAX+EDX
   add     EBX, 4       ;  EBX := EBX+4 (адрес след. эл-та)
   dec     ECX          ;  ECX := ECX-1 (счетчик)
   jmp     L1           ;  перейти на метку L1
L2:                     ; метка конца цикла
                        ; ответ содержится в регистре EAX
                        ; выход из функции:
   pop EDX              ; восстановим значения EDX,
   pop ECX              ;                      ECX
   pop EBX              ;                    и EBX.
   pop EBP              ; восстановим значение EBP
   ret                  ; вернемся в вызывающую программу

   _sum endp
   end
Основной вопрос: как "склеить" .asm и .cpp? У меня на компьютере Borland C++ и TASM. Спасибо
Dima88 вне форума Ответить с цитированием
Старый 03.12.2009, 00:59   #2
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

скомпилировать программу на ассемблере в .obj и добавить её в проект c++. В исходнике C++ написать extern "C" sum(char*, int);
netrino вне форума Ответить с цитированием
Старый 03.12.2009, 14:12   #3
Dima88
 
Регистрация: 03.12.2009
Сообщений: 5
По умолчанию

Спасибо. Я упустил этот момент, пытался иначе встроить.
Dima88 вне форума Ответить с цитированием
Старый 11.12.2009, 00:54   #4
Dima88
 
Регистрация: 03.12.2009
Сообщений: 5
По умолчанию

Здравствуйте. Снова взялся за эту программу, учитывая совет, но ничего не получилось. Соединил срр и объктный файл ассемблера в проекте на борланде с++ 3.1 но ничего не получается: функция суммы не распознается, и соответственно на этом все и заканчивается.
Dima88 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вызвать отдельную функцию в длл maxrfons Общие вопросы .NET 9 31.07.2009 20:44
Как вызвать функцию? blackstersl Общие вопросы Delphi 10 07.06.2009 19:22
Вызвать адрес памяти как функцию XAOC-forever Общие вопросы Delphi 18 07.03.2009 20:32
как вызвать в Dll по указателю функцию, которая определена в главном потоке? SaintRain Общие вопросы Delphi 1 25.11.2006 08:27
как вызвать из Dll функцию, которая определена в главном потоке? SaintRain Win Api 1 23.11.2006 20:08