2017-03-01 1 views
2

주로 역사적인 관심사이고 어셈블러에 8086 호환성을 구현할 경우 ESC 명령어에 대해 유효한 피연산자는 무엇입니까? 8086 ESC 명령 opcode 란 무엇입니까

ESC opcode, source

는 8086에서 63 source에 범위는 0에서 즉각적인이다 opcode 것을 내가 알고있는 프로그래머 설명서, 레지스터 또는 메모리입니다. 그러나 어떤 레지스터가 인코딩 될 수 있습니까? reg8reg16 또는 reg16? source이 메모리 인 경우 피연산자 크기 ( mem8 또는 mem16)가 중요합니까? 기본적으로

, 위의 두 정말 (로, 예를 들어, 두 esc 0x01, chesc 0x01, bp이 같은 결과를 생성 할) 명령 인코딩 관점에서 중요하지 않습니다,하지만 어쩌면 조립이 제한

그리고, 마지막을 강제했다 , 최소한은 아니지만, 어디에서 ESC 명령 코드에 대한 설명을 찾을 수 있습니까?

답변

5

8086에는 opcode 공간이 집합 적으로 ESC (코 프로세서로 이스케이프 처리 됨)으로 지정되어 있습니다. 범위는 d8에서 df까지입니다. 이 명령 공간의 각 명령 뒤에 modr/m 바이트가오고 mod 필드에 따라 0부터 2 개의 처리 바이트가옵니다. 8086이 두 개의 레지스터 피연산자 (즉, mod = 11)를 갖는 ESC 명령을 만날 때, nop을 수행한다. 프로세서가 메모리 피연산자를 갖는 ESC 명령을 만날 때, 메모리 피연산자에 의해 지시 된 어드레스로부터 판독 사이클이 수행되고 그 결과는 폐기된다. 명령어가 명령어 스트림에 후크가이기구는, 8087에 의해 사용되는 8086

병렬로 명령어 스트림을 디코딩 할 수 있도록, 인출로부터 2 개 전용 신호 라인을 사용

는 데이터를 구별 할 수있는 코 프로세서 페치 : opcode 바이트의 3 개의 사용 가능한 비트와 modr/m 바이트의 reg 필드의 3 비트가 6 비트 opcode를 형성합니다. modr/m 바이트의 r/m 필드는 FPU 레지스터 스택 (mod = 11, 두 개의 레지스터 피연산자를 나타내는 경우) 또는 메모리 피연산자 중 하나를 지정하는 데 사용됩니다. 일부 opcode는 r/m 필드의 내용에 따라 다양한 명령어를 인코딩합니다. 이 모든 경우에 하나의 명령이 메모리 피연산자에 대해 부호화되고 8 개의 다른 명령이 가능한 각 레지스터 피연산자에 대해 부호화됩니다.

8087이 8086이 명령을 페치 한 후 즉시 더미 페치를 수행하고 주소를 기억할 때 레지스터합니다. 메모리에서로드하는 명령어의 경우 메모리 오퍼랜드의 추가 워드를로드하고 그 기능을 수행합니다. 저장소의 경우 가져 오기 결과를 무시하고 해당 값을 8086에 지정된 주소에 저장합니다.

8087은 8086과 비동기 적으로 작업을 수행합니다. 8086은 부동 소수점을 디스패치 할 때 중지됩니다 다른 명령이 진행되는 동안 그러나 다른 암시 적 동기화는 없습니다. 8087이 작동을 수행하는 동안 BUSY 핀 (8086의 TEST 핀에 연결됨)을 지정하면 프로그래머는 8037이 작동을 끝내고 결과적으로 WAIT 라인을 릴리스 할 때까지 wait 명령어 (9b, 보조 프로세서 준비가 완료 될 때까지 대기)를 발행 할 수 있습니다. 이것은 일반적으로 8086에서 8087로 작성된 메모리 피연산자를 읽으려고 시도하기 전에 수행됩니다. 그러나 8087이 특정 명령어에 대해 소요될 시간을 수동으로 계산하고로드가 발생할 때 wait을 생략하는 것이 일반적입니다. FPU 작동이 끝난 후

+0

"8087이 8086이 명령어 가져 오기 직후 더미 가져 오기를 수행하고 주소를 기억할 때 등록합니다."이 문장을 이해하는 데 어느 정도 시간이 필요했습니다! 나는 명사로 "8087 레지스터"를 계속 읽었는데, 여기서 당신은 동사를 분명히 의미했습니다. "8087 기록은 ..."또는 "8086 표시가 ..."라고 제안 할 수 있습니다. 다른 사람들은 똑같은 어려움을 겪을 수도 있고 전혀 신경 쓰지 않을 수도 있습니다. –