Je cherche à inverser une chaîne de caractères en utilisant le moins de code assembleur possible.
Je ne peux utiliser que des extensions SSSE3 ou moins en raison du manque de support d' Unicorn. J'ai essayé d'accéder aux instructions ymm & zmm mais ça plante à chaque fois.
Même si les instructions SSSE3 sont plus concises, le vecteur de contrôle de 16 octets pshufb
pour inverser les octets d'un registre XMM de 128 bits prend toujours 16 octets et rend le code encore plus long. Je suis ouvert à toutes les idées mais voici mes meilleures tentatives.
J'ai besoin de 32 octets ou moins et moins c'est mieux. Le meilleur que j'ai obtenu jusqu'à présent est 42 mais c'est en supposant que la taille de la chaîne dans rdx (ou ecx si on utilise x86) est de 30.
Idéalement, il devrait pouvoir obtenir dynamiquement la taille en vérifiant un caractère nul.
L'adresse de la chaîne est située dans rdx (ou ecx si on utilise x86).
Restriction supplémentaire : pas d'utilisation de l'espace de la pile. Ce bloc de code doit s'exécuter sans que RSP pointe vers une mémoire de pile utilisable.
Standard x86 / 64 - 42 octets
; obtenir les valeurs dans les registres
mov rax, [rdx]
mov rbx, [rdx + 8]
mov rcx, [rdx + 16]
mov r8, [rdx + 24]
; inverser les octets
bswap rax
bswap rbx
bswap rcx
bswap r8
; décaler vers la droite de 2 à cause des caractères nuls
sar r8, 16
; remettre en place
mov [rdx], r8
mov [rdx + 0x6], rcx
mov [rdx + 0xE], rbx
mov [rdx + 0x16], rax
SSE3 - 62 bytes (à cause du tableau d'octets, sinon c'est 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
; ce serait ajouté à la fin de l'assemblage en tant que valeur rip + 0x27
\x00\x0F\x0E\x0D\x0C\x0B\x0A\x09\x08\x07\x06\x05\x04\x03\x02\x01