2014-08-30 2 views
0

Intel 수동 볼륨 3, 32E 모드에서 CR0,2,3,4 + CR8 만 있고 CR1은 예약되어 있습니다. 그러나 제목에서 명령을 컴파일 할 때 N은 임의의 값일 수 있습니다. < 16. obj 파일을 해체하면 N < 일 때 참조에 따라 인코딩된다는 것을 알게되었습니다. 그리고 7 < N < 16 일 때 이전과 동일하게 인코딩되지만 LOCK 접두어가 추가되었습니다 (MOV cr 버전에 NOTED로 "직렬화 명령어"로 만드십시오).왜 crN이 존재하지 않을 때 "mov % crN, % eax"를 인코딩 할 수 있습니까?

불만없이 인코딩되어 있으며이 인코딩이 합법적 인 이유는 무엇입니까? CR이 실제로 존재합니까 아니면 다른 레지스터의 별명입니까?

+0

잘못된 소스 코드를 주었을 때 컴파일러가 경고를 표시하지 않은 이유는 무엇입니까? 어떤 컴파일러를 사용합니까? (예 : [FASM] (http://flatassembler.net/download.php) → SOURCE → TABLES.INC는'cr0'..cr9' 만 인식합니다) – xmojmr

답변

0

I. "LOCK"접두어에 관하여 : 현재의 x86은 고정 된 접두어 의미를 가지고 있지 않습니다. 모두 (LOCK, REP, CS 세그먼트 등)을 의미하는 1 바이트 접두어가 있지만 후자는 직접 감각을 가진 지침에만 적용됩니다. 그러나 지시가 그러한 감각을 갖지 않을 때 다른 용도가 있습니다. 예를 들어, BSR/BSF가 LZCNT/TZCNT로 각각 변환하기 전에 F3 (REPE)을 누릅니다. 일반 메모리 판독 값의 경우 동일한 REPE가 XRELEASE로 변환됩니다. 분기 지침이 예측 힌트 (Pentium 4 라인에서 사용됨)이기 전에 세그먼트 접두사 2Eh 및 3Eh 따라서 기본 접두사 역할을 철저한 원칙으로 취급하지 마십시오.

II. 진행중인 질문 : 예약 CR이 이 아니고으로 인코딩되어야하는 이유는 무엇입니까? 나는 이것에 어떠한 주요한 위반도 보지 못했다. 비유하자면 기존 포트만 인코딩하기 위해 IO 명령어가 필요하지 않은 이유는 무엇입니까? IO 공간이나 MSR 공간과 같은 방식으로 CR 공간을 받아 들일 수 있습니다. 더 이상 문제가되지 않습니다. :)

+0

LOCK은 REX.R 대신에 AMD에서 사용됩니다 CR8과 CR0를 구분하십시오. 반면에 Intel은 LOCK 접두어를 사용하면 #UD가 발생한다고 지정합니다. 공급 업체 특정 문제 인 것 같습니다. 여기에서 토론을 참조하십시오. https://sourceforge.net/p/nasm/mailman/nasm-devel/thread/[email protected]/ – vitsoft

관련 문제