Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Dmitrinik
531 / 387 / 49
Регистрация: 18.08.2012
Сообщений: 969
#1

Внешняя процедура на ассемблере - C++

23.12.2013, 03:29. Просмотров 617. Ответов 8
Метки нет (Все метки)

Доброй ночи! Не хочет собираться C++ (в Dev-C++) и внешняя процедура ассемблера (компилируется в отдельном файле, т.е. имею _pSr.obj). Вылезает ошибка
[Linker error] undefined reference to '_pSr'
Процедура с параметрами. Причем, если параметры убираю, все проходит нормально.
В сишном файле стандартная декларация
C++
1
2
3
4
extern "C"{
    char* _psr;   //так линкуется
//    char* __cdecl _psr(char* arr, int narr); //так - нет
}
Гуглил, конечно. По поводу этой ошибки "кто в лес, кто по дрова".
В Дельфи, во ФриПаскале никаких проблем, все работает.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
NEbO
587 / 455 / 49
Регистрация: 22.01.2009
Сообщений: 1,180
Записей в блоге: 1
Завершенные тесты: 1
23.12.2013, 03:37     Внешняя процедура на ассемблере #2
к имени функции компилятор сам очень часто добавляет знак подчеркивания в начале. попробуйте просто его убрать. если это не сработает, приведите минимальный проект (исходники си и асма), есть еще пара вопросов, но думаю что привести исходники будет проще, чем задавать и отвечать на них
abit
260 / 259 / 33
Регистрация: 03.02.2013
Сообщений: 709
23.12.2013, 03:42     Внешняя процедура на ассемблере #3
вы нам что-то не то выдали, вот я гляжу на вашу ошибку, вижу '_pSr' где этот _pStr в коде не вижу, да и вообще Ваш код - полная лажа, он ничего не делает, грамматика верна, должно компилироваться - но чего, тут пустое брюхо, где мясо? может просто вы не пролинковали соответствующий cpp?
Dmitrinik
531 / 387 / 49
Регистрация: 18.08.2012
Сообщений: 969
23.12.2013, 04:06  [ТС]     Внешняя процедура на ассемблере #4
Увы, символ подчеркивания тут ни при чем. Делал и с ним и без него. Но в Дельфи-то все без проблем

Добавлено через 20 минут
Мясо примерно такое
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string>
#include "conio.h"
#include <locale>
 
extern "C"{
    char* _psr;   //так линкуется
    char* __cdecl _psr(char* arr, int narr); //так - нет
}int main()
{
  unsigned char tr[100]; //массив
  int  ln;
  //........................
  _psr(tr,ln);
  //........................
}
А как быть, если в ассемблеровском файле несколько процедур, которые надо вызывать? И там они все объявлены как public?
abit
260 / 259 / 33
Регистрация: 03.02.2013
Сообщений: 709
23.12.2013, 04:14     Внешняя процедура на ассемблере #5
дайте код на Дельфи, а ещё лучше FPC, думаю что смогу вам перевести, fpc мой любимый язык после хаскеля, из кода, что Вы привели я нефига не понял, покажите код, то что Вы считаете рабочим под fpc или дельфи, для меня будет яснее

Добавлено через 2 минуты
хотя походу я понял суть Вашей проблемы)))
Dmitrinik
531 / 387 / 49
Регистрация: 18.08.2012
Сообщений: 969
23.12.2013, 04:20  [ТС]     Внешняя процедура на ассемблере #6
Да на Дельфи все просто. Достаточно вставить
Pascal
1
2
{$L _psr.obj}
Procedure _psr(AddrArray: Pointer; ElementSize: dword); stdcall; external;
и все готово. Я этим пользуюсь уже страшно сказать сколько лет. StdCall - передача через стек. Также не проблема сделать через регистры. Благодарю за участие. Видимо, лучше СИ ничего нет.
NEbO
587 / 455 / 49
Регистрация: 22.01.2009
Сообщений: 1,180
Записей в блоге: 1
Завершенные тесты: 1
23.12.2013, 04:34     Внешняя процедура на ассемблере #7
так. стоп. у вас MinGW (это та хрень которая вместе с Dev-C++ идет) или Visual C++ ??? Просто я не припомню чтоб _CRT_SECURE_NO_WARNINGS были в gcc.

Добавлено через 51 секунду
да собственно как и conio.h, который кажется только лишь в одном borland c++ остался...

Добавлено через 2 минуты
1.S
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
.section .rdata,"dr"
_someFmt:
    .ascii "abc %d %d\n\0"
    .text
 
    .globl  _pSt
_pSt:
    pushl   %ebp
    movl    %esp, %ebp
    pushl   $27
    pushl   $3
    pushl   $_someFmt
    calll   _printf
    leave
    ret
3.cpp
C++
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
 
extern "C"{
    __attribute__((cdecl)) void pSt();
}
 
int main() {
    pSt();
    return 0;
}
вот то, что щас вспомнил (не без gcc -S, конечно). компилируется простым
Код
gcc 3.cpp 1.S -o 1.exe
Добавлено через 6 минут
как видите, в асм файле у меня символ _pSt, а в cpp -- pSt (без подчеркивания). Однако, студийный компилятор делает, вполне вероятно, по другому. вы таблицу экспорта-то хоть посмотрели? тот же objdump, да или хоть какой-нито pe explorer плагин для тотала -- там все экспортируемые символы должны быть указаны. когда возникает ошибка линковки -- это значит какой-то символ не так себя назвал или компилятор его обработал не так как ожидалось. нужно либо найти ключик к компилятору, который будет именовать символы так, как хотите вы, либо переименовать символы в самом коде... к сожалению с visual c++ я дружу гораздо меньше, однако могу попробовать
iifat
2192 / 1345 / 98
Регистрация: 05.06.2011
Сообщений: 3,714
23.12.2013, 04:37     Внешняя процедура на ассемблере #8
Цитата Сообщение от Dmitrinik Посмотреть сообщение
undefined reference to '_pSr'
Странно как-то. В ассемблерном коде публичная точка входа _psr?

Добавлено через 2 минуты
Пока писал, уже код выложили.
Цитата Сообщение от NEbO Посмотреть сообщение
в асм файле у меня символ _pSt, а в cpp -- pSt (без подчеркивания)
В сообщении неразрешённая внешняя ссылка _psr. Значит, требуется именно она.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.12.2013, 05:19     Внешняя процедура на ассемблере
Еще ссылки по теме:

Внешняя функция C++
Внешняя сортировка C++
C++ Чем внешняя функция отличается от дружественной кроме как синтаксисом?
C++ Error LNK 2019. Внешняя библиотека DocxFactory
C++ Внешняя сортировка (файла *.csv) в С++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
NEbO
587 / 455 / 49
Регистрация: 22.01.2009
Сообщений: 1,180
Записей в блоге: 1
Завершенные тесты: 1
23.12.2013, 05:19     Внешняя процедура на ассемблере #9
visual c++:
3.cpp
C++
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
 
extern "C"{
    void __cdecl pSt();
}
 
int main() {
    pSt();
    return 0;
}
1.S -- тот же, что и выше
компиляция:
Код
cl /c 3.cpp /Fo3.obj
gcc 1.S 3.obj -o 1.exe
запускается, выводит, что должен выводить.
Yandex
Объявления
23.12.2013, 05:19     Внешняя процедура на ассемблере
Ответ Создать тему
Опции темы

Текущее время: 10:02. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru