[ASM] IT Block

이게 ARM에만 관련된 것인지는 확실치 않다.

일단 ARM Compiler toolchain Assembler Reference에 IT instruction에 관한 설명(http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0489c/Cjabicci.html)이 있다.

IT는 (If-Then) instuction을 말한다. 이름에서 알 수 있듯이, 분류는 Branch and control instruction 이다. IT instruction은 4개의 이어지는 instructions conditional로 구성되는데, 이를 IT block이라고 한다. 이들 condition은 모두 같을 수도, 일부는 다른 것들과 논리적으로 반대일 수도 있다. 이 instruction이 conditional flags를 바꾸지는 않는다.

IT{x{y{z}}} {cond} 로 쓰인다.

x는 그 IT block에서 두번째 instruction을 위한 condition switch, y는 세번째, z는 4번째, cond는 첫번째이다.

IT block의 2번째에서 4번째 instruction은 다음 중 하나일 수 있다:

T: Then. cond condition이 적용된다.

E: Else. cond의 반대 condition이 적용된다.

BKPT instruction을 제외한 IT block 안의 (branches를 포함하는) instrcution들은 {cond} 부분에 condition을 적어야 한다.

assembler가 뒤의 instruction에 적힌 condition에 따라 자동으로 생성해주므로, IT instrcution을 작성할 필요는 없다. IT instruction을 작성한다면, assembler가 그 validity를 체크한다.

ARM code를 assembling할 때 assembler가 같은 체크를 하지만, IT instrcution을 생성하지는 않는다.

CMP, CMN, TST를 제외한 condition code flags에 영향을 주지 않는 16-bit instrcution들은 IT blcok안에서 사용되어도 상관없다.

IT block 안의 BKPT instrcution은 언제나 실행되기 때문에 {cond} 부분 안에 condition은 필요없다. IT bock은 그 다음 instrcution부터 이어진다.

NOTE: AL condition을 사용함으로써 unconditional instruction을 위한 IT block을 사용할 수 있다.

IT block 안에서의 conditional branches는 IT block 밖에 있는 것보다 더 긴 branch range를 갖는다.

IT block 안에 다음 instruction들은 허용되지 않는다

  • IT
  • CBZ, CBNZ
  • TBB, TBH
  • CPS, CPSID, CPSIE
  • SETEND

IT block이 사용될 때 다른 제한은 다음과 같다.

  • PC를 바꾸는 branch나 다른 instrcution은 그 instruction이 그 block의 마지막 instruction일 때만 허용된다.
  • exception handler로부터 되돌아가기 전까지는 IT block 안의 어떤 instruction으로도 branch할 수 없다.
  • IT block 안에서 어떤 assembler directive도 사용할 수 없다.

NOTE: assembler는 IT block 안에서 이들 instruction들이 사용되면 disgnostic message를 출력한다.