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

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

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

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

01.08.2009, 22:34. Просмотров 6935. Ответов 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 секунд
Есть специалисты по С и Ассемблеру помогите или дайте идейку, если не хочется помогать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.08.2009, 22:34
Здравствуйте! Я подобрал для вас темы с ответами на вопрос __asm вставка (C++):

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

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

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

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

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

Asm вставка и возвращаемое системе значение - C++
Здравствуйте. Почему эта программа #include &lt;iostream&gt; using std::cout; using std::cin; int main() { int z = 0; _asm { ...

43
Lolcht0
123 / 121 / 5
Регистрация: 30.03.2009
Сообщений: 766
02.08.2009, 01:32 #31
ну, я ж тебе написал, КАК и ЧТО у тебя вызовется! по-твоему, это нормально, да?
0
Skirmisher
44 / 44 / 0
Регистрация: 23.05.2009
Сообщений: 92
02.08.2009, 01:44  [ТС] #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;
}
}
0
Lolcht0
123 / 121 / 5
Регистрация: 30.03.2009
Сообщений: 766
02.08.2009, 01:47 #33
иди щас спать, а завтра купи книжку по с, asm, и почитай про calling convertion
0
odip
Эксперт С++
7158 / 3220 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
02.08.2009, 01:50 #34
Здесь вызвается не функция, а макрос сколько можно говорить об одном и том же
Ну если ты не понимаешь простых вещей !

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

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

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

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

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

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

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

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

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

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

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

И что - по-твоему '(' - это инструкция Pentium ?
А я что утверждаю , что это инструкция Pentium? Я говорю что одно из возможных решений данной проблемы-оптимизация процессора. Судя по документации msdn
0
odip
Эксперт С++
7158 / 3220 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
02.08.2009, 02:08 #40
при чем там вообще call
А потому что ты не прочитал пост 29.
Там написано как разворачивается макрос invoke.
Возможно кстати что invoke есть только в MASM, но его нет во встроенном ASM-е и придется вручную разворачивать invoke.

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

Добавлено через 6 минут 24 секунды
Кстати твой вопрос относится скорее к ASM-у, чем к C/C++.
0
Skirmisher
44 / 44 / 0
Регистрация: 23.05.2009
Сообщений: 92
02.08.2009, 02:22  [ТС] #41
Самое обидное, что ни один совет не попал в точку, кроме с |
0
odip
Эксперт С++
7158 / 3220 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
02.08.2009, 02:23 #42
push eax, pop eax - никакого смысла не несут - можно удалить.

Ты ее не решил, а обошел.
Чтобы в точности было как в MASM - нужно было положить параметры в стек и вызывать GlobalAlloc внутри кода asm.
0
Skirmisher
44 / 44 / 0
Регистрация: 23.05.2009
Сообщений: 92
02.08.2009, 02:29  [ТС] #43
Цитата Сообщение от odip Посмотреть сообщение
push eax, pop eax - никакого смысла не несут - можно удалить.

Ты ее не решил, а обошел.
Чтобы в точности было как в MASM - нужно было положить параметры в стек и вызывать GlobalAlloc внутри кода asm.
Ну call и invoke запрещены, во встроенном ассемблере

Добавлено через 3 минуты 9 секунд
Цитата Сообщение от Skirmisher Посмотреть сообщение
Ну call и invoke запрещены, во встроенном ассемблере
Куда пропал мой код, мое детище
0
odip
Эксперт С++
7158 / 3220 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
02.08.2009, 02:36 #44
Ну call и invoke запрещены, во встроенном ассемблере
call вполне себе работает

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <stdlib.h>
 
void func( void );
 
int main( void ) {
 
__asm
{
    call func
}
 
return 0;
 
}
 
void func( void ) {
 
printf( "func()\n" );
 
}
Добавлено через 56 секунд
invoke не работает - потому что это макрос для MASM.
О чем я тебе уже говорил.
1
02.08.2009, 02:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.08.2009, 02:36
Привет! Вот еще темы с ответами:

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

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

c++ asm - C++
_asm {} какие библиотеки нужно подключать , чтобы заставить работать ассемблер на с++ и как правильно записывать всё это дело ...

C++ и ASM - C++
Всем привет. Необходимо посчитать уравнение на языке ASM и вывести ответ на языке С++. Вот готовая программа на ASM с выводом на...


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

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

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