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

C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.89
ignisdivine
4 / 4 / 0
Регистрация: 27.03.2011
Сообщений: 38
#1

inline assembler VS чтение по указателю - C++

21.05.2012, 01:42. Просмотров 2202. Ответов 23
Метки нет (Все метки)

Доброе время суток.
Задача состоит в чтении 1 байта по адресу указателя. Проблема с пониманием, что не так с типами операндов.
C++
1
2
3
4
5
6
7
char readFromPointer(char* pointer)
{
    char result; 
    __asm mov edi, pointer
    __asm mov result, [edi]
    return result;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.05.2012, 01:42     inline assembler VS чтение по указателю
Посмотрите здесь:

Обращение к переменным объекта с использованием указателя this из inline assembler Visual C++
inline функции C++
inline
C++ Linux Компиляция Inline assembler (вставки ассемблера)
inline C++
Inline функции C++
C++ Inline Assembler & C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Evg
Эксперт CАвтор FAQ
17392 / 5630 / 352
Регистрация: 30.03.2009
Сообщений: 15,417
Записей в блоге: 26
24.05.2012, 23:46     inline assembler VS чтение по указателю #21
А текущее значение адреса какое? Такое подозрение, что падает на границе страницы
skaa
Хочу в Исландию
1027 / 826 / 75
Регистрация: 10.11.2010
Сообщений: 1,626
25.05.2012, 01:41     inline assembler VS чтение по указателю #22
Вот что должно быть в ассемблере:
Assembler
1
2
3
4
  mov   esi,pointer
  mov   edi,pointer2
  mov   ecx,[block_size]
  rep   movsb
, проверено в Borland C++ Builder 5.0.
ignisdivine
4 / 4 / 0
Регистрация: 27.03.2011
Сообщений: 38
26.05.2012, 01:49  [ТС]     inline assembler VS чтение по указателю #23
Спасибо, все круто, все работает.
Но даже movsd не может полностью забить кэш, скорость перемещения такого ~750 МБ/c, т.е. работает кэш, а не память. Поэтому нужно какой-то вариант с бОльшим блоком для перемещения.

Добавлено через 8 часов 50 минут
На stackoverflow посоветовали использовать "movntdq for writing and movntdqa for reading".
Эти инструкции идут в обход иерархии кэшей.

http://www.damtp.cam.ac.uk/cosmos/pr...2_hh/vc194.htm

"Moves the double quadword in the source operand (second operand) to the destination operand (first operand) using a non-temporal hint to minimize cache pollution during the write to memory."

Попробовал понять, как использовать и ничего не получилось.

C++
1
2
3
4
5
6
7
8
9
void* c = (void*)malloc(16);
    double* pointer2 = new double[4];
    pointer2[0] = 0;
    pointer2[1] = 2;
    pointer2[3] = 0;
    pointer2[4] = 4;
    //__asm movntdq xmm0, 0
    __asm movups xmm0, pointer2
    __asm movntdq c, xmm0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.05.2012, 15:53     inline assembler VS чтение по указателю
Еще ссылки по теме:

C++ inline функции vs инструкции inline функций
Класс, inline C++
Описатель inline C++
C++ Inline функции - на сколько должна быть маленькая функция, чтоб она подошла под inline?
C++ Inline функции

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

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
27.05.2012, 15:53     inline assembler VS чтение по указателю #24
Цитата Сообщение от Evg Посмотреть сообщение
Я intel'овскую систему команд не знаю, но подозреваю, что операция mov делает пересылку одного слова (4 байт), а тебе при чтении из указателя нужно пересылать только 1 байт.
mov кидает любой целый размер не больше слова. На x32 не больше 4-х байт, в данном случае 1-й мов 4-х байтный, а второй вроде однобайтный.
Yandex
Объявления
27.05.2012, 15:53     inline assembler VS чтение по указателю
Ответ Создать тему
Опции темы

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