2017-11-10 45 views
0

그래서 TBB가 어셈블리에서 switch 문에 대해 어떻게 작동하는지 이해하려고합니다. 나는 그것이 교과서/온라인 매뉴얼에 어떻게 쓰여졌는지 알지만 분기 테이블에서 오프셋이 어떻게 작동하는지 이해하지 못합니다. 분기 테이블에서 명령어로 어떻게 이동합니까?레이블을 빼서 올바른 오프셋을 얻는 방법과 2로 나누는 이유는 무엇입니까? 내 교과서ARM 어셈블리 TBB 명령어 - 점프는 어떻게 작동합니까?

은 말한다

프로그램 지점은 다음과 같이 계산되어야하는 명령 메모리 어드레스 :
대상 = PC + 4 + ( 2 * BranchTable [R0])

여기서 r0은 분기 테이블 내의 오프셋을 포함하는 카운터입니다. TBB에서 PC는 이미 다음 명령어 (지점 테이블, PC = PC + 4)를 가리 킵니다. 브랜치 테이블은 적절한 명령 (2 * BranchTable [r0])에 두 번째 오프셋을로드합니다. 교과서 및 온라인에서 본 것으로부터, 지회 표 레이블이 지침 레이블에서 제외됩니다. 이것은 4n과 같은 것의 오프셋을 제공해야합니다. 왜 2로 나눕니 까? 고맙습니다! 그래서 약간의 수학을했고, 이는 분기 테이블에 오프셋이 밝혀 일부 수학을

나요 [(라벨 2 - LABEL1)/2] :

편집. 방정식에 일찍 연결하면 target = PC + 4 + (레이블 2 - 레이블)이됩니다. 이것은 합리적인 말입니다. 그러나 누군가가 이유가 있는지 또는 논리가 잘못되었는지를 알고 싶습니다. 왜 TBB가 2로 나누고 2에 차이를 곱하는가?

+2

때문에를 심지어 2로 스케일링하면 범위를 두 배로 늘릴 수 있습니다. 그것을 보는 또 다른 방법은 오프셋의 비트 # 1-8을 저장하고 비트 # 0은 암시 적으로 0, 즉 2 진수로 'XXXXXXXX0'입니다. – Jester

+0

그건 의미가 있습니다. 나는 PC가 항상 정렬 (16 비트 또는 32 비트 명령어인지 기억할 수 없다) 때문에 0으로 설정된 비트 [1 : 0]를 읽었다는 것을 기억한다. DCB 지침에 대개 ALIGN이 오는 이유는 무엇입니까? 죄송합니다. 범위 부분에 대해 좀 더 명확하게 설명해 주시겠습니까? – Pablo

+0

32 비트입니다. 'DCB'에 관해서는 그렇습니다. 매뉴얼에 다음과 같이 쓰여 있습니다 : _ "DCB 다음에 명령어가 오면 ALIGN 지시문을 사용하여 명령어가 정렬되어 있는지 확인하십시오."(DCB는 명령어가 아니라 지시어입니다).순전히 바이트 오프셋을 사용한 경우 사용할 수있는 범위는 512 바이트가 아니라 256 바이트입니다. – Jester

답변

0

TBB/TBH은 Thumb2 모드에서만 사용할 수 있습니다.

ARM Thumb2 명령어는 항상 짝수 주소에서 시작됩니다. PC+4 + {0, 2, 4, 6, 8, ..., 508, 510}으로 분기 할 수 있다는 것은 모든 홀수 오프셋이 쓸모 없기 때문에
PC+4 + {0, 1, 2, 3, 4, ..., 254, 255 }보다 유용합니다. As @Jester explained in the first comment, 2를 곱하면 1 바이트 오프셋에서 두 배의 범위가 제공되며 유연성이 손실되지 않습니다.

ARM 설계자 은 항상 4를 곱하기 위해 설계되었지만 일반적으로 512B는 충분한 범위이며, 때로는 4 바이트 길이의 배수가되도록 코드 블록을 채워야 할 수도 있습니다. 더 큰 오프셋이 필요한 경우, TBH은 하프 워드 16 비트 오프셋을 사용합니다 (여전히 2를 곱함). 여기

원시 진수로, TBB를 사용하여 점프 테이블의 실제 예제 및 분해는 각 지점의 목표에 도달 된 방법의 수학 (같은
case 3: (0x3164 + 0x9 * 2)) 운동 주석 : 명령 주소는 항상 Confused by TBB in a section of ARM disassembly