programing

x86_64 ASM - 명령어의 최대 바이트 수?

testmans 2023. 8. 18. 21:03
반응형

x86_64 ASM - 명령어의 최대 바이트 수?

x64 asm 코드에서 완전한 명령에 필요한 최대 바이트 수는 얼마입니까?

주소로 점프와 같은 것이 최대 9바이트를 차지할 수 있습니다.FF 00 00 00 11 12 3F 1F 하지만 x64 명령이 사용할 수 있는 최대 바이트 수인지 모르겠습니다.

x86 명령어 집합(16, 32 또는 64비트, 모든 변형/모드)은 명령어가 최대 15바이트임을 보장합니다.그 이상의 작업은 "잘못된 작업 코드"를 제공합니다.중복 접두사(예: 여러 개의 0x66 또는 0x67 접두사)를 사용하지 않고는 이를 달성할 수 없습니다.

실제로 64비트를 데이터 항목으로 사용하는 유일한 명령은 등록할 로드 상수입니다(Intel 구문:mov reg, 12345678ABCDEF00hat&t 구문:movabs $12345678ABCDEF00, %reg) - 따라서 31비트 이상을 전진/후진하려면 대상 위치를 레지스터로 이동한 다음 레지스터로 호출/후진합니다.32비트를 사용하면 즉시 및 변위(상대 점프 및 주소 지정 모드)가 64비트 모드에서 많은 지침에 대해 4바이트를 절약할 수 있습니다.

문제는 x86 명령어 집합에서 가능한 가장 긴 명령어가 무엇인가 하는 입니다.

답변: 바이트가 무한대인 유효한 x86 명령어를 만들 수 있습니다!

맞습니다, 유효한 지침 하나로 64K ROM 이미지 전체를 채울있습니다.좀 더 구체적으로 말하자면, 8086 명령어의 길이에는 제한이 없습니다.멋지네요! 안타깝게도 오늘날의 i386 변종은 15바이트보다 긴 명령을 디코딩하려고 할 때 일반적인 보호 결함을 발생시킵니다.

그렇다면 무한히 길지만 유효한 8086 명령어는 어떻게 생겼을까요?사실 좀 지루해요.당신은 opcode의 앞에 중복된 접두사를 사용해야만 무한히 긴 명령어를 형성할 수 있습니다.명령 접두사는 명령어에 사용되는 기본 주소 크기, 데이터 크기 또는 세그먼트 레지스터를 수정할 수 있는 명령어 시작 전에 추가되는 바이트입니다.

예를 들어 무해한 모양의 지침을 취할 수 있습니다.

89 E5              mov %sp,%bp

그리고 그것을 정말 긴 교육으로 바꿔보세요.

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

그건 그냥 사악한 겁니다.

https://web.archive.org/web/20131109063453/https ://www.onlinedisassembler.com/blog/ ?p=23


반복 접두사가 없는 긴 또 다른 지침

경우에 따라 기존의 15바이트 길이 제한을 초과하는 유효한 명령을 인코딩할 수 있습니다.예:

  ; 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

Intel® 64 및 IA-32 Architectures 소프트웨어 개발자 매뉴얼:

2.3.11 AVX 명령 길이

Intel 64 및 IA-32 명령의 최대 길이는 15바이트로 유지됩니다.

15바이트 이상으로 인코딩되는 명령을 구성할 수 있지만 이러한 명령은 불법이며 실행되지 않을 수 있습니다.

언급URL : https://stackoverflow.com/questions/14698350/x86-64-asm-maximum-bytes-for-an-instruction

반응형