그래서 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로 스케일링하면 범위를 두 배로 늘릴 수 있습니다. 그것을 보는 또 다른 방법은 오프셋의 비트 # 1-8을 저장하고 비트 # 0은 암시 적으로 0, 즉 2 진수로 'XXXXXXXX0'입니다. – Jester
그건 의미가 있습니다. 나는 PC가 항상 정렬 (16 비트 또는 32 비트 명령어인지 기억할 수 없다) 때문에 0으로 설정된 비트 [1 : 0]를 읽었다는 것을 기억한다. DCB 지침에 대개 ALIGN이 오는 이유는 무엇입니까? 죄송합니다. 범위 부분에 대해 좀 더 명확하게 설명해 주시겠습니까? – Pablo
32 비트입니다. 'DCB'에 관해서는 그렇습니다. 매뉴얼에 다음과 같이 쓰여 있습니다 : _ "DCB 다음에 명령어가 오면 ALIGN 지시문을 사용하여 명령어가 정렬되어 있는지 확인하십시오."(DCB는 명령어가 아니라 지시어입니다).순전히 바이트 오프셋을 사용한 경우 사용할 수있는 범위는 512 바이트가 아니라 256 바이트입니다. – Jester