У меня есть блок памяти, выделенный с помощью malloc
с использованием 64-разрядного NASM в Windows. Когда я использую movapd (переместить два выровненных упакованных значения с плавающей запятой двойной точности), моя программа падает, но я могу использовать movupd (переместить два невыровненных упакованных числа с плавающей запятой двойной точности ценности).
Я изменил на _aligned_malloc
, указав выравнивание = 16, которое работает для выделения памяти, но я все еще получаю ошибку, когда использую movapd . Перед выполнением инструкций мой отладчик показывает R8 = 0xB0FC78, R15 = 0x12FC0050, RCX = 0x6D40050 и RDX = 0x10010050. RCX и RDX являются указателями на два блока памяти. R8 и RCX являются счетчиками по блокам
Это работает:
movupd xmm0,[rdx+r8]
movupd [r15+rcx],xmm0
Вылетает:
movapd xmm0,[rdx+r8]
movapd [r15+rcx],xmm0
Как ни странно, программа медленнее с _aligned_malloc
, чем с памятью malloc.
Мой код написан на NASM (ассемблере), но я не думаю, что язык имеет значение.
Почему я не могу использовать movapd даже с памятью, выделенной _aligned_malloc
?