2013-04-19 1 views
3

현재 ARMv7 명령어 세트를 구현하는 ARM 코어 텍스 A9에 대한 디스어셈블러를 구현하려고합니다.ARMv7에서 하나의 명령어에 대한 코드 분할이 왜 발생합니까?

이 들어

내가 설명서 (ARM 웹 사이트에 등록 한 후) 여기에서 다운로드 할 수있다 "DDI0406C_b_arm_architecture_reference_manual.pdf"사용하고 있습니다 :와 부품 A8.8이 매뉴얼에서는

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.set.architecture/index.html

을, 명령의 세부 사항, 왜 하나의 명령 (예 : A1, A2, ...)에 대해 여러 인코딩이 있는지 이해할 수 없으므로 모두 ARMv7로 구현되는 것 같습니다.

또한 대뇌 피질 A9는 엄지 2를 사용하므로 A1/A2/... 인코딩을 구현하거나 T1/T2 만 구현합니까?

이 설명서의 모든 부분은 인코딩과 관련되어 있지만 실제로 어떤 인코딩이 프로그램에 사용되는지 알 수있는 방법을 아직 이해하지 못합니다.

+0

대단히 감사합니다. 모든 답변이 정말 유용합니다. 나는 너무 빨리 대답 할 것으로 기대하지 않았다. – user2299676

답변

1

명령 스트림 내부에서 ARM과 Thumb을 실제로 구별 할 수있는 방법이 없습니다. 함수가 호출되는 방식에 따라 결정할 수 있습니다 (최하위 비트가 1로 설정된 경우 엄지 손가락, 그렇지 않으면 팔).

ARM 인코딩은 매우 안정적이며, A1 인코딩은 몇 개만 찾아 볼 수 있습니다. BLX는 A2 인코딩이 제공되는 예제이지만, 주로 새로운 ARM-ARM이 오래된 것들. BL 및 BLX는 두 가지 다른 명령어였으며 BLX가 추가 명령어 공간에 추가되었습니다 (조건에 일반적으로 사용되는 상위 4 비트는 1111로 설정 됨). v5 이전의 ARM에서는 "절대 실행하지 않음"을 의미합니다.

Thumb 더 압축 된 지침 공간에 배치해야했기 때문에 다른 점이 많습니다. 페이지 A6-220에는 엄지 명령이 두 개 또는 하프 워드 하나로 구성되어 있는지 결정하는 방법에 대한 정보가 있습니다.

1

Ax 인코딩은 프로세서가 팔 모드 일 때 해당 인코딩을 사용하여 찾은 비트를 디코딩합니다. 하나 이상의 A1, A2가있는 경우 다른 기능이나 이유가 분명해야합니다. 두 가지 지침은 별도로 간주 될 수 있습니다 (예를 들어, x86의 mov 명령에는 많은 인코딩이 있습니다. 각 인코딩을 별도의 "지침"으로 취급하십시오.

그런 다음 Tx 변형이 있으며, 엄지와 엄지 2 확장입니다. 엄지 손가락은 모두 16 비트이며 (bl은 두 개의 별도 16 비트 명령어로 디코딩 할 수 있습니다) 그 아래의 설명은 "모든 엄지 손가락 변종"또는 "현재까지의 armv4t"또는 일부 언어를 나타냅니다. thumb2 확장은 모두 32 비트이며, 처음 16 비트는 엄지 손가락 세계에서 정의되지 않은 명령어입니다. 이것들은 그것들을 지원하는 아키텍처에 더 많은 제약이 있습니다.

이러한 프로세서 중 하나에 대해 디스어셈블러를 완전히 만들 수는 없습니다. x86 또는 다른 많은 프로세서 (모두?)와 같은 이유 때문입니다. 모든 지시 사항이 하나의 모드 (팔 또는 엄지 또는 엄지 손가락 + 썸 2)이지만 모드 혼합 (팔 + 엄지 손가락) 모드가 아니라고 가정하면 모든 것이 고정 된 명령어 길이이고 모든 데이터와 코드를 간단히 분해 할 수 있으므로 실행할 수 없습니다 어떤 문제로. 혼합 모드를 분해하기 위해서는 기본적으로 명령을 에뮬레이트/실행하고 명령 흐름을 따라야합니다 (가변 길이 길이 명령 세트 디스어셈블러처럼) 변환을 찾으려고합니다. 물론 여기에서의 문제는 물론 최소한의 부하에서 다중 명령입니다. 그런 다음 레지스터가 bx 인 레지스터, 때로는 명령 계산에 관련된 수학이 있으며 주소 계산 또는로드가 bx보다 먼저 수행된다는 보장이 없습니다. 그래서 당신은 그 중 일부를 할 수 있고 프로그램을 분해함으로써 먼 길을 갈 수 있습니다.

사용중인 프로세서에서 thumb2가 지원되거나 허용되는 경우 엄지 코드에 대한 진입 점을 감지 한 시간에 가변 명령 길이 문제가 있습니다. 그리고 이미이 작업을 수행하지 않는 경우 코드 실행을 따라 지침 시작 위치를 결정해야합니다 (초등 가변 명령 길이 디스 어셈블리).

기술 참조 설명서와 아키텍처 참조 설명서를 함께 사용하면 해당 아키텍처 (trm)의 아키텍처와 구현에서 팔과 썸 모드가 가능한지 알 수 있습니다. 나는 A9가 팔 엄지 손가락과 엄지 손가락 2를 지원한다고 가정 할 것이다.

팔을지지하지 않는 것으로 제한된 외피 -m 패밀리는 피질 -m0 (및 m1)이 armv6m이고 m3 및 m4가 armv7m (수십개 (armv7m에서 수십 개의 thumb2 확장에 대한 지침). armv7-m과 armv7-ar 매뉴얼은 예를 들어 -m 변종에 대해 별도의 아키텍처 참조 설명서가 있습니다.

+0

팔과 엄지 지시를 섞는 프로그램을 제대로 분해 할 수 없다는 것이 정말 짜증납니다. 하지만 이제는 objdump와 같은 유명한 디스어셈블러가이 문제를 어떻게 처리하는지 궁금합니다. – user2299676

+0

elf 파일은 어느 정도 속임수를 쓰지만, 바이너리의 어떤 부분이 무엇인지 알려주는 정보를 포함 할 수 있습니까? 그래서 데이터에서 코드를 정렬하고, 엄지 손가락으로 팔을 정렬하지 않아야합니다. 대부분의 명령어 세트는 가변적입니다 디스어셈블러는 항상이 문제를 가지고 있습니다. mips와 arm은 일시적으로 명령 길이가 고정되어 있다는 것을 알고 있었고, 둘 다 서로 다른 길이의 명령 세트를 추가하여 규범과 함께 묶었습니다. –

+0

당신은 그 대부분을 분해 할 수 있지만 다른 명령어 세트와 마찬가지로 바이너리 만 있으면 정적으로 결정할 수없는 것들이있을 수 있습니다.이점은 오늘날 컴파일러가 생성 한 코드의 대부분이 깨끗하고 거의 디스 어셈블러 트랩을 가질 가능성이 적습니다. –

2

명령의 다른 인코딩은 기능적으로 다른 일을합니다. 다른 인코딩의 사용을위한

일례 A8.9.12 ADR

이 명령이 PC 기준 주소를 형성하기 위해 상기 PC 값 치값 추가이며 목적지 레지스터에 그 결과를 기록한다. 명령이 다음은 A2로 인코딩되는 경우, 제로 또는 양의로 해석되어야 오프셋 A1로서 부호화되어 있다면 오프셋

음수이다. 목록은 하나 개 이상의 레지스터를 포함하는 경우

다른 예는 명령은 A1을 인코딩 조립, A8.8.132 POP

이다. 목록에 정확히 하나의 레지스터가 포함되어 있으면 명령이 A2 인코딩으로 어셈블됩니다.

나는 POP 인코딩은 성능상의 이유로 다른 마이크로 코드를 만들 아마 만들어 다른 상상할 수있다.

질문의 두 번째 부분 인 Cortex-A9는 ARMv7-A 아키텍처 CPU이며 사용자가 지정한 설명서에 지정된대로 모든 지침을 지원합니다. 또한 Cortex™-A9 Technical Reference Manual을 읽어야합니다.

+0

좋고 간결한 대답. Nitpick : Cortex-A9는 Architecture Reference Manual에 정의 된 _all_ 명령을 지원하지 않습니다. VFPv4/AdvSIMDv2 및 가상화 확장에서 소개 된 지침을 지원하지 않습니다. – unixsmurf

관련 문제