2016-10-26 9 views
0

누적 기가 0AH를 포함하고 있으며 다음과 같은 지시가 주어 졌다고 가정 해 봅시다. MOV D, A; XRA A; 이 명령어는 accumulator와 D 레지스터를 지우는 것을 알게되었습니다. 'Virtual 8085'시뮬레이터를 사용하여이를 확인했습니다. secon 명령이 D 레지스터도 지우는 이유는 무엇입니까?왜 XRA A는 다른 레지스터도 지 웁니다.

+0

죄송합니다. MOV D, A는 D를 0AH로 설정합니다. 그러면 'XRA A'는 'A'를 0으로 설정하고 그물 효과는 'D = 0AH, A = 0'이됩니다. –

+0

가상 8085가 버그가있는 것 같습니다. 하나 이상의 다른 레지스터에'A '를'MOV'하고'A '에 대해 비트 논리 (and, or, xor) 연산을 수행하면 다른 레지스터도 수정하게됩니다. – Michael

답변

4

좋아, 내가 Virtual 8085's source code을 보았고, 실제로 내 의견에서 제안했듯이 버그 보인다.

레지스터를 BitArray 인스턴스로 나타냅니다. 또는 각 레지스터는 BitArray에 대한 참조 인 bits 구성원이있는 개체로 표시됩니다.

이제 작성자가 MOV을 시뮬레이트하는 작업은 simply point one register's bits to another register's bits입니다. 당신이 MOV D,A을한다고 가정 해 봅시다. 그 후에 MOV, D.bits은 이제 BitArrayA.bits으로 참조합니다.
그런 다음 비트 논리 연산을 수행하면 A.bits에서 직접 작동하며, BitArray을 참조하기 때문에 D.bits에도 영향을 미칩니다. 예를 들면 버그가 발생하지 않습니다. ADD 또는 SUB은 다른 방식으로 구현되어 있기 때문에 기존의 것을 수정하는 대신 새로운 BitArray을 생성합니다.

MOV은 깨진 방식으로 구현되어 있으므로 = 대신 Clone 또는 아마도 CopyTo을 사용해야합니다. 고정 된 것을보고 싶다면 github에 관한 버그를 신고하십시오.


TL; DR : XRA AD 명확하지 않습니다. 가상 8085는 버그가 있습니다. 작성자에게 버그 수정을 요청하거나 다른 시뮬레이터를 검색하도록 요청하십시오.