안녕하세요.
우선 LMC에서 데이터 전송에 관련해서는 다음과 같은 기본적인 규칙을 가지고 있습니다.
1. Memory --> Memeory 로 데이터 전송을 바로(Direct)로 할 수 없다.
2. Memory --> Register로 데이터를 가져오는 것은 가능하다.
3. Register --> Memory로 데이터를 보내는 것은 가능하다.
4. Register --> Register로 데이터를 복사하는 것은 가능하다.
이에 따라, 질문의 내용인 OORR의 경우 위에서 4번째 규칙에 해당하는 것으로,
"LD A, C"와 "ST C, A"는 모두 가능합니다.
LD의 경우 두번째 오퍼랜드가 가리키는 곳으로 부터 첫번째 오퍼랜드가 가리키는 곳으로 데이터를 전송하는 명령입니다.
ST의 경우 첫번째 오퍼랜드가 기리키는 곳으로 부터 두 번째 오퍼랜드가 가리키는 곳으로 데이터를 전송하는 명령입니다.
즉, "LD A, C"와 "ST C, A"는 같은 결과를 가져옵니다.
이제 질문의 답변을 드리면,
1. LD X, C는 가능합니다. LD C와 같은 구문은 존재하지 않습니다. LD A, C라고 명확히 기술해야 합니다.
2. OORR은 Register - Register 전송임으로 허용합니다.
3. ST의 경우 LD와 오퍼랜드의 방향이 반대라고 생각하면됩니다.
그리고 Instruction 구조상 첫번째 오퍼랜드는 레지스터밖에 될 수 없습니다.
앞의 규칙에서 언급한바와 같이 Register - Register 전송은 가능하지만, Memory-Memory 전송은 불가능합니다.
마지막으로 MOV는 실제 Instruction이 존재하지 않는 의사명령어(Pseudo Instruction)입니다.
MOV는 LD와 유사하게 두 번째 오퍼랜드로 부터 첫 번째 오퍼랜드로 전송하라는 의사 명령어입니다.
MOV A, Address 는 LD A, Address 로 번역해야 합니다.
MOV Address, A 는 ST A, Address 로 번역해야 합니다.
MOV Address1, Address2 의 경우를 허용한 다면 다음과 같은 명령어 집합으로 변형될 수 있습니다.
PUSH A
LD A, Address1
ST A, Address2
POP A
PUSH A 와 POP A는 원래 레지스터 A의 값을 보호하기 위한 조치입니다.
2017년 10월 8일 일요일 오후 12시 43분 28초 UTC+9,
yp...@gmail.com 님의 말: