Когда четырехслово (NASM DQ) должно быть выровнено по 16 байт? - PullRequest
0 голосов
/ 11 июля 2020

Согласно комбинированным томам Руководства разработчика программного обеспечения для архитектур Intel 64 и IA-32 (октябрь 2019 г.) в разделе 4.1.1 «Выравнивание слов, двойных слов, четверных слов и двойных четырехслов»:

«Слова, двойные слова , и четверные слова не должны быть выровнены в памяти по естественным границам. Естественными границами для слов, двойных слов и четверных слов являются адреса с четными номерами, адреса, делимые на четыре, и адреса, делимые на восемь, соответственно. "

Но в следующем абзаце в руководстве говорится:

«Некоторые инструкции, которые работают с двойными четверными словами, требуют, чтобы операнды памяти были выровнены по естественной границе. Эти инструкции генерируют исключение общей защиты (#GP), если указан невыровненный операнд. Естественной границей для двойного четверного слова является любой адрес, делимый на 16. "

Я просто расположил свой раздел данных так, чтобы выровнять его по 64-байтовым границам и организовать все переменные dq вместе для установки в одной строке кэша. Вот первые восемь dqs:

section .data align=64
Return_Pointer_Array: dq 0, 0, 0
data_master_ptr: dq 0
n_ptr: dq 0
n_ctr: dq 0
n_length: dq 0
collect_ptr: dq 0

Раздел данных больше, чем этот, но я пропустил его через objconv Агнера Фога, и он не обнаружил проблем с выравниванием данных - в более ранней работе я обнаружил, что если есть Проблемы с выравниванием objconv тумана помечает их.

Мой вопрос: при каких обстоятельствах мне придется выровнять каждый dq по адресу, кратному 16, как Intel говорит в последнем абзаце, приведенном выше? Какие инструкции могут вызвать такое требование?

Ответы [ 2 ]

2 голосов
/ 12 июля 2020

Этот ответ был предоставлен @ RTC222 (OP) в качестве решения их собственного вопроса:

В руководстве Intel показано, что четверное слово (NASM dq - 8 байтов) должно быть выровнено по 8 байтов. Двойное четырехслово (NASM ddq - 16 байт) должно быть выровнено по 16 байт. Мой вопрос возник из-за неправильного прочтения dq как «двойного четверного слова», когда оно означает «определить четверное слово».

2 голосов
/ 11 июля 2020

У вас есть, например, MOVAPD (адрес памяти должен быть выровнен) и MOVUPD (адрес памяти не должен быть выровнен)

...