将16位添加到64位寄存器

时间:2018-03-07 13:18:41

标签: assembly nasm shellcode

这是我想要做的:

   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

奇怪的是有最好的办法吗?

由于

1 个答案:

答案 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漏洞有效负载无关。