Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для начинающих > выравнивание и исключение общей защиты


Автор: Programister0 16.9.2007, 14:31
Код

movups xmm0, [esi+ecx   ]
movups [edi+ecx   ], xmm0

И 
Код

movaps xmm0, [esi+ecx   ]
movaps [edi+ecx   ], xmm0

первый код работает а второй вызывает исключение типа read adress FFFFFFFF

обьясните как понимать "выравнены по 16-ти байтовой границе"

Добавлено через 10 минут и 19 секунд
Обращение в память должно быть по адресу, кратному 16 байтам; в противном случае генерируется исключение.

Автор: W4FhLF 16.9.2007, 16:06
Цитата(Programister0 @  16.9.2007,  14:31 Найти цитируемый пост)
обьясните как понимать "выравнены по 16-ти байтовой границе"


Есть такая директива align. Поставь перед данными, которые находятся в [edi+ecx] строку  align 16. 

Автор: Programister0 16.9.2007, 18:06
а если данные предаются в процедуру из с++ 

Автор: W4FhLF 16.9.2007, 18:27
Подробнее. 

Автор: sgi1981 16.9.2007, 18:40
Цитата(Programister0 @ 16.9.2007,  14:31)
обьясните как понимать "выравнены по 16-ти байтовой границе"

Адрес операнда выровнен на 16 байт, если значение адреса делится без остатка на 16.

Автор: Programister0 16.9.2007, 19:10
ну или как выделить память чтоб она была выровнена на 16 байт

Автор: MAKCim 16.9.2007, 19:17
Programister0, 
в коде на С++ передаваемые данные глобальные или локальные?

Автор: Programister0 16.9.2007, 19:31
локальные.

Автор: MAKCim 17.9.2007, 08:43
Programister0, 
навряд ли можно что-то сделать, потому как нужно выравнивать стек
если нет соответствующего extension-а у компилятора, вручную сделать тоже не получится

Автор: Programister0 17.9.2007, 11:35
БлиН.
ладно может что нибудь ещё придумаю,
спасибо всем.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)