[[FrontPage]]

----

아 머리 아파.. 여기 있는 모든 내용은 ARM Architecture Reference Manual의 내용을 갖다 베낀 것임을 알려둡니다. (근데 그럴 수밖에 없잖아)

MSR(Move to Status Register from ARM Register). 이름 그대로, 범용 레지스터(R0~R15)에서 상태 레지스터(CPSR, SPSR)로 값을 복사한다.

attachment:그림_7.png
ARM Architecture Reference Manual의 비트 도식. 문제가 있을 경우 즉시 삭제함(-_-!)

명령어는 간단한데 동작방식은 무지하게 복잡하다.

 * [[SBO]]
 * [[SBZ]]

== 명령어 예제 ==

0xe129f000 msr CPSR_fc, r0

 * 0xe129f000 이진 코드, 그냥 붙인 것. 없어도 됨(이 아니라 어셈블 할 땐 없는게 정상이지)
 * msr 명령어
 * CPSR 상태 레지스터, CPSR과 SPSR 두 가지가 가능
 * _fc 비트마스크. c, x, s, f 4가지 조합이 가능하다. 자세한 설명은 아래에
 * r0 원본 레지스터

== 명령어 형식 ==

 * MSR{<cond>} CPSR_<fields>, #<immediate> 
 * MSR{<cond>} CPSR_<fields>, <Rm>
 * MSR{<cond>} SPSR_<fields>, #<immediate>
 * MSR{<cond>} SPSR_<fields>, <Rm>

=== cond ===

명령어의 실행 조건. [[ConditionPassed]] 참고

=== fields ===

4가지 요소로 이루어져 있다.

 * c 위 field_mask의 16번 비트(제일 오른쪽)
 * x 17번 비트
 * s 18번 비트
 * f 19번 비트

각 약자의 의미는 아직 모르겠다.

=== immediate ===

이름 그대로 직접값. #2847294 라든가 뭐 그런식으로. 단순히 0~11비트의 3바이트를 갖다 쓰는게 아니고 회전 연산 및 기타 귀찮은 짓들이 들어간다. 아래 설명

=== Rm ===

레지스터. 예제의 명령어가 Register operand를 쓴 명령어다.

== 아키텍처 버전 ==

All

== 예외 ==

없음

== 동작 ==

 * 매뉴얼 p.49의 Types of PSR bits를 읽어볼 것.

MSR 명령의 의사코드는 이렇다.

  if [[ConditionPassed]](cond) then
    if opcode[25] == 1 then
      operand = 8_bit_immediate를 rotate_imm*2 만큼 우측 회전(Rotate Right)
    else
      operand = Rm
    if (operand AND UnallocMask) != 0 then
      UNPREDICTABLE (예외. 엄밀히는 예외는 아니지만-예측할 수 없음이니까- 예외로 처리 안하면 골치아파진다. 근데 예외 없다매)
    byte_mask = (if field_mask[0] == 1 then 0x000000FF else 0x00000000) OR
                (if field_mask[1] == 1 then 0x0000FF00 else 0x00000000) OR
                (if field_mask[2] == 1 then 0x00FF0000 else 0x00000000) OR
                (if field_mask[3] == 1 then 0xFF000000 else 0x00000000)
    if R == 0 then
      if InAPrivilegedMode() then
        if (operand AND StateMask != 0 then
          UNPREDICTABLE (아 예외 없다매...)
        else
          mask = byte_mask AND (UserMask OR PrivMask)
      else
        mask = byte_mask AND UserMask
      CPSR = (CPSR AND NOT mask) OR (operand AND mask)
    else // R == 1
      if [[CurrentModeHasSPSR]]() then
        mask = byte_mask AND (UserMask OR PrivMask OR StateMask)

        SPSR = (SPSR AND NOT mask) OR (operand AND mask)
      else
        UNPREDICTABLE

=== BitMask ===

p.227 MSR 부분을 참고할 것. 프로젝트의 기준인 ARMv5TE에서 마스크값은 아래와 같다.

 * UnallocMask: 0x07FFFF00
 * UserMask: 0xF8000000
 * PrivMask: 0x0000000F
 * StateMask: 0x00000020

=== 예제를 수작업으로 분석해보자 ===

아 너무 복잡해

=== 의심스러운 부분 ===

    else // R == 1, Register operand
      if [[CurrentModeHasSPSR]]() then
        mask = byte_mask AND (UserMask OR PrivMask OR StateMask)

        SPSR = (SPSR AND NOT mask) OR (operand AND mask)

의사코드 마지막쯤에 이 부분이 나오는데, 이 위의 if(R == 0)에서는 CPSR값을 바꿨다. 근데 왜 else에선 뜬금없이 SPSR인가?

예제코드 자체가 좀 이상하다. SPSR이 있으면 SPSR을 업데이트하는 건 사리에 맞지만,

 SPSR = CPSR

 CPSR = (CPSR AND NOT mask) OR (operand AND mask)

대충 이렇게 하는게 더 맞는 것 같다.

== 보충설명 ==

이 명령어에 나오는 R비트는, 다른 명령이라면 레지스터 비트가 맞는데 MSR에서는 아니다. 정확히 어떤 의미인지는 모르겠다.
