【问题标题】:How can I store the value 2^128-1 in memory (16 bytes)?如何将值 2^128-1 存储在内存中(16 字节)?
【发布时间】:2017-04-03 23:21:53
【问题描述】:

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

我尝试了以下方法:

section .data
   number do 2538

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

Integer supplied to a DT, DO or DY instruction

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

【问题讨论】:

  • 这些指令用于浮点数据,而不是整数。见:nasm.us/doc/nasmdoc3.html#section-3.4.6
  • @PaulR 谢谢。有一个命令可以在内存分配中插入一个非常大的整数(最多 2^128-1)?还是策略?
  • 如果您阅读了我在上面发送给您的链接,那么您应该看到您可以将DQ 用于 64 位常量,所以也许只需将其中两个用于 128 位?也可能只是您使用的是旧版本的 NASM - 显然较新的版本使用 owordDO 支持 128 位常量。
  • @PaulR 已经想到了。问题是我必须提供一个库,我必须从存储在内存中的两个 128 位数字中进行加法运算。描述如下:“使用“小端”约定将数字写入内存(16 个字节)。创建一个过程,其中两个长数字的地址分别在 RDI 和 RSI 中。结果写入长数字中RDI 中的地址”你怎么看,我不能在内存中使用两个不同的地方来只存储一个数字
  • 当然可以:只需定义两个 64 位常量,第一个包含 LS 64 位,第二个包含 MS 64 位 - 最终结果将与您定义的相同单个 128 位常量。或者升级到更新/更好的汇编器,以更容易者为准。

标签: memory assembly nasm


【解决方案1】:

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


对于您在 cmets 中描述的用例,没有理由弄乱.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 时,存储转发确实可以从宽向量存储到整数加载。

【讨论】:

    【解决方案2】:

    如果您的汇编程序不支持使用 do 的 128 位整数常量,那么您可以使用 dq 通过将常量拆分为两个 64 位半部分来实现相同的目的,例如

    section .data
        number do 0x000102030405060708090a0b0c0d0e0f
    

    可以实现为

    section .data
        number dq 0x08090a0b0c0d0e0f,0x0001020304050607
    

    【讨论】:

    • 谢谢。如果其他人遇到此问题,您也可以完成此任务,执行以下操作:SECTION .bss number: resb 16 ;or number: reso 1 然后:mov qword[number], 0x08090a0b0c0d0e0f mov qword[number+8], 0x0001020304050607
    猜你喜欢
    • 2017-04-03
    • 1970-01-01
    • 2017-12-18
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 2017-03-14
    • 1970-01-01
    相关资源
    最近更新 更多