Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler: Windows/protected mode
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
Snak2013
0 / 0 / 1
Регистрация: 22.08.2013
Сообщений: 70
1

Ассемблерный код в C++

31.07.2017, 15:25. Просмотров 1161. Ответов 6
Метки нет (Все метки)

Пытаюсь вставить ассемблерный код в функцию C++ , компилятор ругается на ошибку
(Ошибка 3 error C2400: синтаксическая ошибка во встроенном коде на языке ассемблера в "второй операнд"; обнаружено "(" ) в строчке (CMP EAX, INVALID_HANDLE_VALUE)
Вот пример функции:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
void CALLBACK DataGrabber(PInjectData Data)
{
    DWORD BytesWritten;
    //Адрес TStringGrid.GetCells(EDX, ECX);
    PWSTR S;
    DWORD Prop;
    TPipeDataStruct SendData;
    __asm
    {
        PUSH    ESI
        PUSH    EDI
        PUSH    EBX
        PUSH    0                                  
        PUSH    0                                   
        PUSH    OPEN_EXISTING                       
        PUSH    0                                  
        MOV     EDX, FILE_SHARE_READ
        OR      EDX, FILE_SHARE_WRITE
        PUSH    EDX
        PUSH    GENERIC_WRITE      
        MOV     EBX, [Data]
        LEA     EDX, (TInjectData)[EBX].FPipeName
        PUSH    EDX                                 
        CALL (TInjectData)[EBX].FCreateFile          
        CMP     EAX, INVALID_HANDLE_VALUE           
        JZ      @@Quit                              
        MOV     ESI, EAX                            
        PUSH    0                                   
        MOV     BytesWritten, 0
        LEA     EDX, BytesWritten
        PUSH    EDX                                
        MOV     EDX, PipeDataSize
        PUSH    EDX                                
    @@Quit:
    }
}
Еще компилятору не нравится метка @@Quit. Пожалуйста подскажите что я делаю неправильно.
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.07.2017, 15:25
Ответы с готовыми решениями:

Написать ассемблерный код под мое условие
Вот есть условия для компилятора, за его критериями написать тестовую программу(просто написать...

Как просмотреть ассемблерный код программы, написанной на с++ в VS 2010
Как просмотреть ассемблерный код проги написанной на с++ в VS 2010 ? (Там вроде надо пройтись в...

Как писать чисто ассемблерный код в Visual Studio 2015 ?
Прочитал вот эту статейку https://habrahabr.ru/post/252647/ всё работает при условии, что на компе...

На каком Visual Studio можно отлаживать ассемблерный код для винды 32р
Какую Visual Studio лучше скачать?, что бы можно было пользоваться отладчиком для ассемблера,...

Перевести ассемблерный код TASM в программный код для архитектуры ARM
Необходимо программный код перевести в программный код языка ассемблер для архитектуры ARM,...

6
ФедосеевПавел
Модератор
4251 / 2340 / 940
Регистрация: 01.02.2015
Сообщений: 7,735
31.07.2017, 18:05 2
Компилятор не принимает метки, начинающиеся с @@. Поэтому замените @@Quit на другое название.

Попробуйте заменить строку
Assembler
24
        CALL (TInjectData)[EBX].FCreateFile
на
Assembler
24
25
        mov eax, (TInjectData)[EBX].FCreateFile
        CALL eax
1
Snak2013
0 / 0 / 1
Регистрация: 22.08.2013
Сообщений: 70
01.08.2017, 07:59  [ТС] 3
Спасибо за ответ с меткой все получилось но вторая ошибка к сожалению так и осталась без изменений код теперь выглядит так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
void CALLBACK DataGrabber(PInjectData Data)
{
    DWORD BytesWritten;
    //Адрес TStringGrid.GetCells(EDX, ECX);
    PWSTR S;
    DWORD Prop;
    TPipeDataStruct SendData;
    __asm
    {
        PUSH    ESI
        PUSH    EDI
        PUSH    EBX
        PUSH    0                                   
        PUSH    0                                   
        PUSH    OPEN_EXISTING                       
        PUSH    0                                  
        MOV     EDX, FILE_SHARE_READ
        OR      EDX, FILE_SHARE_WRITE
        PUSH    EDX                                 
        PUSH    GENERIC_WRITE                      
        MOV     EBX, [Data]
        LEA     EDX, (TInjectData)[EBX].FPipeName
        PUSH    EDX                                
        MOV     EAX, (TInjectData)[EBX].FCreateFile 
        CALL    EAX    //Поправил как было предложено выше ругается на строчку (CMP     EAX, INVALID_HANDLE_VALUE)
        CMP     EAX, INVALID_HANDLE_VALUE          
        JZ      Quit                              
        MOV     ESI, EAX                            
        PUSH    0                                   
        MOV     BytesWritten, 0
        LEA     EDX, BytesWritten
        PUSH    EDX                              
        MOV     EDX, PipeDataSize
        PUSH    EDX                               
    Quit:
    }
}
0
ФедосеевПавел
Модератор
4251 / 2340 / 940
Регистрация: 01.02.2015
Сообщений: 7,735
01.08.2017, 08:07 4
Тут что-то с синтаксисом косвенной адресации. Можно ещё попробовать call [eax].
И попробуйте временно закомментировать строку cmp eax,...
1
Case-Man
167 / 107 / 22
Регистрация: 02.01.2012
Сообщений: 596
01.08.2017, 08:30 5
Лучший ответ Сообщение было отмечено ФедосеевПавел как решение

Решение

Цитата Сообщение от Snak2013 Посмотреть сообщение
(Ошибка 3 error C2400: синтаксическая ошибка во встроенном коде на языке ассемблера в "второй операнд"; обнаружено "(" ) в строчке (CMP EAX, INVALID_HANDLE_VALUE)
INVALID_HANDLE_VALUE - это макрос:
C++
1
#define INVALID_HANDLE_VALUE ((HANDLE)(LONG_PTR)-1)
Представляете, что будет, когда препроцессор подставит всю эту хрень в ассемблерный код?
Поставьте просто сравнение с -1. Ну или с 0xFFFFFFFF
2
Snak2013
0 / 0 / 1
Регистрация: 22.08.2013
Сообщений: 70
01.08.2017, 09:00  [ТС] 6
Case-Man, Спасибо вроде получилось

Добавлено через 24 минуты
И в продолжение темы у меня есть ещё вопрос касательно установки значений полей структуры. В функции у меня объявлена структура (TPipeDataStruct SendData) в коде я пытаюсь задать значение полей этой структуры с использованием MOV но компилятор сообщает о недопустимом типе операнда, пытаюсь сделать так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void CALLBACK DataGrabber(PInjectData Data)
{
      DWORD BytesWritten;
    //Адрес TStringGrid.GetCells(EDX, ECX);
    PWSTR S;
    DWORD Prop;
    TPipeDataStruct SendData;
 
         __asm
        {
            MOV     SendData.FTerminate, false
        MOV     SendData.FStage, STAGE_1
        }
 
}
Я предполагаю что SendData находится вне видимости ассемблерной вставки но ее глобальное объявление так же не решило проблему. Пожалуйста подскажите где я ошибся.
0
Ethereal
5496 / 1948 / 255
Регистрация: 17.02.2013
Сообщений: 2,895
05.08.2017, 02:34 7
Вместо false воткни пока 0. Это первое.
SendData должна быть в видимости. Боюсь, что SendData для встроенного ассемблера имеет смысл не самой локальной записи SendData, а смещения этой записи во фрейме локальных переменных и надо что-то типа (SendData)[EBP].FTerminate писать, но чтобы сказать точно надо знать какой именно у тебя компилятор С++ и потрахаться с ним пять минут. Видишь ли то как встроенный ассемблер раскрывает обращения из ассемблерного кода к сущностям C++, это фишка конкретного компилятора. У разных компиляторов может быть разной. Да и другие особенности могут быть. Заранее не можно того знать. Надо посмотреть. Так-что назови точно свой компилятор. И еще как у тебя описаны false и STAGE_1 покажи.
0
05.08.2017, 02:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.08.2017, 02:34

Получить ассемблерный код исходника
Здравствуйте. Есть программка "мигающий светодиод" написанная на языке Arduino, код которой...

Как получить ассемблерный код?
Есть программа. Мне нужно получить ассемблерный код в VS 2005... как это сделать?

WinDbg Не хочет показывать ассемблерный код
Добрый день! Разбираюсь с этой утилитой. Запускаю калькулятор, цепляюсь к нему WinDbg, вижу...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru