2016-11-20 5 views
1

По этой ссылке What are the sizes of tword, oword and yword operands? мы можем сохранить номер с помощью этой конвенции: 16 байт (128 бит): oword, DO, РЕСО, DDQ, RESDQКак сохранить значение 2^128-1 в памяти (16 байт)?

Я попробовал следующее:

section .data 
    number do 2538 

К сожалению следующие возвращается ошибка:

Integer supplied to a DT, DO or DY instruction 

Я не понимаю, почему он не работает

+0

Эти директивы предназначены для данных с плавающей точкой, а не целых чисел. См .: http://www.nasm.us/doc/nasmdoc3.html#section-3.4.6 –

+0

@PaulR Спасибо. Есть команда, с помощью которой я могу вставить очень большое целое число (до 2^128-1) в выделение памяти? Или стратегия? – Davide

+0

Если вы прочитали ссылку, которую я отправил вам выше, вы должны увидеть, что вы можете использовать 'DQ' для 64-битной константы, поэтому просто используйте два из них для 128 бит. Также может случиться, что вы используете старую версию NASM - видимо, более новые версии поддерживают 128-битные константы, используя 'oword' или' DO'. –

ответ

3

Если у наш ассемблер не поддерживает 128-битные целочисленные константы с do, тогда вы можете добиться того же самого результата с помощью dq, разделив константу на две 64-битные половины, например.

section .data 
    number do 0x000102030405060708090a0b0c0d0e0f 

может быть реализован как

section .data 
    number dq 0x08090a0b0c0d0e0f,0x0001020304050607 
+0

Спасибо. Если кто-то имеет эту проблему можно решить эту задачу, выполнив следующие действия: 'РАЗДЕЛ .bss номер: RESB 16, или номер: Ресо 1' И потом: ' мов QWORD [номер], 0x08090a0b0c0d0e0f мов QWORD [номер + 8], 0x0001020304050607' – Davide

2

Если какой-либо другой код не нуждается в памяти, это дешевле генерировать на лету вектор со всеми 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 отдельно.

 Смежные вопросы

  • Нет связанных вопросов^_^