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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 62, средняя оценка - 4.79
z1p0
0 / 0 / 0
Регистрация: 17.08.2012
Сообщений: 29
#1

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

26.04.2013, 19:36. Просмотров 11414. Ответов 25
Метки нет (Все метки)

Собственно сабж ...:
Имею следующий код :
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]
Как сделать , что бы работало все верно :?Заранее благодарю !!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.04.2013, 19:36
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ассемблерные вставки в C++ (C++):

Ассемблерные вставки - C++
Будут ли у меня проблемы, если я, поработав с регистрами, не восстановлю их после выхода из вставки? Если проблем не будет, то их не будет...

Ассемблерные вставки (Часть 3) - C++
На 4 шаге ошибка -nan(ind). Не могу разобраться... #include<iostream> using namespace std; int main() { int n = 6.0; int...

Ассемблерные вставки пример - C++
помогите пожалуйста решить вот условие: y1 = 8 +|x|, если x<1 иначе y1 = 3, если x>=1 y2 = |a|*2, если x>=1 иначе y2 =...

Ассемблерные вставки, ошибка - C++
Ошибка: 0xC0000095: Integer overflow. Код: mov eax,x sub eax,a mov ebx,x sub ebx,c div ebx - здесь ошибка mov f,ebx

Как делаются ассемблерные вставки? - C++
Я слышал, что в С++ можно вставлять вставки на асм, как это делается? Спасибо.

Ассемблерные вставки в Visual DSP++ - C++
Добрый вечер, необходимо вставить ассемблерный код ( или файл на ассемблере подключить в с++) в visual DSP++. Насколько знаю, в visual...

25
Somebody
2791 / 1602 / 147
Регистрация: 03.12.2007
Сообщений: 4,199
Завершенные тесты: 1
26.04.2013, 20:34 #2
Это получилось, что складываются адреса Mas и Carry, а надо сначала поместить Carry в какой-нибудь регистр, чтобы само значение можно было в адресе использовать.
0
castaway
Эксперт С++
4887 / 3022 / 370
Регистрация: 10.11.2010
Сообщений: 11,080
Записей в блоге: 10
Завершенные тесты: 1
26.04.2013, 20:52 #3
Может быть:
Assembler
1
2
3
    mov ax, Mas
    add ax, [Carry]
    adc [Mas], ax
?
0
z1p0
0 / 0 / 0
Регистрация: 17.08.2012
Сообщений: 29
26.04.2013, 21:03  [ТС] #4
Somebody - что то не выходит ....Lazybiz - нет , не это ..
Мне нужно , обращаться к массиву по индексу , сам индекс находится в переменной , объявленной в Си коде ...
Нужно это для того что бы потом создать цикл , в котором эта переменная счетчик будет увеличиваться , и по ней будет идти обращений к элементу массива ...
Вот , каковы цели (скопирована с аси ) :

-Слуашй , а в асссемблере , не льзя ли как то работать с переменными, статически , то есть например имею массив 1 2 3 4 , что бы обратиться например к первому элементу надо писать имя массива + 2 , что бы ко второму , надо писать + 4 ...+ 6 и т.д,но нельзя ли сделать так что бы к первому я обрался +2 , ко второму тоже +2 и к тертьему тоже + 2 и т.д ?
0
castaway
Эксперт С++
4887 / 3022 / 370
Регистрация: 10.11.2010
Сообщений: 11,080
Записей в блоге: 10
Завершенные тесты: 1
26.04.2013, 21:07 #5
Цитата Сообщение от z1p0 Посмотреть сообщение
но нельзя ли сделать так что бы к первому я обрался +2 , ко второму тоже +2 и к тертьему тоже + 2 и т.д ?
Что за бред?
Объясни толком. Надо адресовать как обычный массив? Или как?
0
z1p0
0 / 0 / 0
Регистрация: 17.08.2012
Сообщений: 29
26.04.2013, 21:21  [ТС] #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 - ух вопросов ЫЫЫЫЫ
0
castaway
Эксперт С++
4887 / 3022 / 370
Регистрация: 10.11.2010
Сообщений: 11,080
Записей в блоге: 10
Завершенные тесты: 1
26.04.2013, 21:31 #7
Для Borland/Turbo C++ примерно так (проверить не чем):
Assembler
1
2
3
4
5
6
    mov si, Mas
    xor ax, ax
    ...    // начало цикла
    add ax, [si]
    add si, 2
    ...    // конец цикла
0
Kastaneda
Jesus loves me
Эксперт С++
4688 / 2892 / 236
Регистрация: 12.12.2009
Сообщений: 7,353
Записей в блоге: 2
Завершенные тесты: 1
26.04.2013, 21:46 #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
    }
}
думаю разберешся.
0
z1p0
0 / 0 / 0
Регистрация: 17.08.2012
Сообщений: 29
26.04.2013, 21:50  [ТС] #9
Ну , мысль ваша то понятна , но так , это работать не будет , увы (((Это , к ответу повыще ))))
0
Kastaneda
Jesus loves me
Эксперт С++
4688 / 2892 / 236
Регистрация: 12.12.2009
Сообщений: 7,353
Записей в блоге: 2
Завершенные тесты: 1
26.04.2013, 21:51 #10
Цитата Сообщение от z1p0 Посмотреть сообщение
но так , это работать не будет , увы
Это еще почему? Я ж перед тем как код выложить его сначала написал и соответственно проверил (в MSVS 2012).
0
z1p0
0 / 0 / 0
Регистрация: 17.08.2012
Сообщений: 29
26.04.2013, 22:32  [ТС] #11
Цитата Сообщение от Kastaneda Посмотреть сообщение
Это еще почему? Я ж перед тем как код выложить его сначала написал и соответственно проверил (в MSVS 2012).
Я ответ этот написал к другому комментарию - у вас , все замечательно , то что и нужно )))))

Добавлено через 7 минут
Всем огромное спасибо , )Все проще , чем кажется ....
Kastaneda - Дабл спасибо
0
castaway
Эксперт С++
4887 / 3022 / 370
Регистрация: 10.11.2010
Сообщений: 11,080
Записей в блоге: 10
Завершенные тесты: 1
26.04.2013, 22:36 #12
Kastaneda, как ты понимаешь что ему надо? Я нихрена не понял.. Он вроде и про вывод в цикле ничего не писал.)
0
Kastaneda
Jesus loves me
Эксперт С++
4688 / 2892 / 236
Регистрация: 12.12.2009
Сообщений: 7,353
Записей в блоге: 2
Завершенные тесты: 1
26.04.2013, 22:41 #13
Цитата Сообщение от lazybiz Посмотреть сообщение
Kastaneda, как ты понимаешь что ему надо?
Как я понял у ТС'а была задача - обратиться к каждому элементу массива и желательно в цикле. Я привел простой пример - печать массива, реализованная через цикл. Дальше ТС может убрать оттуда вывод и вставить что-то свое.
0
nonedark2008
931 / 670 / 147
Регистрация: 28.07.2012
Сообщений: 1,827
26.04.2013, 23:14 #14
Раз тут речь зашла про ассемблер. То воспользуюсь ситуацией =)
Кто-нить может посоветовать источник информации по поводу использования в ассемблерной вставке команд sse2/3/4? А то, как-то не нахожу достаточно объемного описания. Лучшим решением бы было перечисление всех команд с их описанием и примером использования...
0
castaway
Эксперт С++
4887 / 3022 / 370
Регистрация: 10.11.2010
Сообщений: 11,080
Записей в блоге: 10
Завершенные тесты: 1
26.04.2013, 23:19 #15
nonedark2008, тут есть пример вставки: http://ru.wikipedia.org/wiki/SSE
Думаю список всех инструкций найти не сложно.
0
26.04.2013, 23:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.04.2013, 23:19
Привет! Вот еще темы с ответами:

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

Зачем нужны ассемблерные вставки в Си (msvs) ? - C++
Объясните мне, человеку, который пока не знает ассемблер, но который хочет его в дальнейшем изучать, на кой черт нужны ассемблерные вставки...

Счетчик считающий нажатие клавиши (ассемблерные вставки) - C++
Я ещё новичок и не очень шарю в программировании,если кто поможет буду признателен :(.Нужно что бы программа считала сколько раз...

Ассемблерные вставки на Fasm - C++
Возможно ли в C++ ассемблерные вставки писать на Fasm?


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

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

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