我希望以尽可能少的汇编代码来反转字符串。
由于缺乏Unicorn支持,我只能使用 SSSE3 扩展或更少。我试过访问 ymm & zmm 指令,但每次都会中断。
尽管 SSSE3 指令更简洁,但pshufb
用于对 128 位 XMM 寄存器进行字节反转的 16 字节控制向量仍然占用 16 字节并且使其更长。我对任何想法持开放态度,但以下是我的最佳尝试。
我需要 32 字节或更少,越小越好。到目前为止,我得到的最好的是 42,但那是我假设 rdx(如果使用 x86,则为 ecx)中的字符串大小为 30。
理想情况下,它将能够通过检查空终止符来动态获取大小。
字符串地址位于 rdx 内部(如果使用 x86,则为 ecx)。
附加限制:不使用堆栈空间。此代码块必须在没有 RSP 指向可用堆栈内存的情况下运行。
标准 x86 / 64 - 42 字节
; get values in registers
mov rax, [rdx]
mov rbx, [rdx + 8]
mov rcx, [rdx + 16]
mov r8, [rdx + 24]
; swap bytes around
bswap rax
bswap rbx
bswap rcx
bswap r8
; shift it right by 2 because of the nulls
sar r8, 16
; put it back
mov [rdx], r8
mov [rdx + 0x6], rcx
mov [rdx + 0xE], rbx
mov [rdx + 0x16], rax
SSE3 - 62 字节(因为是字节数组,否则为 46)
movdqu xmm3, [rip + 0x27]
movdqu xmm0, [rdx]
movdqu xmm1, [rdx] + 0x10
pshufb xmm0,xmm3
pshufb xmm1,xmm3
movdqu [rdx], xmm1
movdqu xmm1, [rdx+0x2]
movdqu [rdx], xmm1
movdqu [rdx+0xE], xmm0
hlt
; this would be tacked on to the end of the assembly as the rip + 0x27 value
\x00\x0F\x0E\x0D\x0C\x0B\x0A\x09\x08\x07\x06\x05\x04\x03\x02\x01