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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 56, средняя оценка - 4.70
Skirmisher
44 / 44 / 0
Регистрация: 23.05.2009
Сообщений: 92
#1

__asm вставка - C++

01.08.2009, 22:34. Просмотров 6859. Ответов 43
Метки нет (Все метки)

Есть проблема с асм-вставкой нужно возвратить значение в регистр eax.

Проблема написать аналог макроса на С++.
Assembler
1
2
3
4
5
6
7
8
      alloc MACRO bytecount
        invoke GlobalAlloc,GMEM_FIXED or GMEM_ZEROINIT,bytecount
        EXITM <eax>
      ENDM
 
      free MACRO hmemory
        invoke GlobalFree,hmemory
      ENDM
Мой вариант макроса, но он не компилится(.
C++
1
2
3
#include "windows.h"
...
#define alloc(bytecount) (GlobalAlloc((GMEM_FIXED || GMEM_ZEROINIT), sizeof(bytecount));return __asm{<eax>}) //не работает(
C++
1
#define free(hmemory) (GlobalFree(hmemory)) //работает
Добавлено через 5 часов 13 минут 58 секунд
Есть специалисты по С и Ассемблеру помогите или дайте идейку, если не хочется помогать.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.08.2009, 22:34     __asm вставка
Посмотрите здесь:

Ошибка в __asm вставке - C++
class Updater{ public: DWORD baseAddress; }; class System { public:

C++ __asm Как начать? - C++
Добрый день, Подскажите как начать использовать вставки __asm{} У меня Visual Studio 2012 Хотел написать простенькую...

__asm вставки (процессор Pentium) - C++
Пишу в вижуал Студии, делаю ассемблерные вставки, хочу вызывать си-процедуру, в которой тоже ассемблер - просто поменять значение одного...

Обнулить элементы вектора через __asm - C++
Хочу обнулить элементы вектора через __asm #include &lt;vector&gt; #include &lt;iostream&gt; using namespace std; void main() { ...

__asm ошибка Access violation writing location - C++
Код ниже выводит следующую ошибку &quot;Unhandled exception at 0x004116a7 in cousach.exe: 0xC0000005: Access violation reading location...

Вернуть адрес виртуальной функции с помощью __asm вставки - C++
Есть: class two{ public: }; class one{

Нужно вставить блок на асме, но он не понимает asm и __asm - C++
VC понимает директиву __asm, я пишу в данное время под Linux c компилером g++ v.3.0 нужно вставить блок на асме... Но он не понимает...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
M128K145
Эксперт С++
8283 / 3502 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
02.08.2009, 01:06     __asm вставка #21
Да причем здесь не сразу поняли? Создай макрос с именем main к примеру и сразу поймеш что такое конфликт имен.
Lolcht0
123 / 121 / 5
Регистрация: 30.03.2009
Сообщений: 766
02.08.2009, 01:11     __asm вставка #22
причем тут конфликт имен? ну переопределится free, и что? http://codepad.org/Y8zoV3Br

всю жизнь к битам применялись битовые операции)
Skirmisher
44 / 44 / 0
Регистрация: 23.05.2009
Сообщений: 92
02.08.2009, 01:14  [ТС]     __asm вставка #23
Код на ассемблере
Assembler
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
38
39
40
41
42
43
44
      alloc MACRO bytecount
        invoke GlobalAlloc,GMEM_FIXED or GMEM_ZEROINIT,bytecount
        EXITM <eax>
      ENDM
 
    mov eax, alloc(128)
    push eax
 
    mov DWORD PTR [eax],   103
    mov DWORD PTR [eax+4], 101
    mov DWORD PTR [eax+8],  97
    mov DWORD PTR [eax+12], 91
    mov DWORD PTR [eax+16], 89
    mov DWORD PTR [eax+20], 87
    mov DWORD PTR [eax+24], 83
    mov DWORD PTR [eax+28], 79
    mov DWORD PTR [eax+32], 73
    mov DWORD PTR [eax+36], 71
    mov DWORD PTR [eax+36], 67
    mov DWORD PTR [eax+40], 61
    mov DWORD PTR [eax+44], 59
    mov DWORD PTR [eax+48], 57
    mov DWORD PTR [eax+52], 53
    mov DWORD PTR [eax+56], 51
    mov DWORD PTR [eax+60], 47
    mov DWORD PTR [eax+64], 43
    mov DWORD PTR [eax+68], 41
    mov DWORD PTR [eax+72], 39
    mov DWORD PTR [eax+76], 37
    mov DWORD PTR [eax+80], 31
    mov DWORD PTR [eax+84], 29
    mov DWORD PTR [eax+88], 23
    mov DWORD PTR [eax+92], 19
    mov DWORD PTR [eax+96], 17
    mov DWORD PTR [eax+100], 13
    mov DWORD PTR [eax+104], 11
    mov DWORD PTR [eax+108], 7
    mov DWORD PTR [eax+112], 5
    mov DWORD PTR [eax+116], 2
    mov DWORD PTR [eax+120], 1
 
    pop eax
 
    ret

Код на C++
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
38
39
40
41
42
43
44
#define alloc(bytecount) (GlobalAlloc((GMEM_FIXED | GMEM_ZEROINIT), bytecount);return)
//#define free(hmemory) (GlobalFree(hmemory))
    __asm
    {
            mov eax, alloc(128)   //error C2400
            push eax
 
            mov DWORD PTR [eax],   103
            mov DWORD PTR [eax+4], 101
            mov DWORD PTR [eax+8],  97
            mov DWORD PTR [eax+12], 91
            mov DWORD PTR [eax+16], 89
            mov DWORD PTR [eax+20], 87
            mov DWORD PTR [eax+24], 83
            mov DWORD PTR [eax+28], 79
            mov DWORD PTR [eax+32], 73
            mov DWORD PTR [eax+36], 71
            mov DWORD PTR [eax+36], 67
            mov DWORD PTR [eax+40], 61
            mov DWORD PTR [eax+44], 59
            mov DWORD PTR [eax+48], 57
            mov DWORD PTR [eax+52], 53
            mov DWORD PTR [eax+56], 51
            mov DWORD PTR [eax+60], 47
            mov DWORD PTR [eax+64], 43
            mov DWORD PTR [eax+68], 41
            mov DWORD PTR [eax+72], 39
            mov DWORD PTR [eax+76], 37
            mov DWORD PTR [eax+80], 31
            mov DWORD PTR [eax+84], 29
            mov DWORD PTR [eax+88], 23
            mov DWORD PTR [eax+92], 19
            mov DWORD PTR [eax+96], 17
            mov DWORD PTR [eax+100], 13
            mov DWORD PTR [eax+104], 11
            mov DWORD PTR [eax+108], 7
            mov DWORD PTR [eax+112], 5
            mov DWORD PTR [eax+116], 2
            mov DWORD PTR [eax+120], 1
 
            pop eax
 
            ret
    }


error C2400: inline assembler syntax error in 'second operand'; found '('
Вот какая ошибка, прошу отвечать только на нее, а не обсуждать чьи-либо недостатки.
odip
Эксперт С++
7155 / 3295 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
02.08.2009, 01:16     __asm вставка #24
2Skirmisher: Возъми лучше masm или аналог и скомпилируй исходную программу.
Skirmisher
44 / 44 / 0
Регистрация: 23.05.2009
Сообщений: 92
02.08.2009, 01:18  [ТС]     __asm вставка #25
Цитата Сообщение от odip Посмотреть сообщение
2Skirmisher: Возъми лучше masm или аналог и скомпилируй исходную программу.
Так было бы слишком просто я уже её компилировал, все нормально, но я хочу разобраться в синтаксисе встроенного ассемблера, поэтому и создал данную тему.
odip
Эксперт С++
7155 / 3295 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
02.08.2009, 01:19     __asm вставка #26
Чтобы вызвать функцию нужно сделать call FUNC, а не mov eax,FUNC

Добавлено через 44 секунды
А перед этим еще положить куда нужно аргументы этой функции.
Lolcht0
123 / 121 / 5
Регистрация: 30.03.2009
Сообщений: 766
02.08.2009, 01:21     __asm вставка #27
если я правильно понимаю, как работает препроцессор (что не факт) то, код примет вид
C++
1
2
3
4
5
 __asm
        {
                        mov eax, GlobalAlloc((GMEM_FIXED | GMEM_ZEROINIT), 128);return
                        push eax
....
так?
odip
Эксперт С++
7155 / 3295 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
02.08.2009, 01:24     __asm вставка #28
Вот тут пример что делает макрос invoke.
http://www.movsd.com/masm.htm

Добавлено через 43 секунды
так?
Так.
И будет полная ерунда.
Lolcht0
123 / 121 / 5
Регистрация: 30.03.2009
Сообщений: 766
02.08.2009, 01:26     __asm вставка #29
я вижу что ерунда! я попытался поработать препроцессором, используя его код.
Skirmisher
44 / 44 / 0
Регистрация: 23.05.2009
Сообщений: 92
02.08.2009, 01:30  [ТС]     __asm вставка #30
Цитата Сообщение от odip Посмотреть сообщение
Чтобы вызвать функцию нужно сделать call FUNC, а не mov eax,FUNC

Добавлено через 44 секунды
А перед этим еще положить куда нужно аргументы этой функции.
Здесь вызвается не функция, а макрос сколько можно говорить об одном и том же
Assembler
1
mov eax, alloc(128); //alloc(128)-макрос
Макросы так и вызываеются, хотя это уже вопрос знания ассемблера
Lolcht0
123 / 121 / 5
Регистрация: 30.03.2009
Сообщений: 766
02.08.2009, 01:32     __asm вставка #31
ну, я ж тебе написал, КАК и ЧТО у тебя вызовется! по-твоему, это нормально, да?
Skirmisher
44 / 44 / 0
Регистрация: 23.05.2009
Сообщений: 92
02.08.2009, 01:44  [ТС]     __asm вставка #32
Цитата Сообщение от Lolcht0 Посмотреть сообщение
ну, я ж тебе написал, КАК и ЧТО у тебя вызовется! по-твоему, это нормально, да?
На сайте Майкрософт нашел, однако у моего компилятора отсутствует опция /g5
для оптимизации процессора.
Compiler Error C2400
inline assembler syntax error in 'context'; found 'token'

The token caused a syntax error in the specified context.

Possible cause

Specifying a Pentium instruction. Choosing the Pentium option ( /G5) causes the compiler to generate instruction sequences optimized for the Pentium, but does not allow Pentium-specific instructions.
The following sample generates C2400:

Copy Code
// C2400.cpp
int main() {
__asm {
heh ax,bx; // C2400
// try..
// mov ax,bx;
}
}
Lolcht0
123 / 121 / 5
Регистрация: 30.03.2009
Сообщений: 766
02.08.2009, 01:47     __asm вставка #33
иди щас спать, а завтра купи книжку по с, asm, и почитай про calling convertion
odip
Эксперт С++
7155 / 3295 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
02.08.2009, 01:50     __asm вставка #34
Здесь вызвается не функция, а макрос сколько можно говорить об одном и том же
Ну если ты не понимаешь простых вещей !

Во-первых МАКРОС никогда не вызывается - он всегда подставляется во время компиляции.
Так что

Во-вторых функция GlobalAlloc() именно вызывается.

А ты точно компилировал этот код masm-ом ?
Skirmisher
44 / 44 / 0
Регистрация: 23.05.2009
Сообщений: 92
02.08.2009, 01:52  [ТС]     __asm вставка #35
Цитата Сообщение от Lolcht0 Посмотреть сообщение
иди щас спать, а завтра купи книжку по с, asm, и почитай про calling conertion
Дельных советов дать не могут заставляют самому на свой вопрос отвечать
Для чего тогда вообще нужен форум?
odip
Эксперт С++
7155 / 3295 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
02.08.2009, 01:54     __asm вставка #36
На сайте Майкрософт нашел, однако у моего компилятора отсутствует опция /g5
для оптимизации процессора.

Ты пост 28 читал вообще ?
Skirmisher
44 / 44 / 0
Регистрация: 23.05.2009
Сообщений: 92
02.08.2009, 01:55  [ТС]     __asm вставка #37
Цитата Сообщение от odip Посмотреть сообщение
Ну если ты не понимаешь простых вещей !

Во-первых МАКРОС никогда не вызывается - он всегда подставляется во время компиляции.
Так что

Во-вторых функция GlobalAlloc() именно вызывается.

А ты точно компилировал этот код masm-ом ?
Здесь я согласен, однако с вами легко тут запутаться. Я и сам прекрасно заню что макрос подставляется в программу, а при чем там вообще call?

Добавлено через 1 минуту 11 секунд
Цитата Сообщение от odip Посмотреть сообщение

Ты пост 28 читал вообще ?
и где этот пост давайте прочту мне это не сложно
odip
Эксперт С++
7155 / 3295 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
02.08.2009, 01:58     __asm вставка #38
Дельных советов дать не могут заставляют самому на свой вопрос отвечать
Тебе дают советы - ты их игнорируешь.
Что касается отвечать самому - твой ответ неверен.
Пост 28 не читал.
Ошибку тебе компилятор пишет такую:
error C2400: inline assembler syntax error in 'second operand'; found '('

И что - по-твоему '(' - это инструкция Pentium ?

Добавлено через 1 минуту 38 секунд
и где этот пост давайте прочту мне это не сложно
Если ты не заметил, то каждый пост в теме пронумерован в правом верхнем углу.
Но тебя я посоветую прочитать ВСЕ посты в этой теме.
Потому что ты похоже их не читаешь вовсе.
Skirmisher
44 / 44 / 0
Регистрация: 23.05.2009
Сообщений: 92
02.08.2009, 02:00  [ТС]     __asm вставка #39
Цитата Сообщение от odip Посмотреть сообщение
Тебе дают советы - ты их игнорируешь.
Что касается отвечать самому - твой ответ неверен.
Пост 28 не читал.
Ошибку тебе компилятор пишет такую:
error C2400: inline assembler syntax error in 'second operand'; found '('

И что - по-твоему '(' - это инструкция Pentium ?
А я что утверждаю , что это инструкция Pentium? Я говорю что одно из возможных решений данной проблемы-оптимизация процессора. Судя по документации msdn
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.08.2009, 02:08     __asm вставка
Еще ссылки по теме:

вставка - C++
А вот еще сортировка вставкой..вообще бред какой-то получился(( #include&lt;iostream&gt; #include&lt;ctime&gt; using namespace std; void main()...

asm вставка в C++ - C++
есть код #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;fstream&gt; using namespace std; slozh(int* pi1, int...

Ассемблерная вставка - C++
Нужно заменить в русской строке похожие буквы латиницей. Ввод и вывод - на С++, всё остальное - на Ассемблере Помогите пожалуйста

Вставка ассемблера - C++
Почему при попытке использовать прерывание в ассемблеровской вставке, Visual Studio выдает &quot;Необработанное исключение по адресу 0x011F529E...

Ассемблерная Вставка - C++
Добрый день. начал изучать ассемблер(начал со вставок, на этом основание пишу здесь). Должен был написать программу, где на Си++ задается...


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

Или воспользуйтесь поиском по форуму:
odip
Эксперт С++
7155 / 3295 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
02.08.2009, 02:08     __asm вставка #40
при чем там вообще call
А потому что ты не прочитал пост 29.
Там написано как разворачивается макрос invoke.
Возможно кстати что invoke есть только в MASM, но его нет во встроенном ASM-е и придется вручную разворачивать invoke.

Добавлено через 1 минуту 21 секунду
А я что утверждаю , что это инструкция Pentium?
Именно это ты и утверждаешь.

Добавлено через 6 минут 24 секунды
Кстати твой вопрос относится скорее к ASM-у, чем к C/C++.
Yandex
Объявления
02.08.2009, 02:08     __asm вставка
Ответ Создать тему
Опции темы

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