Davide
Davide

Reputation: 2124

How can I store the value 2^128-1 in memory (16 bytes)?

According to this link What are the sizes of tword, oword and yword operands? we can store a number using this convention: 16 bytes (128 bit): oword, DO, RESO, DDQ, RESDQ

I tried the following:

section .data
   number do 2538

Unfortunately the following error returns:

Integer supplied to a DT, DO or DY instruction

I don't understand why it doesn't work

Upvotes: 1

Views: 770

Answers (2)

Peter Cordes
Peter Cordes

Reputation: 364502

Unless some other code needs it in memory, it's cheaper to generate on the fly a vector with all 128 bits set to 1 = 0xFF... repeating = 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

See also What are the best instruction sequences to generate vector constants on the fly?


For the use-case you described in comments, there's no reason to mess with static data in .data or .rodata, or static storage in .bss. Just make space on the stack and pass pointers to that.

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

Notice that this code has no immediate constants larger than 8 bits (for data or addresses), and it only touches memory that's already hot in cache (the bottom of the stack). And yes, store-forwarding does work from wide vector stores to integer loads when some_function dereferences RDI and RSI separately.

Upvotes: 2

Paul R
Paul R

Reputation: 212979

If your assembler does not support 128 bit integer constants with do then you can achieve the same thing with dq by splitting the constant into two 64 bit halves, e.g.

section .data
    number do 0x000102030405060708090a0b0c0d0e0f

could be implemented as

section .data
    number dq 0x08090a0b0c0d0e0f,0x0001020304050607

Upvotes: 3

Related Questions