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, 12345678ABCDEF00h
at&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
'programing' 카테고리의 다른 글
레이블과 텍스트 영역을 정렬하려면 어떻게 해야 합니까? (0) | 2023.08.23 |
---|---|
모바일 사파리를 위한 html5 웹 앱이 Photos.app에서 이미지를 업로드합니까? (0) | 2023.08.23 |
특정 실행자와 함께 Spring의 @Scheduled 주석 사용 (0) | 2023.08.18 |
아리아 로그 마리아 사용 안 함DB (0) | 2023.08.18 |
Excel에서 SQL Server 2005로 가져오는 잘라내기 오류 (0) | 2023.08.18 |