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

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

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

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

1 ответ

Решение

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

Если вы действительно хотите указать размер операнда, имя для 128-битного кода будет следующим: 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 vs. vs. 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 проверил это за вас.)

Другие вопросы по тегам