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

asm вставка в C++ часть 2 - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 34, средняя оценка - 4.62
agusikdeon
0 / 0 / 0
Регистрация: 22.11.2010
Сообщений: 9
25.11.2010, 22:15     asm вставка в C++ часть 2 #1
есть код. за его написание отдельное спасибо Kastaneda)

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
#include <iostream>
#include <fstream>
 
using namespace std;
 
int slozh(int* pi1, int si1);
 
int main()
{int massiv[]={1,3,8,16,6,7,11,4,6};
int abc=sizeof(massiv)/4;
abc=slozh (massiv,abc/3);
 
cout<<abc<<endl;
cin.peek();
return 0;}
int slozh(int* pi1, int abc)
{
_asm{
   mov ebx,pi1
   mov ecx,abc
   xor eax,eax
L: add eax,[ebx]
   add ebx,12
   loop L
    }
}
нужно чтобы ассемблерная вставка не только сумировала каждый третий элемент массива
но перед этим в каждом из этих элементов устанавливала 4-й бит в 0 а 5-й бит в единицу
с помощью команд and и or
маски для установки Efh и 20h соответственно
помогите плиз
заранее спасибо)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
+c+
112 / 22 / 3
Регистрация: 20.11.2010
Сообщений: 1,294
26.11.2010, 01:16     asm вставка в C++ часть 2 #2
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 <iostream>
#include <fstream>
 
using namespace std;
 
int slozh(int* pi1, int si1);
 
int main()
{int massiv[]={1,3,8,16,6,7,11,4,6};
int abc=sizeof(massiv)/4; int res;    //res - результат
res=slozh(massiv,abc/3);
 
cout << res << endl;
system("pause");
return 0;}
int slozh(int* pi1, int abc)
{
   int r;
_asm{
   mov ebx,pi1
   mov ecx,abc   //ecx - счётчик цикла
   xor eax,eax    //eax - сумма
   xor edx,edx   //edx - для операций and or
L: 
   mov edx,[ebx]
   and edx,11110111b
   or edx,00010000b
   add eax,edx
   add ebx,12
   loop L
   mov r,eax
    }
  return r;
}
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
26.11.2010, 08:11     asm вставка в C++ часть 2 #3
+c+, 00010000b и 11110111b это не Efh и 20h.
И вот этого:
Assembler
1
2
3
4
5
int r;
..............
mov r,eax
............   
return r;
не надо. Достаточно в прототипе ф-ции указать, что она возвращает int, а в АСМ вставке просто результат оставить в EAX. По соглашеню stdcall (которое принято в C/C++) ф-ция возвращает результат в аккамуляторе, поэтому этих строк писать не надо. Посмотрите на мою АСМ вставку в посте ТС, там все работает как надо.
+c+
112 / 22 / 3
Регистрация: 20.11.2010
Сообщений: 1,294
26.11.2010, 14:51     asm вставка в C++ часть 2 #4
Рад поправке! Благодарю! Да, действительно, 00010000b и 11110111b здесь просто надо сделать << 1.
Просто почему-то считал с единицы, а не с нуля!
А подскажите плиз, у меня почему-то с этой строчкой неработает: using namespace std; я просто без неё делал тот код, а с ней выводит ошибку, что нужен возвращаемый обьект! У меня Visual C++ 6.0. В других кодах та строчка работает!

Добавлено через 3 часа 3 минуты
Подскажите плиз, почему в Visual C++ надо перед cout ставить std::cout, а допустим в dev-c++ не надо ставить! Я просто ещё не дочитал до этого! самоучка! но есть желание узнать! Хоть в двух словах
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
26.11.2010, 16:33     asm вставка в C++ часть 2 #5
Цитата Сообщение от +c+ Посмотреть сообщение
А подскажите плиз, у меня почему-то с этой строчкой неработает: using namespace std; я просто без неё делал тот код, а с ней выводит ошибку, что нужен возвращаемый обьект! У меня Visual C++ 6.0. В других кодах та строчка работает!
using namespace std == использовать пространство имен std. Эта строка в принципе подобных ошибок вызывать не может, а вот отсутствие ее (без явного указания пространства имен, например std::cout) или присутствие на старых компиляторах (выпущенных до принятия стандарта с пространством имен) максимум приводит к ошибкам при компиляции.

Подскажите плиз, почему в Visual C++ надо перед cout ставить std::cout, а допустим в dev-c++ не надо ставить!
Как писалось выше можно просто написать using namespace std;, а можно явно указывать (std::cout; std::cin и т.д.), можно еще писать using std::cout и далее в коде писать просто cout. Лично у меня dev-c++ просит указывать пространство имен, если у вас это приводит к ошибке, значит у вас очень старая версия DEV_C++ (хотя я не уверен, что такая версия есть, но другого объяснения я не вижу)

П.С. Почитайте про "пространство имен". Эта тема должна быть в каждой книге по С++.
+c+
112 / 22 / 3
Регистрация: 20.11.2010
Сообщений: 1,294
18.12.2010, 20:25     asm вставка в C++ часть 2 #6
Что отладчик Visual C++ 6.0 от меня хочет? Тоесть без этой строки - using namespace std; не хочет выводить на экран cout!
C++
1
2
3
4
5
6
7
8
9
10
11
using namespace std;
 
int main()
{
    vector<int> i;
    i.push_back(3);
    std::cout << i[0] << endl;
 
    system("pause");
        return 0;
}
Тоесть я понял, что using namespace std; делает пространство имён std по умолчанию!
Если убрать std из строчки std::cout << i[0] << endl; то выдаёт ошибку! А ведь std уже назначено по умолчанию! в строчке using namespace std;
Или у вектора своё пространство имён? не std

И ещё: правильно? я вывожу на экран вектор i - std::cout << i[0] << endl;
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
18.12.2010, 20:26     asm вставка в C++ часть 2 #7
C++
1
std::cout << i[0] << std::endl;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.12.2010, 01:23     asm вставка в C++ часть 2
Еще ссылки по теме:

C++ Вставка asm, адрес члена локального объекта
Вставка asm в С++ C++
Разделить дробное число на 2 части: целая часть числа и его дробная часть C++

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

Или воспользуйтесь поиском по форуму:
+c+
112 / 22 / 3
Регистрация: 20.11.2010
Сообщений: 1,294
19.12.2010, 01:23     asm вставка в C++ часть 2 #8
У меня и без std::endl показывает почему-то!
Тоесть std::cout << i[0] << endl; нормально показывает!

Так зачем вообще писать std перед cout ? std ведь уже назначено по умолчанию!

Добавлено через 4 часа 51 минуту
Извиняюсь конечно, что не в своей теме, но может всё-таки пару слов по вопросу?
И желательно своими словами, а не цитатами из книг. Нормальными программистскими семантиками!
Yandex
Объявления
19.12.2010, 01:23     asm вставка в C++ часть 2
Ответ Создать тему
Опции темы

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