MOV 명령이 왜 두 세그먼트 레지스터 대신에 AX를 사용하는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/928082

문제

나는 다음과 같은 코드를 본다.

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

왜 이것을 압축 할 수 없는가 :

mov ds, cs
mov es, cs

Accumulator Register를 사용한 이후 첫 번째 방법이 더 빠릅니까? 그러나 CS와 DS가 세그먼트이기 때문에 직관적이지 않을 것입니다. 등록. 아니면 내가 알지 못하는 제한이 있습니까?

그건 그렇고 NASM을 사용하고 있습니다.

도움이 되었습니까?

해결책

세그먼트 레지스터로 세그먼트 레지스터를 이동할 수 없습니다. 명령이 없습니다.

다른 팁

모든 지침에 대한 마이크로 코드의 프로세서에는 너무 많은 공간이 있습니다. 따라서 하나의 일반적인 지시는 종종 거의 Used Operations Lake Change Segment Registers를위한 몇 가지 특수 목적보다 선호됩니다. 또한 일부 프로세서의 경우 아키텍처에 의해 지침 수가 절대적으로 제한됩니다. 예를 들어, 원래 8080 프로세서는 OP 코드를 단일 바이트로 인코딩해야했기 때문에 256 개의 지침으로 제한되었습니다.

실제로 어셈블리 언어가 아니라 이러한 작업을 방지하는 기본 기계 언어입니다.

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

이제 X86 프로세서 제품군은 CPU 아키텍처가 더 간단한 1970 년대로 거슬러 올라갑니다. 그 당시에는 개념 축합기 중요한 중요성 - ax 16 비트 x86 축적기입니다. 모든 계산은이 레지스터에 구축되거나 "축적"되어 모든 지침에 사용할 수있었습니다. 다른 범용 레지스터에는 더 제한된 사용 범위가있었습니다.

지침은 바이트를 기반으로했기 때문에 지시 해독을 빠르게 유지하기 위해 가능한 한 지침을 나타내는 바이트가 적은 바이트를 원했습니다. 가능한 한 많은 지침을 가능한 한 짧게 유지하기 위해 축합기의 사용은 중앙에 있습니다.

Motorola 680X0과 같은보다 현대적인 CPU에서 더 범용 레지스터는 이전에 축합기의 도메인이었던 더 많은 능력을 가지고 있습니다. RISC CPU에서 모든 레지스터는 축적기만큼 유연합니다. 64 비트 모드에서 현재 X86/AMD64 명령어 세트가 훨씬 덜 제한된다고 들었습니다.

를보세요 Intel Manual Volume 2 명령 세트 참조 -325383-056US 2015 년 9 월 "이동"열 "명령어".

16 비트 Mov to Registers는 다음과 같이 인코딩됩니다.

mov r/m16, Sreg

"Opcode 요약 테이블의 3.1.1.3 명령 열"설명 :

  • R/M16-오페라 크기 속성이 16 비트 인 지침에 사용되는 단어 일반 목적 등록 또는 메모리 오페라. 일반 목적 레지스터라는 단어는 Ax, CX, DX, BX, SP, BP, SI, DI입니다.
  • SREG - 세그먼트 레지스터.

따라서 mov ds, cs 아니오가 있으므로 인코딩 할 수 없습니다 mov Sreg, Sreg 버전.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top