web-dev-qa-db-fra.com

x86_64 ASM - octets maximum pour une instruction?

Quel est le nombre maximum d'octets qu'une instruction complète nécessiterait dans X64 Code ASM?

Quelque chose comme un saut à l'adresse peut occuper 9 octets, je suppose: FF 00 00 00 11 12 3f 1f Mais je ne sais pas si c'est le nombre maximal d'octets qu'une instruction x64 peut utiliser

31
Johnny Pauling

Les questions sont , quelle est la plus longue instruction possible dans l'ensemble d'instructions X86?

Réponse: Vous pouvez former une instruction X86 valide avec un nombre infini d'octets!

C'est vrai, Vous pouvez remplir un 64k complet ROM image avec une seule instruction valide. Pour être plus précis, il n'y a pas de limite à la longueur des instructions 8086. Frais! Malheureusement, les variantes de la Journée moderne d'I386 lancent une faute de protection générale lorsque vous essayez de décoder des instructions de plus de 15 octets.

Alors, qu'est-ce que une instruction infiniment-longue et valide 8086 est-elle ressemblant? Un peu ennuyeux, en fait. Vous ne pouvez former qu'une instruction infiniment longue en utilisant des préfixes redondants devant sur les opcodes. Les préfixes d'instructions sont des octets pré-attendu au début d'une instruction capable de modifier la taille d'adresse par défaut, la taille des données ou les registres de segment utilisés par une instruction.

Par exemple, vous pouvez prendre l'instruction inoffensive:

89 E5              mov %sp,%bp

Et transformez-le en une très longue instruction:

66 66 66 66 … 66 66 89 E5                mov %sp,%bp

Maintenant c'est juste le mal.

https://web.archive.org/web/20131109063453/https://www.onlineSassassembler.com/blog/?p=2


Une autre longue instruction sans répétition de préfixes

Dans certains cas, il est possible de coder des instructions valides dépassant la limite de longueur traditionnelle de 15 octets. Par exemple:

  ; 16-bit mode
  F2 F0 36 66 67 81 84 24 disp32 imm32 =  xaquire lock add [ss:esp*1+disp32],imm32
  F3 F0 36 66 67 81 84 24 disp32 imm32 = xrelease lock add [ss:esp*1+disp32],imm32

  ; 16-bit mode
  36 67 8F EA 78 12 84 24 disp32 imm32 = lwpins eax,[ss:esp*1+disp32],imm32
  36 67 8F EA 78 12 8C 24 disp32 imm32 = lwpval eax,[ss:esp*1+disp32],imm32
  36 67 8F EA 78 10 84 24 disp32 imm32 =  bextr eax,[ss:esp*1+disp32],imm32

  ; 64-bit mode
  64 67 8F EA F8 12 84 18 disp32 imm32 = lwpins rax,[fs:eax+ebx+disp32],imm32
  64 67 8F EA F8 12 8C 18 disp32 imm32 = lwpval rax,[fs:eax+ebx+disp32],imm32
  64 67 8F EA F8 10 84 18 disp32 imm32 =  bextr rax,[fs:eax+ebx+disp32],imm32

http://www.sandpile.org/x86/opc_enc.htm

26
phuclv

Du manuel du développeur de logiciels Intel® 64 et IA-32 Architectures:

2.3.11 Durée d'instruction AVX

La longueur maximale d'une instruction Intel 64 et IA-32 reste 15 octets.

Vous pouvez construire des instructions qui coderaient à plus de 15 octets, mais de telles instructions seraient illégales et ne seraient probablement pas exécutées.

16
nneonneo