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

C++

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

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

21.05.2012, 01:42. Просмотров 2265. Ответов 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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.05.2012, 01:42
Здравствуйте! Я подобрал для вас темы с ответами на вопрос inline assembler VS чтение по указателю (C++):

Обращение к переменным объекта с использованием указателя this из inline assembler - Visual C++
Мне нужно написать класс на С++ с учетом возможности ввода количества столбцов и строк матрицы. Матрица должна размещаться в динамической...

Inline Assembler & C++ - C++
int main(int argc, char *argv) { perevod(); cout<<"Type Esc to Escape \n"; __asm { mov ah,01h ...

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

inline функции vs инструкции inline функций - C++
Здравствуйте. Чтобы не писать повторно код, нужно использовать функции. Но если функции компактные, то их лучше делать inline функциями, т....

Компиляция Inline assembler (вставки ассемблера) - C++ Linux
Доброго времени суток! Уважаемые кодеры! Помогите с компиляцией С++ со вставками ассемблера. g++ или gcc выдает ошибку: ...

GCC Inline Assembly перевести в Visual Studio Inline Assembler - Assembler
Здравствуйте. Есть код на GCC Inline Assembly и его нужно перевести в Visual Studio Inline Assembler. Не работал с GCC Inline Assembly...

23
ignisdivine
4 / 4 / 0
Регистрация: 27.03.2011
Сообщений: 38
24.05.2012, 21:45  [ТС] #16
Нашел инструкции MOVSx - movsb, movsw, movsd.
Но почему-то программа падает не дойдя даже до половины элементов, проверял на значениях записываемых в ecx (при всех прочих равных условиях) 1000 еще работает, а 100000 уже нет, при всей выделяемой памяти в 1 МБ. В описании этих функций присутствует момент, что в счетчик CX нужно записывать значение элементов (байт, слов, двойных слов), но в данном случае кол-во элементов и байт совпадает ведь.

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
char* allocate(long dwSize)
{
     char* memPointer = (char*)VirtualAlloc(
                     (LPVOID) NULL,                               // Next page to commit
                     dwSize,                                         // Page size, in bytes
                     MEM_COMMIT | MEM_RESERVE,         // Allocate a committed page
                    PAGE_READWRITE);                          // Read/write access
     return memPointer;
}
 
int main()
{
  int size= 1048576;
  char* pointer = allocate(size);
  char* pointer2 = allocate(size);
  int block_size = size;
 
  __asm lea     si, pointer
  __asm lea     di, pointer2
  __asm mov    ecx, block_size
  __asm rep     movsb;
 
  return 0;
}
0
Evg
Эксперт CАвтор FAQ
18038 / 6270 / 428
Регистрация: 30.03.2009
Сообщений: 17,246
Записей в блоге: 28
24.05.2012, 22:00 #17
В VirtualAlloc делает реальное выделение памяти? Я почитал описание, толком ни х не понял, но такое ощущение, что она просто резервирует адреса. Если выделать память через malloc, то что-нибудь изменится?
0
ignisdivine
4 / 4 / 0
Регистрация: 27.03.2011
Сообщений: 38
24.05.2012, 22:26  [ТС] #18
http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

The malloc function has the disadvantage of being run-time dependent. The new operator has the disadvantage of being compiler dependent and language dependent.
0
Evg
Эксперт CАвтор FAQ
18038 / 6270 / 428
Регистрация: 30.03.2009
Сообщений: 17,246
Записей в блоге: 28
24.05.2012, 22:44 #19
Ты можешь просто взять и подставить malloc (или calloc) вместо allocate и посмотреть, что получится?
0
ignisdivine
4 / 4 / 0
Регистрация: 27.03.2011
Сообщений: 38
24.05.2012, 23:13  [ТС] #20
Также не работает, падает на movsb.
0
Evg
Эксперт CАвтор FAQ
18038 / 6270 / 428
Регистрация: 30.03.2009
Сообщений: 17,246
Записей в блоге: 28
24.05.2012, 23:46 #21
А текущее значение адреса какое? Такое подозрение, что падает на границе страницы
0
skaa
Хочу в Исландию
1030 / 829 / 75
Регистрация: 10.11.2010
Сообщений: 1,626
25.05.2012, 01:41 #22
Вот что должно быть в ассемблере:
Assembler
1
2
3
4
  mov   esi,pointer
  mov   edi,pointer2
  mov   ecx,[block_size]
  rep   movsb
, проверено в Borland C++ Builder 5.0.
1
ignisdivine
4 / 4 / 0
Регистрация: 27.03.2011
Сообщений: 38
26.05.2012, 01:49  [ТС] #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
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
27.05.2012, 15:53 #24
Цитата Сообщение от Evg Посмотреть сообщение
Я intel'овскую систему команд не знаю, но подозреваю, что операция mov делает пересылку одного слова (4 байт), а тебе при чтении из указателя нужно пересылать только 1 байт.
mov кидает любой целый размер не больше слова. На x32 не больше 4-х байт, в данном случае 1-й мов 4-х байтный, а второй вроде однобайтный.
0
27.05.2012, 15:53
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.05.2012, 15:53
Привет! Вот еще темы с ответами:

inline assembler в СИ - Assembler
Доброго! каким образом можно связать внешную переменную и встроенный ассмблер в Си? чтоб было примерно так: int abc = 666; ...

Inline assembler mingw - Assembler
Добрый вечер ув. пользователи форума. Возникла проблема с ассемблером, и его реализацией в mingw. Имеется функция void call_hook ( void...

Работа со строками. Удалить из строки символы в скобках inline assembler. - Assembler
Удалить из строки символы в скобках inline assembler. Подскажите в какую сторону копать...

Определение тактовой частоты. Еrror C2400: inline assembler syntax error in 'opcode' - Assembler
в VS в _asm пишу определение тактовой чистоты,ругается: error C2400: inline assembler syntax error in 'opcode'; found 'constant' в C++...


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

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

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