누적 기가 0AH를 포함하고 있으며 다음과 같은 지시가 주어 졌다고 가정 해 봅시다. MOV D, A; XRA A; 이 명령어는 accumulator와 D 레지스터를 지우는 것을 알게되었습니다. 'Virtual 8085'시뮬레이터를 사용하여이를 확인했습니다. secon 명령이 D 레지스터도 지우는 이유는 무엇입니까?왜 XRA A는 다른 레지스터도 지 웁니다.
0
A
답변
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
은 이제 BitArray
을 A.bits
으로 참조합니다.
그런 다음 비트 논리 연산을 수행하면 A.bits
에서 직접 작동하며, BitArray
을 참조하기 때문에 D.bits
에도 영향을 미칩니다. 예를 들면 버그가 발생하지 않습니다. ADD
또는 SUB
은 다른 방식으로 구현되어 있기 때문에 기존의 것을 수정하는 대신 새로운 BitArray
을 생성합니다.
MOV
은 깨진 방식으로 구현되어 있으므로 =
대신 Clone
또는 아마도 CopyTo
을 사용해야합니다. 고정 된 것을보고 싶다면 github에 관한 버그를 신고하십시오.
TL; DR : XRA A
는 D
명확하지 않습니다. 가상 8085는 버그가 있습니다. 작성자에게 버그 수정을 요청하거나 다른 시뮬레이터를 검색하도록 요청하십시오.
죄송합니다. MOV D, A는 D를 0AH로 설정합니다. 그러면 'XRA A'는 'A'를 0으로 설정하고 그물 효과는 'D = 0AH, A = 0'이됩니다. –
가상 8085가 버그가있는 것 같습니다. 하나 이상의 다른 레지스터에'A '를'MOV'하고'A '에 대해 비트 논리 (and, or, xor) 연산을 수행하면 다른 레지스터도 수정하게됩니다. – Michael