Why $pc+1 in Thumb mode?(ARM)

Introduce

이번에는 제 궁금증에 의해서 찾아본 자료이며, 장문이 아닌 짧은 글입니다.

평소에는 Thumb mode 디버깅할 때 $pc+1을 했었는데, 지금 생각해보니 왜 하는지를 몰랐습니다.

그래서 찾아보았습니다.

ARM mode? Thumb mode?

ARM은 흔히 우리가 사용하는 Intel과는 다른 Architecture입니다.

그래서 ARM을 처음 분석하시는 분들은 당황하실 수 도 있으나, Intel Architecture에서 분석하시던 분들도 좀만 보시면 저보다 잘하실 겁니다.

ARM이면 ARM이지 Thumb모드는 뭘까요?

ARM mode는 Machine Code가 32bit로 구성되어 있습니다.

그 반면에 Thumb mode에서는 Machine Code가 16bit입니다.

ARM mode에서는 R0 ~ R15(16개)의 레지스터를 사용하고, Thumb mode에서는 R0~R7(8개)의 레지스터를 사용합니다.

ARM mode와 Thumb mode는 BX / BLX 등의 명렁어(X로 끝나는 분기문)을 통해 변환이 가능합니다.

왜 나눠놨는지는 과거 CPU와 RAM의 보급과 관련이 되어 있으니 관심있으신 분들은 찾아보시기 바랍니다!

Why $pc+1 in Thumb mode?

이 포스팅의 본 주제입니다.

정말 별거 아닌 부분인데 왜 이렇게 해야 gdb를 통해 정상적인 명령어가 나오는지를 이해하지 못했었습니다.

이유는 생각보다 간단하였습니다.

gdb의 x/i $pc 를 통해 disassembly의 값을 볼 때, ARM mode의 경우 제대로 분석이 될 것입니다.

하지만 Thumb mode의 경우 정체를 알수없는 assembly가 나오죠.

그 이유는 위에서 언급한 Machine Code의 크기때문입니다.

$pc+1을 하는 이유는 맨 마지막 비트를 켜주므로써 지금 부터 분석할 부분이 Thumb mode라는 것을 gdb에게 알려주는 것이죠.

그래서 Thumb mode를 분석할 때는, x/i $pc+1 해주므로써 정상적으로 분석을 진행할 수 있습니다.

이로써 포스팅을 마치겠습니다.

잘못된 정보나 오타 지적은 언제든 환영합니다 :)