16비트 도스용 파이썬 관련 문서를 찾다가 우연히 관련 내용을 찾아서 적어봅니다.

NEC의 V20이나 후속 시리즈들은 인텔의 8088과 핀이 호환되며 80186등와 명령어셋이 호환되는 CPU입니다. 또한, 호환성 모드로 8080모드를 지원하기도 합니다. 하지만, 리버스엔지니어링으로 개발된 CPU이고 내부 구조가 완전히 동일하지는 않기 때문에 약간 동작에 차이가 있습니다. 특히 일부 OP CODE에 대한 동작에 차이가 나서 인텔계열에선 잘 동작하는 코드가 NEC계열에선 동작하지 않는 경우가 발생할 수 있습니다.

대표적으로 AAD라는 명령어가 있습니다. 이 OPCODE는 AL + (CONSTANT * AH) 라는 연산을 합니다. AL과 AH는 8비트 레지스터로, 일반 프로그래밍 언어로 치면 변수명정도로 생각하시면 됩니다. 상수값(CONSTANT) 해당 명령어에 argument로 직접 붙으며 레지스터등에 저장되지 않습니다. 예를 들어 D5 0A라는 기계어가 있으면 D5부분은 현재 실행하고자 하는 명령어가 AAD명령어라는 것을 표시하며 0A부분은 상수값이 10임을 표시합니다.(조금 단순화한 설명으로 실제론 좀 더 세분화되어 있습니다.) 인텔 CPU의 경우 이 뒷자리수를 읽어들여와서 상수값을 결정했습니다.

하지만 NEC은 이 부분의 동작이 달랐습니다. 상수값을 명령어에서 읽어오지 않고 무조건 테이블에서 읽어와서 10을 넣었습니다. D5 0A를 명령한 경우 정상동작했지만 이게 아닌 다른 값(D5 09등) 은 행동이 정의되지 않았습니다. AAD라는 명령어 자체가 주로 10을 곱할때만 사용되었고 잘 문서화된 명령어도 아니라 대부분의 프로그램은 문제없이 동작했습니다만, 이는 일부 프로그램이 정상적으로 NEC계열 CPU에서 돌아가는 것을 방해하는 요소기도 했습니다.

그 외에도,  POP CS등도 NEC V20에선 정상동작하지 않는다고 알려져 있습니다. 따라서, V20과 인텔계열은 어느정도 호환성이 있었고 둘 다 도스를 그럭저럭 문제없이 돌렸지만 사실 서로 100% 동작이 호환되는 CPU는 아니었고 경우에 따라선 호환성에 문제가 있을 수 있었다고 할 수 있습니다.

물론 이것때문에 골치아팠던 사람들은 NEC이나 인텔이 아닌 당시 활동하던 어셈블리 프로그래머들이었습니다.


출처: https://groups.google.com/forum/#!topic/comp.os.cpm/9AMumoZP7LY