如何将值2 ^ 128-1存储在内存中(16字节)?

时间:2016-11-20 14:42:22

标签: memory assembly nasm

根据此链接What are the sizes of tword, oword and yword operands?,我们可以使用此约定存储数字: 16字节(128位):oword,DO,RESO,DDQ,RESDQ

我尝试了以下内容:

section .data
   number do 2538

不幸的是,以下错误会返回:

Integer supplied to a DT, DO or DY instruction

我不明白为什么它不起作用

2 个答案:

答案 0 :(得分:3)

如果你的汇编程序不支持带有do的128位整数常量,那么你可以通过将常量分成两个64位的一半来实现与dq相同的功能,例如。

section .data
    number do 0x000102030405060708090a0b0c0d0e0f

可以实现为

section .data
    number dq 0x08090a0b0c0d0e0f,0x0001020304050607

答案 1 :(得分: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时,存储转发可以从宽向量存储到整数加载。