문제

MSP430 명령 세트의 시뮬레이터를 작업 중입니다. GNU 어셈블러는 다음과 같은 지침을 인코딩 할 수 있습니다.

fc0a: 12 10 00 02 rrc &0x0200       
fc0e: 22 11       rra #4        
fc10: 23 52       add #4,#2

내 생각에 RRC & 0x0200은 주소 0x0200에서 회전을 수행 한 다음 답을 다시 주소 0x0200으로 작성합니다. 맞습니까? 그러나 RRA #4는 무엇을할까요? 소스는 내가 가정하는 즉시 4 일 것입니다. 그러나 작업 후 목적지가 있습니까? ADD #4, #2는 기대할 수있는 것으로 조립되었으며 (2B10, 소스 = R2, AD = 1B0, DEST = R3), Binutils Disassembler는 해당 지침으로 무엇을 해야하는지 알지 못했습니다.

이러한 유효한 지침입니까?

도움이 되었습니까?

해결책

이 효과에 대한 명확한 온라인 참조가없는 것처럼 보이지만, 나는 두 가지 지침이 표시된 OP에 동의하는 경향이 있습니다. 유효하지 않을 수 있습니다, 비록 데이터 시트에 정의 된 형식을 준수하더라도.

다시 말해, 명령어 단어를 구성하는 다양한 부분의 가능한 모든 조합이 유효하지는 않습니다. 특히 즉각적인 주소 지정 모드를 사용하는 많은 단일 피연산자 지침과 대상에 대한 즉각적인 주소 지정 모드가있는 많은 이중 피연산자 지침은 의미 적으로 실용적이지 않을 수 있습니다.

예를 들어, 사용자 안내서 3.3.7 (즉시 주소 지정 모드) 에서이 효과에 대한 힌트는 몇 가지만 있습니다.소스 피연산자에만 유효합니다."(그리고 BTW, 이것은 R2 또는 R3 상수 생성 트릭이 허용하는 짧은 사례뿐만 아니라 즉각적인 주소 지정 모드의 모든 경우입니다.)

분리기가 그러한 코드로 무엇을 해야할지 모른다는 사실은 또 다른 힌트입니다 (그러나 일부 불쾌한 사람도 쉽게 넘어집니다 ...).

문서를 위해 MSP430에 대한 몇 가지 유용한 참조를 아래로 모았습니다.

다른 팁

현재 사용자 안내서에서 3.4.4.2 절에서는 "예측할 수없는 프로그램 작동"을 초래하므로 RRA 명령 대상 필드에서 즉시 모드 (#N)를 사용하지 않는 것이 좋습니다.

그들이 가능합니다. Wikipedia의 명령어를 살펴보면 Opcodes는 레지스터 및 다양한 옵션을 인코딩합니다. 따라서 간단한 매핑이 아닙니다. 당신이 가진 출력이 작은 엔디언 인 것처럼 보입니다.

fc0a: 12 10 00 02 rrc &0x0200  

이진에서는 0001 0000 0001 0010 인 명령 1012에 해당합니다.

이것은 다음과 같이 분해됩니다.

6 bits: 0001 00 - fixed; defines the instruction family
3 bits: 00 0    - instruction (RRC)
1 bit : 0       - byte or word parameter (0 = 16 bit parameter; 1 = 8 bit)
2 bits: 01      - addressing mode (01 = indexed;)
4 bits: 0010    - register

따라서이 경우 주소 및 0200의 레지스터 2의 오프셋에서 값에서 회전 오른쪽이 발생합니다.

완전히 이해하기 위해 다른 지침을 비슷한 방식으로 분해해야합니다. 추가 명령의 경우 소스 및 대상 레지스터/주소가 모두 5223 명령으로 인코딩됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top