Невозможно скомпилировать ассемблерный код с размером операнда 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, кроме устаревшего SSEmaskmovdqu
который имеет семантику удаления кеша NT. Думаю, это делает его особенно интересным для Xeon Phi KNL.)
Вы можете указать
oword
на любом из них, чтобы убедиться, что размер доступа к памяти соответствует вашему мнению. (то есть, чтобы NASM проверил это за вас.)