Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.61/46: Рейтинг темы: голосов - 46, средняя оценка - 4.61
45 / 45 / 1
Регистрация: 23.05.2009
Сообщений: 92
1

__asm вставка

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

Author24 — интернет-сервис помощи студентам
Есть проблема с асм-вставкой нужно возвратить значение в регистр 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 секунд
Есть специалисты по С и Ассемблеру помогите или дайте идейку, если не хочется помогать.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.08.2009, 22:34
Ответы с готовыми решениями:

Вставка asm в С++
Здравствуйте! Помогите пожалуйста! Задание: Вычислить арифметическое выражение. Требуется...

asm вставка в C++
#include &lt;iostream&gt; int a = 10; void func( int&amp; aIn ) { __asm { mov aIn,...

asm вставка в C++
есть код #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;fstream&gt; using namespace std; ...

asm вставка в C++ часть 2
есть код. за его написание отдельное спасибо Kastaneda) #include &lt;iostream&gt; #include &lt;fstream&gt;...

43
Эксперт С++
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
01.08.2009, 22:51 2
Не понял при чем тут ASM вообще ?
Просто вызов функций WinAPI.
Да еще кривой какой-то.

C++
1
2
3
4
5
6
int bytecount;
HGLOBAL hg;
 
hg= GlobalAlloc( GMEM_FIXED|GMEM_ZEROINIT, bytecount );
 
GlobalFree( hg );
http://msdn.microsoft.com/en-u... 85%29.aspx
http://msdn.microsoft.com/en-u... 85%29.aspx
0
Эксперт JavaЭксперт С++
8384 / 3616 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
01.08.2009, 23:00 3
C++
1
return __asm{<eax>}
Классная запись. Учитывая что ретурн сам по себе уже означает запись в eax
1
45 / 45 / 1
Регистрация: 23.05.2009
Сообщений: 92
01.08.2009, 23:42  [ТС] 4
Цитата Сообщение от odip Посмотреть сообщение
Не понял при чем тут ASM вообще ?
Судя по коду язык C тебе не знаком ?
C++
1
#define free(hmemory) (GlobalFree(hmemory)) //работает
А чем тебе этот макрос не понравился? Да допустим пока я его не использую, но в дальнешем буду использовать этот макрос с соответствующими параметрами.
И где конкретно ты нашел ошибку в этом макросе, может ты сам не знаешь что такое макрос?
0
Эксперт С++
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
02.08.2009, 00:00 5
free() - функция такая есть.
0
45 / 45 / 1
Регистрация: 23.05.2009
Сообщений: 92
02.08.2009, 00:13  [ТС] 6
Цитата Сообщение от odip Посмотреть сообщение
free() - функция такая есть.
Я знаю что есть такая функция, однако я говорю уже не в первый раз, что я использую
не free-функцию, а free-макрос, который используется в моей программе
Код

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), sizeof(bytecount));return) //макрос с учетом рекомендаций M128K145
#define free(hmemory) (GlobalFree(hmemory)) //работает
__asm
{
    mov eax, alloc(128)  //это макрос alloc!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    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
}//__asm

C++
1
mov eax, alloc(128)  //это макрос alloc!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
error C2400: inline assembler syntax error in 'second operand'; found '('
Внутрення ситаксическая ошибка ассемблера во втором операнде.
Это ограничение встроенного ассемблера? Или надо как-то по-другому записать.
0
45 / 45 / 1
Регистрация: 23.05.2009
Сообщений: 92
02.08.2009, 00:25  [ТС] 7
Цитата Сообщение от odip Посмотреть сообщение
А чего ты пытаешься сотворить ?


Добавлено через 1 минуту 22 секунды
Сдается мне что ты и ASM не знаешь.
Выделить 128 байт и заполнить таблицу значениями, используя не С++, ассемблер-команды внутри cpp-файла. Ты знаешь ассемблер?
0
Эксперт JavaЭксперт С++
8384 / 3616 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
02.08.2009, 00:31 8
Skirmisher, два замечания. Если ты используеш имя free для своего макроса, и при этом существует функция free, то как может не возникать конфликт имен? И второе:

Цитата Сообщение от M128K145 Посмотреть сообщение
C++
1
return __asm{<eax>}
Классная запись. Учитывая что ретурн сам по себе уже означает запись в eax
Я сказал что он означает, при этом как ты думаеш при такой записи
C++
1
return;
указатель на что будет в eax? Оно даже не откомпилируется
Вот пример того что я говорил:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int Func()
{
00411390  push        ebp  
00411391  mov         ebp,esp 
00411393  sub         esp,0CCh 
00411399  push        ebx  
0041139A  push        esi  
0041139B  push        edi  
0041139C  lea         edi,[ebp-0CCh] 
004113A2  mov         ecx,33h 
004113A7  mov         eax,0CCCCCCCCh 
004113AC  rep stos    dword ptr es:[edi] 
    int c = 5;
004113AE  mov         dword ptr [c],5 
    c++;
004113B5  mov         eax,dword ptr [c] 
004113B8  add         eax,1 
004113BB  mov         dword ptr [c],eax 
    return c;
004113BE  mov         eax,dword ptr [c] 
}
Если тебе надо что-то записать в eax, то тебе надо это вернуть через return. В строчках 20-21 и есть ответ на твой вопрос

Добавлено через 2 минуты 0 секунд
odip, молодец посмеялся . Skirmisher, скажи, а не проще для этих целей использовать массив на асме?
1
45 / 45 / 1
Регистрация: 23.05.2009
Сообщений: 92
02.08.2009, 00:37  [ТС] 9
Вот вы меня сейчас критикуете, а то лишний раз доказывает, что вы также ничего не понимаете в ассемблере, потому что это пример из masm32, которые создают мастера из Microsoft, уж они точно лучше вас разбираются.
0
Эксперт JavaЭксперт С++
8384 / 3616 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
02.08.2009, 00:40 10
Я не спорю что в Microsoft люди умнее меня, но в чем конкретно я не прав?
0
45 / 45 / 1
Регистрация: 23.05.2009
Сообщений: 92
02.08.2009, 00:48  [ТС] 11
Цитата Сообщение от M128K145 Посмотреть сообщение
Я не спорю что в Microsoft люди умнее меня, но в чем конкретно я не прав?
Дело в том что вы отклонились от моей темы о встроенном ассемблере в Visual Studio,
почему я и собственно и создал тему. И спросил всего лишь эквивалент макроса на С++
из ассемблер-макроса.
Assembler
1
2
3
4
      alloc MACRO bytecount
        invoke GlobalAlloc,GMEM_FIXED or GMEM_ZEROINIT,bytecount
        EXITM <eax>
      ENDM
Мой эквивалент на С++
C++
1
#define alloc(bytecount) (GlobalAlloc(GMEM_FIXED || GMEM_ZEROINIT), bytecount; EXITM <eax>)
А вы даже не сразу поняли что речь здесь идет о макросе, а не о функции.
0
Эксперт С++
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
02.08.2009, 00:50 12
Вот вы меня сейчас критикуете
Это где мы тебя критикуем ?
Я только сказал, что ты не знаешь ни C, ни ASM.
это пример из masm32
Ccылку на этот пример в Internet давай, посмотрим на оригинал !
уж они точно лучше вас разбираются
У тебя в строке 4 как минимум две ошибки. Такие ошибки обычный средний программист не мог сделать в принципе - даже с большого будуна.
Кстати в Microsoft кодерами индусы работают, если ты не в курсе
0
125 / 123 / 0
Регистрация: 30.03.2009
Сообщений: 766
02.08.2009, 00:51 13
вот чем не эквивалент?
C++
1
#define alloc(bytecount) (GlobalAlloc(GMEM_FIXED || GMEM_ZEROINIT, bytecount))
1
45 / 45 / 1
Регистрация: 23.05.2009
Сообщений: 92
02.08.2009, 00:52  [ТС] 14
Цитата Сообщение от odip Посмотреть сообщение
Это где мы тебя критикуем ?
Я только сказал, что ты не знаешь ни C, ни ASM.

Ccылку на этот пример в Internet давай, посмотрим на оригинал !

У тебя в строке 4 как минимум две ошибки. Такие ошибки обычный средний программист не мог сделать в принципе - даже с большого будуна.
Кстати в Microsoft кодерами индусы работают, если ты не в курсе
В какой еще 4 строке минимум 2 ошибки, ты это вообще о чем
0
Эксперт С++
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
02.08.2009, 00:54 15
2Lolcht0: потому что 'or' - это '|', а вовсе не '||' !

Добавлено через 1 минуту 8 секунд
В какой еще 4 строке минимум 2 ошибки, ты это вообще о чем
Первый пост в этой теме - первый код на C++, там где собственно alloc() определяется.
0
125 / 123 / 0
Регистрация: 30.03.2009
Сообщений: 766
02.08.2009, 00:54 16
м, ну это копипаста...
0
45 / 45 / 1
Регистрация: 23.05.2009
Сообщений: 92
02.08.2009, 00:57  [ТС] 17
Цитата Сообщение от odip Посмотреть сообщение
2Lolcht0: потому что 'or' - это '|', а вовсе не '||' !

Добавлено через 1 минуту 8 секунд

Первый пост в этой теме - первый код на C++, там где собственно alloc() определяется.
Ты не прав в С++ |-означает поразрядную дизюнкцию, а не логичекое или, так что ||-верно.
0
Эксперт С++
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
02.08.2009, 00:59 18
2Skirmisher:
Кажется я начинаю понимать о чем идет речь.
Ты надыбал где-то пример кода на masm.
И решил его переделать, но не просто переделать - а сделать в виде asm-вставки в C++ код.
Исходный код видимо был правильный, а вот результат твоей переделки не компилируется.
И глупо обвинять нас, чтобы мы ничего не понимаем.
0
125 / 123 / 0
Регистрация: 30.03.2009
Сообщений: 766
02.08.2009, 01:01 19
и ты думаешь, тут по смыслу ЛОГИЧЕСКОЕ или???
0
Эксперт С++
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
02.08.2009, 01:03 20
в С++ |-означает поразрядную дизюнкцию
Правильно.
так что ||-верно
А вот это уже неправильно, потому что в ASM 'or' обозначает именно поразрядный 'or'.

Да и по логике C/C++ первый параметр функции GlobalAlloc() - это флаги, которые разумеется соединяются через '|'.
0
02.08.2009, 01:03
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.08.2009, 01:03
Помогаю со студенческими работами здесь

Asm вставка и возвращаемое системе значение
Здравствуйте. Почему эта программа #include &lt;iostream&gt; using std::cout; using std::cin; int...

Asm вставка в С++ возвести число в степень
Возвести число А в степень n (на Assemblerе в С++)

Вставка asm, адрес члена локального объекта
TLongInteger &amp; TLongInteger:: operator + (const TLongInteger &amp;Additional) { TLongInteger ...

c++ и ASM
помогите найти ошибку #pragma once #include &lt;stdlib.h&gt; #include &lt;iostream&gt; class bbyte {...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru