MIPS 반전을위한 분기 지연 슬롯 이해

radare2를 사용하여 Atheros AR7161 용으로 컴파일 된 일부 소프트웨어를 정적으로 반전시키고 있습니다. 이 프로세서는 MIPS를 구현하며 MIPS에 분기 지연 슬롯이 있다는 것을 기억합니다. 이것은 분기가 바로 뒤에 배치되기 전에 논리적으로 실행되어야하는 명령을 볼 수 있기 때문에 디스 어셈블리에서 실제로 눈에.니다.

그러나 일부 코드를 분석하는 동안 다음을 가정하는 beqz 명령을 발견했습니다. 먼저 실행되어야하는 명령어는 프로그램의 맥락에서 의미가 없습니다. 나는 내 분석이 잘못되었을 수 있음을 인정해야합니다. 그러나 나는 또한 지우고 싶다는 의구심이있다 :

  • 모든 분기 / 점프 명령은 항상 분기 지연 슬롯을 사용하여 바로 다음 명령이 논리적으로 먼저 실행되어야합니다. ? 그렇지 않다면 어떤 경우에는 그렇지 않습니까?

  • radare2가 바이너리로 인코딩 된 순서가 아닌 논리적 실행 순서를 표시하도록하는 방법이 있습니까?

편집 : 구체적으로 다음 순서를 다루고 있습니다.

beqz v0, <some address> lb v0, 0x40(sp) 

이 명령이 파이프 라인으로 들어가는 것에 대해 머릿속에 매우 널리 퍼진 그림이 있습니다. 첫 번째 명령이 디코딩되는 동안 두 번째 명령이 가져 오는 것을 상상할 수 있습니다. , 분기 지연 슬롯의 실행이 실제로 시작되어야하지만 분기 명령은 분기 지연 슬롯의 명령에 의해 수정되는 동일한 레지스터에 따라 달라 지므로 어떻게됩니까? 분기 명령은 이전 레지스터 va를 사용하여 조건을 평가합니까? lue 또는 lb에 의해 업데이트 된 새 버전?

감사합니다

댓글

  • 다음과 같은 방법으로 MIPS 시리즈를 읽으면 이점을 얻을 수 있습니다. Raymond Chen 여기 : link 첫 번째 대답은 아니요입니다 (자세한 내용은 링크 참조). 나는 ' 초에 대답 할 수 없습니다.

답변

분기 지연 슬롯의 명령은 분기 (또는 점프) 명령 이후에 평가됩니다. 분기 지연 슬롯에서 명령 실행은 분기 조건 평가에 영향을 미치지 않습니다.

분기 지연 슬롯이 몇 가지 용도로 사용되는 것을 관찰했습니다.

  • 분기 명령어로 이어지는 기본 블록의 마지막 명령어
    • 분기 테스트는 분기 지연 슬롯 명령어 계산의 출력에 종속되지 않습니다.
    • 무조건 점프 / 분기에서 흔히 볼 수 있습니다. b, jal
  • 폴 스루 블록의 첫 번째 명령 .
    • 분기를 사용하는 경우 부작용이 없어야합니다.
    • 분석 결과 분기가 사용되는 경우 영향을받는 레지스터가 필요하지 않음이 표시됩니다.
  • 분기가 수행되는 경우 블록의 첫 번째 명령
    • 분기 대상에 대한 경로가 여러 개인 경우이 명령은 다른 분기로 여러 번 표시 될 가능성이 높습니다.
  • 조건부 값로드 (종종 반환 값)

이 도움말 분기 지연 슬롯에 대해 자세히 설명합니다.

Igor가 언급했듯이 분기 명령의 “가능성이 높은”버전은 명령이 실제로 수행 된 경우에만 분기 지연 슬롯에 명령의 효과를 유지합니다.

p>

답변

  1. “branch [on condition] like”라는 조건부 분기의 변형이 있습니다. 예 :
    • bgezl-0보다 크거나 같을 가능성이있는 분기
    • beql-분기에 같음

이러한 명령어는 지연 슬롯이 있지만 지연 슬롯의 명령어는 만 실행됩니다. div id = “2d4d52c568″>

브랜치를 취한 경우. 분기를 가져 오지 않으면 지연 슬롯의 명령이 실행되지 ( nullified ) .

주의 :이 지침은 MIPS 아키텍처의 릴리스 6에서 제거되었습니다. 또한 지연 슬롯이없는 가지의 간결한 변형을 추가했습니다.

스 니펫의 경우 분기가 이전 레지스터 값을 사용한다고 강력하게 의심하지만 확인하실 수 있습니다. 실제 프로세서에서 실행해야합니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다