Народ помоги пожалуйста, у меня возникла такая проблемка, использую я Codegear RAD Studio C++ Builder Создал новое Console Apllication с параметрами: Console Application - false, MultiThreaded - true, Include VCL - false Пишу в ней код: Код (Text): void GETCPUID( void ){__asm{ PUSH EBP MOV EBP, ESP XOR ECX, ECX PUSH ECX XOR EAX, EAX PUSH EBP PUSH OFFSET @@2 @@1: CPUID MOV EBP, EAX @@2: MOV AL, [EBP-1] MOV ESP, EBP POP EBP RETN }} Возникает ошибка компиляции: Undefined Symbol: '@@2' на строке PUSH OFFSET @@2 Как с этим справится?
Не знаю как в старших версиях, но, например, билдер 6 в упор не воспринимает никаких операций взятия\получения адресов локальных меток - только джампы и колы, и ничего более Конечно не понятно нафига в приведенном коде вообще нужны и пуши, и метки, но там где действительно нужно получить адрес метки можно извратиться путем объявления асм-функций не в cpp-модуле, а в pas, т.к. все билдеры без проблем компилируют pas в hpp\cpp
а не подскажеш как это сделать? я просто этот код ввиде примера привел. да и вообще он ругается на "proc near", пришлось выводить в "void ?( void ){__asm{" как вы заметили Я просто незнаю как метки обьявлять, да ещо и к тому же с pas файлами)
Дело в том, что JMP инструкция нормально воспринимает метки, а вот PUSH инструкция выдает такое сообщение об ошибке!
Ну а я тебе что говорил - "только джампы и колы, и ничего более" ?! Такой вот "кастрированный" асм в билдере Поэтому для получения адреса метки остается либо прикручивать извращения со стандартным call+pop: Код (Text): int MyTest_Cpp(void) { __asm{ call @@2 @@2: pop eax}} либо с модулем на паскале, в котором нет этих дурных ограничений: Код (Text): //--- модуль MyPasUnit.pas --- unit MyPasUnit; interface function MyTest_Pas:integer; implementation function MyTest_Pas:integer; asm push offset @@2 @@2: pop eax end; end. //---------------------- //--- сишный модуль --- #include "MyPasUnit.hpp" int MyTest_Cpp(void) { return MyTest_Pas(); }
Спасибо, через pas модуль действительно всё работает но у меня новый вопрос на ту же тему: я создал файл test.asm Код (Text): .686p .mmx .model flat .data Var1 dd 0 .code _TEXT SEGMENT DWORD PUBLIC USE32 'CODE' PUBLIC C UserExtraInfo $UserExtraInfo SEGMENT VIRTUAL UserExtraInfo PROC C @Begin: PUSH EBP MOV EBP, ESP MOV EAX, OFFSET Var1 MOV EDX, [EBP+8] MOV ECX, 0 SLDT AX @End: POP EBP RET 4 ENDP $UserExtraInfo ENDS _TEXT ENDS end подключил его к проекту, в С++ написал Код (Text): extern "C" void UserExtraInfo( void ); При компиляции линкер выдаёт: я убрал из С++ вызов даннной функции, откомпилил, и через ollydbg просмотрел результат, в нем нет кода из test.asm, как правильно подключать .asm файлы и использовать функции описаные в них?