2009-05-29 2 views
6

다음과 같은 코드가 있습니다.mov 명령어가 두 세그먼트 레지스터 대신 ax를 직접 사용하는 이유는 무엇입니까?

mov ax, cs 
mov ds, ax 
mov es, ax 

왜 이렇게 압축 할 수 없습니까?

mov ds, cs 
mov es, cs 

누산기 레지스터를 사용한 이후로 첫 번째 방법이 빠릅니까? 하지만 cs와 ds는 레지스터 세그먼트이므로 직관적으로 보일 수 없습니다. 아니면 내가 모르는 몇 가지 제한 사항이 있습니까?

나는 그런데 냅을 사용하고 있습니다.

답변

9

세그먼트 레지스터에 대한 세그먼트를 mov 세그먼트로 나눌 수 없습니다. 지침이 없습니다.

+0

언제합니다. 먼저 나는 너의 반응을 읽었다. ieve,하지만 NASM의 설명서에서, 확실히 mov reg_dseg, reg_cseg 명령은 없습니다. – samoz

+0

이것은 이유가 아니며 결과입니다. –

+1

무엇? 네가 뭘 의미하는지 이해가 안돼. – samoz

1

모든 지시 사항에 대한 마이크로 코드 용 프로세서 공간이 너무 많습니다. 그래서 일반적으로 하나의 일반적인 명령어는 드물게 사용되는 운영 호수의 세그먼트 레지스터 변경을위한 몇 가지 특수 목적보다 선호됩니다. 또한 일부 프로세서의 경우 명령어 수는 아키텍처에 의해 절대적으로 제한됩니다. 예를 들어 원본 8080 프로세서는 모두 1 바이트로 인코딩 된 op 코드가 있어야하므로 256 가지 명령어로 제한됩니다.

+0

이유에 대한 이유를 설명하기 위해 +1 – dss539

1

정말 어셈블리 언어가 아니지만 이러한 작업을 방해하는 기본 컴퓨터 언어입니다.

어셈블리는 읽기 쉬운 단어 또는 니모닉으로 구성되지만 실제로는 기계 코드의 1과 0을 직접 나타냅니다. x86 CPU에서 각 명령어는 일반적으로 개별 바이트가 포함 된 일련의 바이트 또는 의미가있는 바이트 내의 비트로 구성됩니다. 특정 비트는 명령어를 나타내고 다른 비트는 addressing mode을 나타냅니다. 예제와 같은 레지스터 주소 지정 모드에서 일부 비트는 mov 명령어의 소스 및 대상으로 사용될 특정 레지스터를 나타냅니다.

이제 x86 제품군의 프로세서는 CPU 아키텍처가 더 단순한 1970 년대로 거슬러 올라갑니다. 그 당시에는 의 개념이 중요했습니다. ax은 16 비트 x86 누산기입니다. 모든 계산은이 레지스터에 구축되거나 축적되어 모든 명령에서 사용 가능합니다. 다른 범용 레지스터는보다 제한된 사용 범위를가집니다.

명령은 바이트를 기반으로하므로 명령 디코딩을 빠르게 유지하기 위해 가능한 한 명령을 나타 내기 위해 원하는 바이트 수를 원했습니다. 가능한 한 많은 지시 사항을 가능한 한 짧게 유지하기 위해 누적 기의 사용이 중심이됩니다.

모토로라 680x0과 같은 최신 CPU의 범용 레지스터는 이전에 누적 기의 도메인이었던 기능이 더 많습니다. RISC CPU에서 모든 레지스터는 축약 형만큼 유연합니다. 필자는 64 비트 모드에서 현재의 x86/amd64 명령어 세트가 훨씬 덜 제한적이라고 들었습니다.

+0

그런 레지스터가 그런 식으로 사용될 수있는 x86_64까지는 아닙니다. 32 비트 x86 대부분의 레지스터가 범용 레지스터로 더 많거나 적게 동작 할 수 있기 때문에 –

+0

질문은 누락 된 레지스터뿐만 아니라 세그먼트 레지스터에 관한 것이 었습니다. 나는 끔찍한 방법으로 메모리가 작동했기 때문에 x86 어셈블리에 들어간 적이 없었지만 세그먼트 레지스터와 물건으로 작업했습니다. 좋은 평판 메모리 모델이 있다는 사실에 지금까지 작업하는 것이 훨씬 더 좋다고 생각합니다. – hippietrail

+0

나는 x86 어셈블리를 너무 많이 사용하지는 않는다. 그러나 x86에도 여전히 세그먼트 명령어가 있습니다. x86의 주소 공간은 평평하지 않다 –

1

Intel Manual Volume 2 Instruction Set Reference - 325383-056US September 2015 "MOV Move"열 "Instruction"을 확인하십시오.

mov r/m16, Sreg 

와 "3.1.1

레지스터에 16 비트는 MOV

에서 인코딩된다.오피 요약표 "3 명령어 열은 설명 :

  • R/M16 - 명령어 오퍼랜드 크기 속성 16 비트에 사용되는 단어 범용 레지스터 또는 메모리 오퍼랜드 단어 범용 레지스터이다. :.., CX, DX, BX, SP, BP, SI, DI
  • Sreg AX - 더 mov Sreg, Sreg 버전이 없기 때문에 세그먼트 레지스터

따라서 mov ds, cs은 encodable하지

관련 문제