Если какой-либо другой код не нуждается в памяти, это дешевле генерировать на лету вектор со всеми 128 бит установлен в 1 = 0xFF ... повторяющимися = 2^128-1:
pcmpeqw xmm0, xmm0 ; xmm0 = 0xFF... repeating
;You can store to memory if you want, e.g. to set a bitmap to all-ones.
movups [rdx], xmm0
Смотрите также What are the best instruction sequences to generate vector constants on the fly?
Для прецедента, описанного в комментариях, нет причин связываться со статическими данными в .data
или .rodata
или статическим хранилищем в .bss
. Просто создайте пространство в стеке и пропустите указатели на это.
call_something_by_ref:
sub rsp, 24
pcmpeqw xmm0, xmm0 ; xmm0 = 0xFF... repeating
mov rdi, rsp
movaps [rdi], xmm0 ; one byte shorter than movaps [rsp], xmm0
lea rsi, [rdi+8]
call some_function
add rsp, 24
ret
Обратите внимание, что этот код не имеет прямых констант больше, чем 8 бит (для данных или адреса), и это касается только память, которая уже жарко в кэше (в нижней части стека). И да, хранение-пересылка работает из широких векторных хранилищ до целых нагрузок, когда some_function
разыменовывает RDI и RSI отдельно.
Эти директивы предназначены для данных с плавающей точкой, а не целых чисел. См .: http://www.nasm.us/doc/nasmdoc3.html#section-3.4.6 –
@PaulR Спасибо. Есть команда, с помощью которой я могу вставить очень большое целое число (до 2^128-1) в выделение памяти? Или стратегия? – Davide
Если вы прочитали ссылку, которую я отправил вам выше, вы должны увидеть, что вы можете использовать 'DQ' для 64-битной константы, поэтому просто используйте два из них для 128 бит. Также может случиться, что вы используете старую версию NASM - видимо, более новые версии поддерживают 128-битные константы, используя 'oword' или' DO'. –