좋아, 그래서 나는 AMD64 매뉴얼을 읽고 그것이 nop
실제로 이라는 것을 알았고 xchg eax, eax
, xchg
흥미로운 것을 발견했습니다. 레지스터를 지정하기 위한 명령으로 바이트가 인코딩될 수 있다는 것입니다(죄송합니다. 제 iPod을 사용하고 있습니다). :그림.
그래서 내가 궁금한 것은 작업할 바이트가 있는지 프로세서가 어떻게 알 수 있는지, 아니면 추가 레지스터가 rAX
실제로 여전히 1바이트가 되도록 하는 유형이어야 하는지 입니다.0x90
답변1
나는 xchg를 보고 흥미로운 것을 발견했습니다. 레지스터를 지정하기 위한 명령으로 바이트가 인코딩될 수 있다는 것입니다.
예, 이것이 대부분의 x86 명령어가 작동하는 방식입니다. 명령어는 한 번에 바이트 단위가 아닌 한 번에 32비트 또는 64비트(머신의 단어 길이)로 가져옵니다.
with XCHG
를 지정하면 (여기서는 32비트 시스템에 있고 64비트 시스템에 있음)은 입니다 . 왜냐하면 에 대한 레지스터 mux 코드가 (사실상 아무것도 하지 않는 1사이클 작업)이기 때문입니다. 마찬가지로 명령어는 ( 의 mux 코드 ) 로 어셈블됩니다 .rAX
rAX
rAX
EAX
RAX
0x90
rAX
0x00
XCHG rBX, rAX
0x93
rBX
0b011
opcode 인코딩은 설명서의 다른 곳에 나열되어야 합니다. 또는 x86 opcode 맵(모든 것이 함께 다중화되는 방식을 이해하는 데 도움이 됨)을 볼 수 있습니다. 다음에서 하나를 찾을 수 있습니다.Intel 64 및 IA-32 아키텍처 소프트웨어 개발자 매뉴얼(2권, 부록 A.3).
그래서 내가 궁금한 것은 작업한 후에 바이트가 있는지 프로세서가 어떻게 알 수 있는지, 아니면 추가 레지스터가 rAX 유형이어야 하여 실제로 여전히 1바이트 0x90이 되도록 하는지 여부입니다.
여기는 그 반대입니다. 64비트 모드의 경우 실제로접두사지시어 자체에 ( REX
접두사)를 나타냅니다. 프로세서는 접두사의 유무에 따라 무엇을 찾아야 할지 알고 있으며 REX
, 접두사가 없으면 명령은 여전히 입니다 0x90
.