这是我想要做的:
add rsi, word [rsi+16]
我想读取rsi + 16地址的无符号短值。我想将此值添加到rsi。
以下是我在nasm中遇到的错误:
s2.asm:62: error: mismatch in operand sizes
这很奇怪。为什么nasm和我的cpu无法将16位添加到64位寄存器?
以下是我的工作:
mov rbx,0
mov bx, word [rsi+16]
add rsi, rbx
奇怪的是有最好的办法吗?
由于
答案 0 :(得分:3)
指令操作数必须具有相同的大小,除了符号和零扩展移动指令。
在您的情况下,您可以仅通过以下方式在一条指令中将16位添加到64位寄存器START: running experiment for a scale of N( 1 )
END: running experiment visits this many( 0 ) times the code.
START: running experiment for a scale of N( 2 )
END: running experiment visits this many( 0 ) times the code.
START: running experiment for a scale of N( 4 )
END: running experiment visits this many( 11 ) times the code.
START: running experiment for a scale of N( 8 )
END: running experiment visits this many( 322 ) times the code.
START: running experiment for a scale of N( 16 )
END: running experiment visits this many( 6580 ) times the code.
START: running experiment for a scale of N( 32 )
END: running experiment visits this many( 117800 ) times the code.
START: running experiment for a scale of N( 64 )
END: running experiment visits this many( 1989456 ) times the code.
START: running experiment for a scale of N( 128 )
END: running experiment visits this many( 32686752 ) times the code.
START: running experiment for a scale of N( 256 )
END: running experiment visits this many( 529904960 ) times the code.
START: running experiment for a scale of N( 512 )
END: running experiment visits this many( 8534108800 ) times the code.
START: running experiment for a scale of N( 1024 )
END: running experiment visits this many(136991954176 ) times the code.
START: running experiment for a scale of N( 2048 )
...
:
rsi
翻译成:
add si, word [rsi+16]
因为\x66\x03\x76\x10
寄存器(一个字的大小)是si
寄存器的一小部分,所以可以添加到rsi
而不会干扰si
的高位字节。
但只有当16位加法结果不溢出时,它才会像64位加一样工作。例如:
假设我们有rsi
,我们向esi=0x0000FFFF
添加1。我们有si
。并且CF将被设置,因为来自16位加法的进位。
如果你确实需要进位传播到RSI的其余部分,则零延伸到任何其他寄存器。
esi=0x00000000
翻译成:
movzx rax, word ptr [rsi+16]
add rsi, rax
同时Ped7g注意到:
但是当你使用仅由
\x48\x0F\xB7\x46\x10 \x48\x01\xC6
部分更新的完整rsi
时,你仍然会在一些架构上支付性能损失,因此在性能方面,使用一些备用寄存器来扩展仍然会更好首先将字值设置为64b,然后添加两个64b寄存器(如果使用si
)。
另请参阅Why doesn't GCC use partial registers?,了解编写SI然后在P6系列CPU上读取RSI时可能出现的性能问题,尽管这与shellcode漏洞有效负载无关。