Согласно комбинированным томам Руководства разработчика программного обеспечения для архитектур 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 говорит в последнем абзаце, приведенном выше? Какие инструкции могут вызвать такое требование?