Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
539 / 399 / 99
Регистрация: 18.08.2012
Сообщений: 1,024

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

23.12.2013, 03:29. Показов 2302. Ответов 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); //так - нет
}
Гуглил, конечно. По поводу этой ошибки "кто в лес, кто по дрова".
В Дельфи, во ФриПаскале никаких проблем, все работает.
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.12.2013, 03:29
Ответы с готовыми решениями:

Ассемблер и C++, внешняя подпрограмма на ассемблере
Приведите простой пример программы на C++, в которой будет вызываться программа на Ассемблере (masm). Попробовал сделать ассемблерную...

Внешняя процедура
Добрый день! Возник вопрос, не могу разобраться в ситуации. В длл есть процедура SetCallbackInterface(Proc: Pointer; Buf:Pointer);...

Внешняя процедура
Можно на примере показать как запустить внешнюю процедуру.. Напрмер в справочнике Сотрудники я нажимаю кнопку "Внешняя"(в поле...

8
601 / 468 / 73
Регистрация: 22.01.2009
Сообщений: 1,180
Записей в блоге: 1
23.12.2013, 03:37
к имени функции компилятор сам очень часто добавляет знак подчеркивания в начале. попробуйте просто его убрать. если это не сработает, приведите минимальный проект (исходники си и асма), есть еще пара вопросов, но думаю что привести исходники будет проще, чем задавать и отвечать на них
1
 Аватар для abit
870 / 529 / 149
Регистрация: 03.02.2013
Сообщений: 1,848
23.12.2013, 03:42
вы нам что-то не то выдали, вот я гляжу на вашу ошибку, вижу '_pSr' где этот _pStr в коде не вижу, да и вообще Ваш код - полная лажа, он ничего не делает, грамматика верна, должно компилироваться - но чего, тут пустое брюхо, где мясо? может просто вы не пролинковали соответствующий cpp?
0
539 / 399 / 99
Регистрация: 18.08.2012
Сообщений: 1,024
23.12.2013, 04:06  [ТС]
Увы, символ подчеркивания тут ни при чем. Делал и с ним и без него. Но в Дельфи-то все без проблем

Добавлено через 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?
0
 Аватар для abit
870 / 529 / 149
Регистрация: 03.02.2013
Сообщений: 1,848
23.12.2013, 04:14
дайте код на Дельфи, а ещё лучше FPC, думаю что смогу вам перевести, fpc мой любимый язык после хаскеля, из кода, что Вы привели я нефига не понял, покажите код, то что Вы считаете рабочим под fpc или дельфи, для меня будет яснее

Добавлено через 2 минуты
хотя походу я понял суть Вашей проблемы)))
0
539 / 399 / 99
Регистрация: 18.08.2012
Сообщений: 1,024
23.12.2013, 04:20  [ТС]
Да на Дельфи все просто. Достаточно вставить
Pascal
1
2
{$L _psr.obj}
Procedure _psr(AddrArray: Pointer; ElementSize: dword); stdcall; external;
и все готово. Я этим пользуюсь уже страшно сказать сколько лет. StdCall - передача через стек. Также не проблема сделать через регистры. Благодарю за участие. Видимо, лучше СИ ничего нет.
0
601 / 468 / 73
Регистрация: 22.01.2009
Сообщений: 1,180
Записей в блоге: 1
23.12.2013, 04:34
так. стоп. у вас 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, конечно). компилируется простым
Code
1
gcc 3.cpp 1.S -o 1.exe
Добавлено через 6 минут
как видите, в асм файле у меня символ _pSt, а в cpp -- pSt (без подчеркивания). Однако, студийный компилятор делает, вполне вероятно, по другому. вы таблицу экспорта-то хоть посмотрели? тот же objdump, да или хоть какой-нито pe explorer плагин для тотала -- там все экспортируемые символы должны быть указаны. когда возникает ошибка линковки -- это значит какой-то символ не так себя назвал или компилятор его обработал не так как ожидалось. нужно либо найти ключик к компилятору, который будет именовать символы так, как хотите вы, либо переименовать символы в самом коде... к сожалению с visual c++ я дружу гораздо меньше, однако могу попробовать
0
2899 / 1933 / 209
Регистрация: 05.06.2011
Сообщений: 5,689
23.12.2013, 04:37
Цитата Сообщение от Dmitrinik Посмотреть сообщение
undefined reference to '_pSr'
Странно как-то. В ассемблерном коде публичная точка входа _psr?

Добавлено через 2 минуты
Пока писал, уже код выложили.
Цитата Сообщение от NEbO Посмотреть сообщение
в асм файле у меня символ _pSt, а в cpp -- pSt (без подчеркивания)
В сообщении неразрешённая внешняя ссылка _psr. Значит, требуется именно она.
0
601 / 468 / 73
Регистрация: 22.01.2009
Сообщений: 1,180
Записей в блоге: 1
23.12.2013, 05:19
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 -- тот же, что и выше
компиляция:
Code
1
2
cl /c 3.cpp /Fo3.obj
gcc 1.S 3.obj -o 1.exe
запускается, выводит, что должен выводить.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.12.2013, 05:19
Помогаю со студенческими работами здесь

Процедура на ассемблере
Здравствуйте! Напишите, пожалуйста, комментарии к коду на ассемблере. Процедура написана для программы на Паскале. procedure...

Внешняя процедура, выполняющая сложение двух чисел (передача параметров через стек)
Помогите, пожалуйста!!!! Написать прорамму с внешней процедурой, выполняющую сложение 2 чисел с передачей параметров процедуры через стэк.

Процедура ПередЗаписью и Процедура ПередЗаписьюНаСервере
В документе после нажатия на кнопку Провести и закрыть надо запросить информацию у пользователя : «Количество оборудования введено верно?»...

Внешняя нормаль
Добрый день! Объясните, пожалуйста, каким образом можно определить, что нормаль является внешней (алгоритм Робертса). Внешняя...

Внешняя обработка
1С Предприятие 8.2 Как из внешней обработки создать элемент в корень какого-нибудь справочника? (В справочнике уже записано какое-то...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru