의 [인텔 x86-64 둘러보기와 설명서] (http://x86asm.net/articles/x86-64-tour-of-intel-manuals/), I read
>. 아마도 가장 놀라운 사실은 같은 상위 32 비트 명령어 MOV EAX, EBX '의' '' 자동으로 제로는 라스 장부를요.
인텔 설명서 (3.4.1.1 범용 레지스터는 64 비트 모드로 수작업식 의 기본 아키텍처입니다) 소스 말을 따르면, 동시에 미국:
>. 64-비트 피연산자로 64-비트 발령합니다 발생할 경우 대상 범용 레지스터. >. 32 비트 레지스터 32 비트, 64 비트 범용 발령합니다 피연산자로 제로 확장됨 발생할 경우 그 대상. >. * 8 비트와 16 비트 피연산자로 발령합니다 8 비트 또는 16 비트 결과. 상위 56 비트 범용 등록 대상 또는 48 비트 (각각) 작업을 통해 수정할 수 없습니다. 8 비트 또는 64 비트 주소 계산 결과가 16 비트 작업을 위한 고안되었습니다 명시적으로 예증으로 확장하십시오 전체 등록 64 비트.
그리고 x86-64 의 16 비트 같은 지침을 x86 32 어셈블리나
mov ax, bx
따라서: 이 행동을 도입된 이유가 무엇입니까? 첫 눈에 불합리한 한 것으로 보인다 (쿼크 사용할 수 있는 것은 있을 수 있지만 나는 x86 32 조립품을 있다).
I& 행한 연설에서, 그들을 위해 AMD 나 # 39 m not, 하지만 난 이 같은 방식으로. # 39, t 의존도가 높은 반단면 doesn& 제로화가 만들기 때문에 이전 값으로, 해당 CPU 에 기다려야 할 것이라고 말했다. 레지스터 이름 변경을 이 메커니즘을 될 경우, t # 39 로 죽이려하겠어요 본질적으로 wasn& 수행되 이쪽요.
이 방법을 사용하여 명시적으로 필요 없이 빠른 코드를 작성할 수 있습니다 64 비트 모드에서 32 비트 값을 분할합니다 종속물과의 all the time. 32 비트, 64 비트 모드에서 모든 단일 명령 없이 이 행동을 할 수 있는 경우에도 높은 부품 아니하였으매 들어온넘 생각하신거야 대기 전에 거의 사용할 수 없다. (Int '하고' 그들이실천하는 캐시에는 공간 및 메모리 대역폭을 64-비트 것이다. 32 비트 및 64 비트 x86-64 가장 효율적으로 지원하여 피연산자 크기)
그 이상한 동작을 8 및 16 비트 피연산자 크기는 1. 그 이유 중 하나는 종속 madness 는 16 비트 지침은 이제 피했다. 이 8 비트 및 16 비트 x86-64 상속됨 8086 에서 16 비트 레지스터 8 과 동일한 방식으로 작동하는 것으로 보고, 386 의 64 비트 모드에서 때와 같이 32 비트 모드에서.
자세한 내용은 https://stackoverflow.com/questions/41573502/why-doesnt-gcc-use-partial-registers 실무적인 쓰는 방법은 8 및 16 비트 레지스터 (백업본과 이후의 판독합니다 전체 등록) 에 의해 처리되는 부분 실제 cpu.
이는 단순히 설명에 공간을 절약할 수 있고, 명령어 집합. 작은 값을 사용하여 64-비트 장부를요 기존 즉시인지 이동할 수 있습니다 (32 비트) 명령어.
또한, MOV 라스 인코드할 발생하는 절약해줍니다 8 바이트) 의 값을 eax, '때', '' 42tb mov 42tb 다시 사용할 수 있습니다.
이 최적화됩니다 중요하지 않은 16 비트 및 8 개, ops (있기 때문에 소형) 및 규칙 변경 오래된 코드를 분할합니다 좁히어 수도 있다는 것이다.