2014-02-09 5 views
7

MIPS 펌웨어를 리버스 엔지니어링하려고합니다. 펌웨어는 32 비트 r4kec 프로세서에 대해 인코딩 된 빅 엔디안입니다.MIPS 어셈블리에서 두 개의 순차 분기 명령어?

나는 어셈블리의 모습, 그리고 모든 유효한 코드처럼 보이지만 알기 위해 이진 (objdump를 사용) 어셈블 된 한 바로 내가 다음과 같은 두 가지 지시 사항을 참조 코드의 시작 부분에 :

bfc00220 152a0001 bne t1, t2, 0xbfc00228 
bfc00224 10000009 b 0xbfc0024c 

을 첫 번째 명령은 t1 및 t2 레지스터의 값을 확인하고 같지 않으면 주소로 점프합니다. 두 번째 명령은 폴스 스루 사례를 처리하여 후속 주소로 직접 건너 뛸 수 있습니다. 지금까지 그렇게 좋았습니까, 안 했습니까?

내 지식으로는 이것은 합법적이지 않습니다. 내가 읽었던 사용 가능한 모든 MIPS 문서는 모든 점프/점프 명령 바로 뒤에 오는 명령이 점프 지연 슬롯으로 취급되며 실제 점프가 실행되기 전에 항상 실행되는 명령 (분기 가능한 클래스의 명령 제외)을 취급합니다. 공연.

여기에서 중요한 문제는 다른 분기/점프가 점프 지연 슬롯에이 허용되지 않는 이 허용되지 않으며 프로세서가 정의되지 않은 상태로 남게된다는 것입니다.

그럼이 코드를 작성하려면 어떻게해야합니까? 나는 이것이 알려진 결정 론적 방식으로이 상황을 다루는 cpu를 위해 수작업으로 만들어진 어셈블리 (그것이 너무 길지는 않을지라도)라고 믿지 않는다. 나는 또한 컴파일러가 의도적으로 이와 같은 코드를 생성 할 것이라고 믿을 수 없다. 다른 가능성은 바이너리에 잘못된 디 컴파일러를 사용하고 있거나 엔디안 잘못되었거나 다른 것입니다 ...

아무도 무슨 일이 일어나고 있는지 설명 할 수 있습니까?

+1

재설정 또는 전원을 켠 후에 MIPS 프로세서가 실행하는 첫 번째 명령어의 주소는 무엇입니까? 처음 두 명령어가 어떤 유형의 헤더이고 코드로 실행되지 않는 변경이 있습니까? – rcgldr

+0

'b' 명령은 * branch *이며 "break"는 아닙니다. –

+0

님이 미래의 수색자를 위해 s/break/branch /로 편집되었습니다. – markgz

답변

0

이것은 정의되지 않은 동작이지만 특정 CPU 구현은이 명령 시퀀스에 대해 유용하고 반복적 인 작업을 수행 할 수 있습니다. 말할 수있는 유일한 방법은 해당 실제 구현에서 코드를 실행하는 것입니다. 디버거를 사용하여 각 분기의 대상에 중단 점을 놓고 어떤 분기점에 도달했는지 확인합니다.

코드의 실제 동작이 올바르지 않아서 잡히지 않은 손으로 생성 된 어셈블리의 오류 일 수도 있습니다.

+0

아마도 당신이 맞을지도 모릅니다. 이것은 아마도 수제 조립품 일 것이고, 두 가지 지령은 거기에 배치되어 특정 CPU에 대해 "우연히"예상대로 작동합니다. 이 코드가 실행될 예정인 보드에 jtag 인터페이스가 없지만 일단 역전과 함께 조금 더 진행하면이 코드를 실행하고 직렬 출력을 통해 추적 할 수 있어야합니다. – user3290882

2

"정의되지 않은 동작"은 어떤 일이 발생할지 명시되지 않았 음을 의미합니다. CPU가 잠기거나 실제로 명령을 실행할 수 있습니다.

http://www.pagetable.com/?p=313

또는 대답은 더 간단 할 수있다 :

은 M88K에 사용 된 지연 슬롯 몇 가지 트릭에 대해이 게시물을 참조하면 코드, 데이터에 있지보고 할 수있다. 원시 바이너리에는 코드/데이터 경계에 대한 정보가 없기 때문에 objdump는 기본적으로 의미가 있든 없든 모든 것을 분해합니다.