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

gcc в c++ VS - C++

Восстановить пароль Регистрация
 
karaulov2
0 / 0 / 0
Регистрация: 05.12.2012
Сообщений: 59
01.03.2013, 19:19     gcc в c++ VS #1
C++
1
2
3
4
5
6
7
8
void MakeStrRef(RCString* sref,char* data){
    asm("pushl %%eax\n"
        "call %%edx"
        :
        :"a"(data),"c"(sref),"d"(GameBase+0x011300)
        :
        );
}
как это заставить работать в C++ ? ("конвертировать" из gcc)

пишет asm отключен.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.03.2013, 19:19     gcc в c++ VS
Посмотрите здесь:

C++ gcc VS DEV-C++ 4.9.9.2
Компиляция (gcc) C++
g++/gcc не компилирует C++
gcc компиляция C++
C++ Глюк gcc?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vua72
410 / 410 / 83
Регистрация: 28.11.2010
Сообщений: 1,158
01.03.2013, 19:32     gcc в c++ VS #2
http://ru.wikibooks.org/wiki/Ассембл...рограммистов_C
http://www.iakovlev.org/index.html?p=1483&m=1
karaulov2
0 / 0 / 0
Регистрация: 05.12.2012
Сообщений: 59
01.03.2013, 19:37  [ТС]     gcc в c++ VS #3
первая ссылка не работает, вторую не стал читал, так как мне нужно только переписать этот код что бы работал в VS 2010 C++ , GCC изучать не хочется ради пару строк кода
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
01.03.2013, 19:46     gcc в c++ VS #4
Используйте ключевое слово __asm
karaulov2
0 / 0 / 0
Регистрация: 05.12.2012
Сообщений: 59
01.03.2013, 19:54  [ТС]     gcc в c++ VS #5
Цитата Сообщение от palva Посмотреть сообщение
Используйте ключевое слово __asm
C++
1
2
3
4
5
1>d:\projects\whack4\raihack.cpp(28): error C2400: синтаксическая ошибка во встроенном коде на языке ассемблера в "код операции"; обнаружено "bad token"
1>d:\projects\whack4\raihack.cpp(29): error C2400: синтаксическая ошибка во встроенном коде на языке ассемблера в "код операции"; обнаружено "bad token"
1>d:\projects\whack4\raihack.cpp(30): error C2400: синтаксическая ошибка во встроенном коде на языке ассемблера в "код операции"; обнаружено ":"
1>d:\projects\whack4\raihack.cpp(31): error C2400: синтаксическая ошибка во встроенном коде на языке ассемблера в "код операции"; обнаружено ":"
1>d:\projects\whack4\raihack.cpp(32): error C2400: синтаксическая ошибка во встроенном коде на языке ассемблера в "код операции"; обнаружено ":"
RibGeDx
 Аватар для RibGeDx
3 / 3 / 0
Регистрация: 11.05.2012
Сообщений: 38
01.03.2013, 20:50     gcc в c++ VS #6
Попробуйте:

C++
1
2
3
4
5
6
7
8
void MakeStrRef(RCString* sref,char* data){
    __asm 
    { 
      pushl eax
      call edx
      a(data), c(sref), d(GameBase+0x011300) //тут я хз, что это за фигня.. Может не работать )
    }
}
karaulov2
0 / 0 / 0
Регистрация: 05.12.2012
Сообщений: 59
01.03.2013, 21:25  [ТС]     gcc в c++ VS #7
C++
1
2
3
file.cpp(31): warning C4405: eax: идентификатор является зарезервированным словом
file.cpp(31) error C2400: синтаксическая ошибка во встроенном коде на языке ассемблера в "код операции"; обнаружено "eax"
file.cpp(33) error C2400: синтаксическая ошибка во встроенном коде на языке ассемблера в "код операции"; обнаружено "("
ну уже ошибок меньше но все равно не работает

( GameBase это 6F000000 , оффсет в игре,а MakeStrRef должна создавать RCString(игровой текст) из обычного текста )
vua72
01.03.2013, 21:26
  #8

Не по теме:

RibGeDx, не прокатит, а с d -- синонимы регистров, но, т.к. автор не желает прочитать теорию, то и время на решение его проблемы тоже не стоит тратить.

Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
01.03.2013, 21:26     gcc в c++ VS #9
Цитата Сообщение от karaulov2 Посмотреть сообщение
ну уже ошибок меньше но все равно не работает
pushl - это AT&T синтаксис. В синтаксисе Intel пишется просто push.
А вот inline gcc assembler - это не просто AT&T, тут уже сложнее, я честно говоря его не знаю, но можно прочитать то, что советуют, и разобраться.
karaulov2
0 / 0 / 0
Регистрация: 05.12.2012
Сообщений: 59
01.03.2013, 22:13  [ТС]     gcc в c++ VS #10
толку мне читать если я и в c++ не знаю, вообще асемблер не изучал.

это мне что бы переписать несколько строк нужно будет неделю учить эти синтаксисы и т.п


может кто поможет это переписать в VS c++ ?
Кликните здесь для просмотра всего текста
(т.е перепишет ?? )
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
01.03.2013, 22:18     gcc в c++ VS #11
если ты на словах объяснишь, что нужно сделать, то можно просто свой код на синтаксисе Intel написать.
karaulov2
0 / 0 / 0
Регистрация: 05.12.2012
Сообщений: 59
01.03.2013, 22:21  [ТС]     gcc в c++ VS #12
написал так:

C++
1
2
3
4
5
6
7
8
__declspec(naked) void __cdecl MakeCJassString(CJassString* sref,char* data){
    _asm
    {
        mov eax, g_GameDllAddress
        add eax, 0x011300
        jmp eax
    }
}
но что-то не очень работает т.е работает но почему-то прога в цикл входит (функция которая вызывает эту начинает выполнятся по 100500 раз )

Добавлено через 1 минуту
Цитата Сообщение от karaulov2 Посмотреть сообщение
( GameBase это 6F000000 базовый адресс Game.dll , 0x011300 - оффсет где находится процедура,а MakeStrRef должна создавать RCString(игровой текст) из обычного текста )
(, короче вызывает функцию(процедуру\) в памяти процесса вроде , которая создает RCString из обычного текста)
принимает 2 аргумента возвращает 0 , находится обычно тут: 6F011300.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
01.03.2013, 22:28     gcc в c++ VS #13
Цитата Сообщение от karaulov2 Посмотреть сообщение
т.е работает но почему-то прога в цикл входит (функция которая вызывает эту начинает выполнятся по 100500 раз )
Вместо jmp напиши call. Долго объяснять в чем дело, но если вызов этой функции происходит бесконечно, то значит все работает правильно. Когда на call заменишь такого не будет.

Добавлено через 1 минуту
Эмм, а в первом посте еще что-то в стек кладется (т.е. вызываемая ф-ция с аргументами).
karaulov2
0 / 0 / 0
Регистрация: 05.12.2012
Сообщений: 59
01.03.2013, 22:56  [ТС]     gcc в c++ VS #14
(было
C++
1
2
3
4
5
6
7
8
void MakeStrRef(RCString* sref,char* data){
    asm("pushl %%eax\n"
        "call %%edx"
        :
        :"a"(data),"c"(sref),"d"(GameBase+0x011300)
        :
        );
}
)

C++
1
2
3
4
5
6
7
8
__declspec(naked) void __cdecl MakeCJassString(CJassString* sref,char* data){
    _asm
    {
        mov eax, g_GameDllAddress
        add eax, 0x011300
        call eax
    }
}
тот же цикл (в цикл попадает функция которая вызывает MakeCJassString) ну и MakeCJassString не выполняет нужные действия

а как правильно записать?

Добавлено через 10 минут
написал:
C++
1
2
3
4
5
6
7
8
void  MakeCJassString(CJassString* sref,char* data){
    _asm
    {
        mov eax, sref 
        mov ecx, data
        call g_GameDllAddress+0x011300
    }
}
цикл стал работать в 2 раза быстрее

но все равно не работает

Добавлено через 13 минут
вот с cheatengine скриншот:
http://screenshot.su/img/73/38/38/73...4b2b23e73f.jpg
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
01.03.2013, 22:58     gcc в c++ VS #15
Я не пойму - почему нельзя вызвать ф-цию из .dll на языке С? зачем заморочки с ассемблером?
karaulov2
0 / 0 / 0
Регистрация: 05.12.2012
Сообщений: 59
01.03.2013, 23:04  [ТС]     gcc в c++ VS #16
Цитата Сообщение от Kastaneda Посмотреть сообщение
Я не пойму - почему нельзя вызвать ф-цию из .dll на языке С? зачем заморочки с ассемблером?

ее там просто нет, там какие-то native функции все
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
01.03.2013, 23:11     gcc в c++ VS #17
Ну а почему бы не создать указатель на функцию с нужными аргументами, присвоить ему значение g_GameDllAddress+0x011300 и вызвать функцию через указатель?
karaulov2
0 / 0 / 0
Регистрация: 05.12.2012
Сообщений: 59
01.03.2013, 23:12  [ТС]     gcc в c++ VS #18
все, нашел в интернете решение:

C++
1
2
3
4
5
6
7
8
9
10
11
12
void GetJassString(char *szString, JassString *String)
{
    DWORD Address = GameDll + 0x011300;
 
 
    __asm
    {
        PUSH szString;
        MOV ECX, String;
        CALL Address;
    }
}
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
01.03.2013, 23:30     gcc в c++ VS #19
Цитата Сообщение от Kastaneda Посмотреть сообщение
Ну а почему бы не создать указатель на функцию с нужными аргументами, присвоить ему значение g_GameDllAddress+0x011300 и вызвать функцию через указатель?
Ну судя по посту №18, там очень криворукокостыльный специфичный ABI. Так что действительно надо писать ассемблером.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.03.2013, 23:43     gcc в c++ VS
Еще ссылки по теме:

Компиляция gcc C++
GotoXY в GCC C++

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

Или воспользуйтесь поиском по форуму:
Kastaneda
01.03.2013, 23:43     gcc в c++ VS
  #20

Не по теме:

Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Ну судя по посту №18, там очень специфичный ABI. Так что действительно надо писать ассемблером.
ну да, я хотел написать, про странность передачи аргумента на регистре (при чем только одного), но мне влом было Похоже библиотеку тоже на асме писали, или использовали какой-то специфичный компилятор.

Yandex
Объявления
01.03.2013, 23:43     gcc в c++ VS
Ответ Создать тему
Опции темы

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