에서 인텔 설명서의 x86-64에 투어 , 본인은
아마도 가장 놀라운 사실은 같은 명령어가
MOV EAX, EBX
상위 32 비트RAX
레지스터 를 자동으로 제로화 한다는 것입니다 .
동일한 소스에서 인용 된 인텔 문서 (3.4.1.1 수동 기본 아키텍처의 64 비트 모드에서 범용 레지스터)는 다음과 같이 알려줍니다.
- 64 비트 피연산자는 대상 범용 레지스터에서 64 비트 결과를 생성합니다.
- 32 비트 피연산자는 대상 범용 레지스터에서 64 비트 결과로 0 확장 된 32 비트 결과를 생성합니다.
- 8 비트 및 16 비트 피연산자는 8 비트 또는 16 비트 결과를 생성합니다. 대상 범용 레지스터의 상위 56 비트 또는 48 비트 (각각)는 연산에 의해 수정되지 않습니다. 8 비트 또는 16 비트 연산의 결과가 64 비트 주소 계산 용인 경우 레지스터를 전체 64 비트로 명시 적으로 부호 확장합니다.
x86-32 및 x86-64 어셈블리에서 다음과 같은 16 비트 명령어
mov ax, bx
eax의 상위 단어가 0이되는 이런 종류의 "이상한"동작을 표시하지 마십시오.
따라서이 행동이 도입 된 이유는 무엇입니까? 언뜻보기에는 비논리적으로 보입니다 (하지만 x86-32 어셈블리의 단점에 익숙하기 때문일 수 있습니다).
r32
는 병합이 아니라 높은 32를 0으로합니다. 예를 들어 일부 어셈블러는 64 비트 대상 버전이 동일하게 동작하기 때문에 REX를 절약하면서로 대체 pmovmskb r64, xmm
됩니다 pmovmskb r32, xmm
. 매뉴얼 의 Operation 섹션 에는 32 / 64bit dest 및 64 / 128 / 256b 소스의 6 가지 조합이 모두 별도로 나열되어 있지만 r32 형식의 암시 적 제로 확장은 r64 형식의 명시 적 제로 확장을 복제합니다. HW 구현에 대해 궁금합니다 ...
xor eax,eax
또는 xor r8d,r8d
RAX 또는 R8을 0으로 만드는 가장 좋은 방법입니다 ( RAX에 대한 REX 접두사를 저장하고 64 비트 XOR은 Silvermont에서 특별히 처리되지도 않음). 관련 : Haswell / Skylake의 부분 레지스터는 정확히 어떻게 수행됩니까? AL을 작성하는 것은 RAX에 대한 잘못된 종속성을 가지고있는 것으로 보이며 AH는 일관성이 없습니다