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

Ассемблерные вставки в C++ - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 62, средняя оценка - 4.79
z1p0
0 / 0 / 0
Регистрация: 17.08.2012
Сообщений: 29
26.04.2013, 19:36     Ассемблерные вставки в C++ #1
Собственно сабж ...:
Имею следующий код :
C++
1
2
3
4
5
    short Carry = 2;
    unsigned short Mas[3];
    Mas[0] = 12;
    Mas[1] = 13;
    Mas[2] = 14;
Пытаюсь , в ассемблерной вставке , обратиться к первому элементу массива (не нулевому) ... Делаю так :
Assembler
1
2
3
4
    _asm{
        MOV AX,Mas+Carry;
        ADC [Mas], AX;
    }
Но , вылетает ошибка , во время работы программы ...В дизассамблере смотрю , и вижу :
Assembler
1
2
        MOV AX,Mas+Carry;
0041158C  mov         ax,word ptr [ebp+ebp-0Ch]
Как сделать , что бы работало все верно :?Заранее благодарю !!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.04.2013, 19:36     Ассемблерные вставки в C++
Посмотрите здесь:

C++ Ассемблерские вставки.
Ассемблеровские вставки C++
C++ Ассемблеровские вставки в C++
Ассемблерные вставки, ошибка C++
C++ Ассемблерные вставки
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Somebody
2770 / 1583 / 141
Регистрация: 03.12.2007
Сообщений: 4,139
Завершенные тесты: 1
26.04.2013, 20:34     Ассемблерные вставки в C++ #2
Это получилось, что складываются адреса Mas и Carry, а надо сначала поместить Carry в какой-нибудь регистр, чтобы само значение можно было в адресе использовать.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
26.04.2013, 20:52     Ассемблерные вставки в C++ #3
Может быть:
Assembler
1
2
3
    mov ax, Mas
    add ax, [Carry]
    adc [Mas], ax
?
z1p0
0 / 0 / 0
Регистрация: 17.08.2012
Сообщений: 29
26.04.2013, 21:03  [ТС]     Ассемблерные вставки в C++ #4
Somebody - что то не выходит ....Lazybiz - нет , не это ..
Мне нужно , обращаться к массиву по индексу , сам индекс находится в переменной , объявленной в Си коде ...
Нужно это для того что бы потом создать цикл , в котором эта переменная счетчик будет увеличиваться , и по ней будет идти обращений к элементу массива ...
Вот , каковы цели (скопирована с аси ) :

-Слуашй , а в асссемблере , не льзя ли как то работать с переменными, статически , то есть например имею массив 1 2 3 4 , что бы обратиться например к первому элементу надо писать имя массива + 2 , что бы ко второму , надо писать + 4 ...+ 6 и т.д,но нельзя ли сделать так что бы к первому я обрался +2 , ко второму тоже +2 и к тертьему тоже + 2 и т.д ?
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
26.04.2013, 21:07     Ассемблерные вставки в C++ #5
Цитата Сообщение от z1p0 Посмотреть сообщение
но нельзя ли сделать так что бы к первому я обрался +2 , ко второму тоже +2 и к тертьему тоже + 2 и т.д ?
Что за бред?
Объясни толком. Надо адресовать как обычный массив? Или как?
z1p0
0 / 0 / 0
Регистрация: 17.08.2012
Сообщений: 29
26.04.2013, 21:21  [ТС]     Ассемблерные вставки в C++ #6
Ну как как , примерно вот так :
Массив у нас создан ...
C++
1
2
3
4
5
    short Carry = 2;
    unsigned short Mas[3];
    Mas[0] = 12;
    Mas[1] = 13;
    Mas[2] = 14;
Что бы например , переместить его нулевой элемент в регистр аx пишем вот так :
MOV AX, [Mas]
Что бы переместить первый , пишем так :
MOV AX, [Mas + 2]
А второй , уже будет + 4...
Однако , таких операций будет много , и посему я решил поместить это дело в цикл ...
И должно быть что то типа того ...:
Цикл старт {
Переместить i - ый элемент массива в регистр АХ , выполнить сложение с элементом другого массива , результат сохраанить , в элемент первого массива...
}, здесь и - индекс массива , на первом шаге он равен 0 , потом 2 , 4 и т.д - как это реализовать , я не знаю , причина написана выше ...Однако , есть у меня еще и вопрос такой , можно ли i ... эмм.. ну как бы постоянной величиной сделать , при этом что бы при обращении к индексу массива на каждом шаге цикла ... программа обращалась к нужному ... - по порядку ...То есть что бы когда мы обратились к првому элементу массива , програмаа бы занесла в регистр участок памяти , по коему мы обратились , потом на след шаге цикла , она бы прибавила что то , к этому значению (что бы получить доступ к след индексу) и сохранила его ... И так каждый раз .... Интересует хоть что то из этих 2 - ух вопросов ЫЫЫЫЫ
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
26.04.2013, 21:31     Ассемблерные вставки в C++ #7
Для Borland/Turbo C++ примерно так (проверить не чем):
Assembler
1
2
3
4
5
6
    mov si, Mas
    xor ax, ax
    ...    // начало цикла
    add ax, [si]
    add si, 2
    ...    // конец цикла
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
26.04.2013, 21:46     Ассемблерные вставки в C++ #8
Вывод массива в цикле
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
#include <cstdio>
 
int main()
{
    const int array_size = 10;
    int arr[array_size];
    const int element_size = sizeof(*arr);
 
    for (int i = 0; i < array_size; i++) {
        arr[i] = i;
    }
   
    const char *format_str = "%d\n";
 
    __asm {
        pusha
 
        mov ecx, dword ptr [array_size]
        lea edx, arr
cycle:
        push ecx ; printf почему-то портит ecx и edx
        push edx ; поэтому сохраняем их
        push dword ptr [edx]
        push dword ptr [format_str]
        call printf
        add esp, 8
        pop edx
        pop ecx
        add edx, dword ptr [element_size]
        loop cycle
 
        popa
    }
}
думаю разберешся.
z1p0
0 / 0 / 0
Регистрация: 17.08.2012
Сообщений: 29
26.04.2013, 21:50  [ТС]     Ассемблерные вставки в C++ #9
Ну , мысль ваша то понятна , но так , это работать не будет , увы (((Это , к ответу повыще ))))
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
26.04.2013, 21:51     Ассемблерные вставки в C++ #10
Цитата Сообщение от z1p0 Посмотреть сообщение
но так , это работать не будет , увы
Это еще почему? Я ж перед тем как код выложить его сначала написал и соответственно проверил (в MSVS 2012).
z1p0
0 / 0 / 0
Регистрация: 17.08.2012
Сообщений: 29
26.04.2013, 22:32  [ТС]     Ассемблерные вставки в C++ #11
Цитата Сообщение от Kastaneda Посмотреть сообщение
Это еще почему? Я ж перед тем как код выложить его сначала написал и соответственно проверил (в MSVS 2012).
Я ответ этот написал к другому комментарию - у вас , все замечательно , то что и нужно )))))

Добавлено через 7 минут
Всем огромное спасибо , )Все проще , чем кажется ....
Kastaneda - Дабл спасибо
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
26.04.2013, 22:36     Ассемблерные вставки в C++ #12
Kastaneda, как ты понимаешь что ему надо? Я нихрена не понял.. Он вроде и про вывод в цикле ничего не писал.)
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
26.04.2013, 22:41     Ассемблерные вставки в C++ #13
Цитата Сообщение от lazybiz Посмотреть сообщение
Kastaneda, как ты понимаешь что ему надо?
Как я понял у ТС'а была задача - обратиться к каждому элементу массива и желательно в цикле. Я привел простой пример - печать массива, реализованная через цикл. Дальше ТС может убрать оттуда вывод и вставить что-то свое.
nonedark2008
624 / 502 / 92
Регистрация: 28.07.2012
Сообщений: 1,343
26.04.2013, 23:14     Ассемблерные вставки в C++ #14
Раз тут речь зашла про ассемблер. То воспользуюсь ситуацией =)
Кто-нить может посоветовать источник информации по поводу использования в ассемблерной вставке команд sse2/3/4? А то, как-то не нахожу достаточно объемного описания. Лучшим решением бы было перечисление всех команд с их описанием и примером использования...
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
26.04.2013, 23:19     Ассемблерные вставки в C++ #15
nonedark2008, тут есть пример вставки: http://ru.wikipedia.org/wiki/SSE
Думаю список всех инструкций найти не сложно.
nonedark2008
624 / 502 / 92
Регистрация: 28.07.2012
Сообщений: 1,343
26.04.2013, 23:22     Ассемблерные вставки в C++ #16
Цитата Сообщение от lazybiz Посмотреть сообщение
тут есть пример вставки
Я уже на это натыкался. Больше скажу. В википедии есть даже полный список команд, но дело в том что примерно на половину там нет описания... У Интела я натыкался на программу, содержащую полный список всех интринсиков и описаний к ним. Хотелось бы что-то подобное, но для ассемлерных команд.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
26.04.2013, 23:33     Ассемблерные вставки в C++ #17
А разве описание интринсиктов не соответствует описанию инструкций?
http://concatenative.org/wiki/view/SSE

Добавлено через 7 минут
Там если плясать от ссылки то все можно найти.
nonedark2008
624 / 502 / 92
Регистрация: 28.07.2012
Сообщений: 1,343
27.04.2013, 00:14     Ассемблерные вставки в C++ #18
lazybiz, спасибо за ссылку. Что-то в этом есть. Отписание интринсиков то в целом соответствует, но вот проблема в том, что не для всех интеловских ассемблерных команд реализованы интринсики.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
27.04.2013, 09:23     Ассемблерные вставки в C++ #19
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Лучшим решением бы было перечисление всех команд с их описанием
Гугли "Intel® 64 and IA-32 Architectures Software Developer’s Manual", там описание всех интеловский инструкций.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.04.2013, 09:57     Ассемблерные вставки в C++
Еще ссылки по теме:

C++ Ассемблерные вставки пример
C++ Как делаются ассемблерные вставки?
Зачем нужны ассемблерные вставки в Си (msvs) ? C++

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

Или воспользуйтесь поиском по форуму:
nonedark2008
624 / 502 / 92
Регистрация: 28.07.2012
Сообщений: 1,343
27.04.2013, 09:57     Ассемблерные вставки в C++ #20
Цитата Сообщение от Kastaneda Посмотреть сообщение
там описание всех интеловский инструкций.
Круто. Документация прям томами идет =)) Спасибо большое!
Yandex
Объявления
27.04.2013, 09:57     Ассемблерные вставки в C++
Ответ Создать тему
Опции темы

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