根据此链接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
我不明白为什么它不起作用
答案 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时,存储转发可以从宽向量存储到整数加载。