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

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

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

Author24 — интернет-сервис помощи студентам
Собственно сабж ...:
Имею следующий код :
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.04.2013, 19:36
Ответы с готовыми решениями:

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

С++ + Ассемблерные вставки
Помогите с задачей:"Нахождение и отображение смежных групп цифр в числовой последовательности"....

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

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

25
2835 / 1644 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
26.04.2013, 20:34 2
Это получилось, что складываются адреса Mas и Carry, а надо сначала поместить Carry в какой-нибудь регистр, чтобы само значение можно было в адресе использовать.
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
26.04.2013, 20:52 3
Может быть:
Assembler
1
2
3
    mov ax, Mas
    add ax, [Carry]
    adc [Mas], ax
?
0
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
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
26.04.2013, 21:07 5
Цитата Сообщение от z1p0 Посмотреть сообщение
но нельзя ли сделать так что бы к первому я обрался +2 , ко второму тоже +2 и к тертьему тоже + 2 и т.д ?
Что за бред?
Объясни толком. Надо адресовать как обычный массив? Или как?
0
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
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
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
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,116
Записей в блоге: 2
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
0 / 0 / 0
Регистрация: 17.08.2012
Сообщений: 29
26.04.2013, 21:50  [ТС] 9
Ну , мысль ваша то понятна , но так , это работать не будет , увы (((Это , к ответу повыще ))))
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,116
Записей в блоге: 2
26.04.2013, 21:51 10
Цитата Сообщение от z1p0 Посмотреть сообщение
но так , это работать не будет , увы
Это еще почему? Я ж перед тем как код выложить его сначала написал и соответственно проверил (в MSVS 2012).
0
0 / 0 / 0
Регистрация: 17.08.2012
Сообщений: 29
26.04.2013, 22:32  [ТС] 11
Цитата Сообщение от Kastaneda Посмотреть сообщение
Это еще почему? Я ж перед тем как код выложить его сначала написал и соответственно проверил (в MSVS 2012).
Я ответ этот написал к другому комментарию - у вас , все замечательно , то что и нужно )))))

Добавлено через 7 минут
Всем огромное спасибо , )Все проще , чем кажется ....
Kastaneda - Дабл спасибо
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
26.04.2013, 22:36 12
Kastaneda, как ты понимаешь что ему надо? Я нихрена не понял.. Он вроде и про вывод в цикле ничего не писал.)
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,116
Записей в блоге: 2
26.04.2013, 22:41 13
Цитата Сообщение от lazybiz Посмотреть сообщение
Kastaneda, как ты понимаешь что ему надо?
Как я понял у ТС'а была задача - обратиться к каждому элементу массива и желательно в цикле. Я привел простой пример - печать массива, реализованная через цикл. Дальше ТС может убрать оттуда вывод и вставить что-то свое.
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
26.04.2013, 23:14 14
Раз тут речь зашла про ассемблер. То воспользуюсь ситуацией =)
Кто-нить может посоветовать источник информации по поводу использования в ассемблерной вставке команд sse2/3/4? А то, как-то не нахожу достаточно объемного описания. Лучшим решением бы было перечисление всех команд с их описанием и примером использования...
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
26.04.2013, 23:19 15
nonedark2008, тут есть пример вставки: http://ru.wikipedia.org/wiki/SSE
Думаю список всех инструкций найти не сложно.
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
26.04.2013, 23:22 16
Цитата Сообщение от lazybiz Посмотреть сообщение
тут есть пример вставки
Я уже на это натыкался. Больше скажу. В википедии есть даже полный список команд, но дело в том что примерно на половину там нет описания... У Интела я натыкался на программу, содержащую полный список всех интринсиков и описаний к ним. Хотелось бы что-то подобное, но для ассемлерных команд.
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
26.04.2013, 23:33 17
А разве описание интринсиктов не соответствует описанию инструкций?
http://concatenative.org/wiki/view/SSE

Добавлено через 7 минут
Там если плясать от ссылки то все можно найти.
1
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
27.04.2013, 00:14 18
lazybiz, спасибо за ссылку. Что-то в этом есть. Отписание интринсиков то в целом соответствует, но вот проблема в том, что не для всех интеловских ассемблерных команд реализованы интринсики.
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,116
Записей в блоге: 2
27.04.2013, 09:23 19
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Лучшим решением бы было перечисление всех команд с их описанием
Гугли "Intel® 64 and IA-32 Architectures Software Developer’s Manual", там описание всех интеловский инструкций.
1
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
27.04.2013, 09:57 20
Цитата Сообщение от Kastaneda Посмотреть сообщение
там описание всех интеловский инструкций.
Круто. Документация прям томами идет =)) Спасибо большое!
0
27.04.2013, 09:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.04.2013, 09:57
Помогаю со студенческими работами здесь

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

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

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

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


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

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