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

Memory 如何将值2^128-1存储在内存中(16字节)?,memory,assembly,nasm,Memory,Assembly,Nasm,根据此链接,我们可以使用此约定存储数字: 16字节(128位):oword、DO、RESO、DDQ、RESDQ 我尝试了以下方法: section .data number do 2538 不幸的是,返回以下错误: Integer supplied to a DT, DO or DY instruction 我不明白为什么它不起作用如果你的汇编程序不支持带有do的128位整数常量,那么你可以通过将常量分成两个64位的两半来实现同样的效果 section .data number

根据此链接,我们可以使用此约定存储数字: 16字节(128位):oword、DO、RESO、DDQ、RESDQ

我尝试了以下方法:

section .data
   number do 2538
不幸的是,返回以下错误:

Integer supplied to a DT, DO or DY instruction

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

如果你的汇编程序不支持带有
do
的128位整数常量,那么你可以通过将常量分成两个64位的两半来实现同样的效果

section .data
    number do 0x000102030405060708090a0b0c0d0e0f
可以作为

section .data
    number dq 0x08090a0b0c0d0e0f,0x0001020304050607

如果您的汇编程序不支持带有
do
的128位整数常量,那么您可以使用
dq
将常量拆分为两个64位的两半,例如

section .data
    number do 0x000102030405060708090a0b0c0d0e0f
可以作为

section .data
    number dq 0x08090a0b0c0d0e0f,0x0001020304050607

除非其他代码需要在内存中使用它,否则动态生成一个所有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
另见


对于您在注释中描述的用例,没有理由在
.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位的立即常数(对于数据或地址),它只涉及缓存中已热的内存(堆栈的底部)。是的,当
某些函数分别解除RDI和RSI的引用时,存储转发确实可以从宽向量存储到整数加载。

除非某些其他代码在内存中需要它,否则动态生成所有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
另见


对于您在注释中描述的用例,没有理由在
.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位的立即常数(对于数据或地址),它只涉及缓存中已热的内存(堆栈的底部)。是的,当
某些函数分别引用RDI和RSI时,存储转发确实可以从宽向量存储到整数加载。

这些指令用于浮点数据,而不是整数。见:@PaulR,谢谢。有一个命令,我可以在内存分配中插入一个非常大的整数(最多2^128-1)?或者一个策略?如果你阅读了我在上面发给你的链接,你应该会发现你可以使用
DQ
来表示64位常量,那么就用其中的两个来表示128位吧?另外,可能只是您使用的是旧版本的NASM—显然较新的版本支持128位常量,使用
oword
DO
@PaulR已经想到了这一点。问题是我必须提供一个库,其中我必须从存储在内存中的两个128位数字进行加法。描述如下:“使用“小端”约定将数字写入内存(16字节)。创建一个过程,其中两个长数字的地址分别位于RDI RSI中。结果写入RDI地址的长数字中”您可以看到,我不能在内存中使用两个不同的位置来存储一个数字,当然你可以:只定义两个64位常量,第一个包含LS 64位,第二个包含MS 64位-最终结果将与定义单个128位常量相同。或者升级到更新/更好的汇编程序,以较容易的为准。这些指令用于浮点数据,而不是整数。见:@PaulR,谢谢。有一个命令,我可以在内存分配中插入一个非常大的整数(最多2^128-1)?或者一个策略?如果你阅读了我在上面发给你的链接,你应该会发现你可以使用
DQ
来表示64位常量,那么就用其中的两个来表示128位吧?另外,可能只是您使用的是旧版本的NASM—显然较新的版本支持128位常量,使用
oword
DO
@PaulR已经想到了这一点。问题是我必须提供一个库,其中我必须从存储在内存中的两个128位数字进行加法。描述如下:“使用“小端”约定将数字写入内存(16字节)。创建一个过程,其中两个长数字的地址分别位于RDI RSI中。结果写入RDI地址的长数字中”您可以看到,我不能在内存中使用两个不同的位置来存储一个数字,当然你可以:只定义两个64位常量,第一个包含LS 64位,第二个包含MS 64位-最终结果将与定义单个128位常量相同。或者升级到更新/更好的汇编程序,以较容易的为准。谢谢。如果其他人有此问题,您也可以执行以下操作来完成此任务:
部分。bss编号:resb 16;或编号:reso 1
然后:
mov qword[编号],0x08090a0b0c0d0e0f mov qword[编号+8],0x0001020304050607
谢谢。如果其他人有此问题,您也可以执行以下操作来完成此任务:
部分。bss编号:resb 16;或编号:reso 1
然后:
mov qword[编号],0x08090a0b0c0d0e0f mov qword[编号+8],0x0001020304050607