Невозможно скомпилировать ассемблерный код с размером операнда xmmword с помощью nasm

Я пытался скомпилировать ассемблерный код, используя nasm (nasm -o file input.asm), и выдал ошибку в строке 2 в следующем фрагменте кода:

mov rsi, 0x400200
movdqu xmm0,xmmword [rsi]
nop

Я не уверен, что инструкции со 128-битными регистрами можно скомпилировать с помощью nasm, но есть ли другой способ скомпилировать с помощью nasm в тех случаях, когда задействованы 128-битные регистры?


person Goks    schedule 03.06.2021    source источник


Ответы (1)


Вам не нужно указывать размер операнда для операнда памяти,
просто используйте movdqu xmm0, [rsi] и пусть xmm0 подразумевает 128-битный размер операнда.
> NASM поддерживает инструкции SSE/AVX/AVX-512.

Если вы хотите указать размер операнда, имя для 128-битного числа будет oword, в соответствии с ndisasm, если вы ассемблируете эту инструкцию, а затем дизассемблируете полученный машинный код. oword = oct-word = 8x 2-байтовых слов = 16 байтов.


Обратите внимание, что GNU .intel_syntax noprefix (используемый objdump -drwC -Mintel) будет использовать xmmword ptr, в отличие от NASM.

Если вы действительно хотите использовать xmmword, %define xmmword oword вверху файла.

Размер операнда всегда подразумевается мнемоникой и/или другими регистровыми операндами для всех инструкций SSE/AVX/AVX-512; Я не могу придумать никаких инструкций, в которых вам нужно указать qword против oword против yword или что-то еще, как вы делаете с movsx eax, byte [rdi] против word [rdi]. Часто он имеет тот же размер, что и регистр, но бывают исключения с некоторыми инструкциями тасования/вставки/извлечения. Например:

  • SSE2 pinsrw xmm0, [rdi], 3 загружает word и объединяет его с байтами 6 и 7 xmm0.
  • SSE2 movq [rdi], xmm0 хранит младшую половину qword
  • SSE1 movhps [rdi], xmm0 хранит старшее qword
  • AVX1 vextractf128 [rdi], ymm0, 1 выполняет 128-битное хранение старшей половины
  • AVX2 vpmovzxbw ymm0, [rdi] выполняет расширение упакованного байта->слова из 128-битного исходного операнда памяти.
  • AVX-512F vpmovdb [rdi]{k1}, zmm2 сужает двойное слово до байтовых элементов (с усечением; другие версии делают насыщение) и выполняет 128-битное хранилище с маскированием на уровне байтов. (Один из немногих способов выполнить маскировку байтовой детализации без AVX-512BW, кроме устаревшего SSE maskmovdqu, который имеет семантику NT с вытеснением кеша. Так что я думаю, что это делает его особенно интересным для Xeon Phi KNL.)

Вы можете указать oword для любого из них, чтобы убедиться, что размер доступа к памяти соответствует вашим представлениям. (т. е. чтобы NASM проверил это для вас.)

person Peter Cordes    schedule 03.06.2021
comment
Это объясняет и решает мою проблему. Большое спасибо и за дополнительное пояснение. - person Goks; 03.06.2021