2017-11-23 4 views
1

주소 0x20000004에서 점프 명령이 있다고 가정합니다. 자, 내가 알고 있듯이 점프 간격은 PC 값과 관련이 없지만 32 비트 레지스터 최대 값의 약 1/16의 절대 간격입니다. 이제는 점프 명령이 기계어 코드에서 어떻게 구성되는지를 고려해 볼 때,이 특정 경우에 최대 후진 점프는 1 명령이거나 0x20000000을 주소 지정합니다. 반대의 경우 : 주소 0x1FFFFFFC에서 명령을 건너 뛰고 0x20000004를 주소 지정하기 위해 2 개의 명령보다 먼저 건너 뛰고 싶습니다. 그게 가능하지 않니? 어셈블러는이 두 가지 경우 중 하나에 지침을 배치하지 않는 방법은 무엇입니까? 편집 : 고정 약간의 오차MIPS 점프 명령과 절대 값 결과

+0

_ "이 특별한 경우에 최대 후진 점프가 4 가지 명령어임을 의미합니까?" 그 생각은 어디서 났니? _ "또는 주소 0x20000000?"_ 각 명령어는 1 바이트가 아닌 4 바이트입니다. _ "0x1FFFFFFE 번지에서 명령어 점프"_ 명령어는 워드로 정렬되어야하므로 불가능합니다. – Michael

+0

일반적으로 그것은 섹션을 배치하는 링커이고, 이것들은 충분히 큰 범위이므로 일반적으로 모든 코드 (하나 이상의 모듈)를 하나의 단일 코드로 채우는 데 아무런 문제가 없습니다. 덧붙여 말하자면, GNU ld는 버그가있는 것처럼 보입니다.이 시나리오가 강제로 실행된다면 경고 없이도 점프가 잘립니다. – Jester

답변

1
  • 타겟 어드레스의 하위 28 비트가 J 명령어의 26 개 최하위 비트가 설정되고, 왼쪽으로 2 비트 시프트.
  • 대상 주소의 상위 4 비트는 분기 지연 슬롯의 명령어 주소 중 최상위 4 비트로 설정됩니다.

따라서 분기 지연 슬롯의 명령어와 동일한 256MB 영역 내 어디에서나 단어 단위로 점프 할 수 있습니다. 실제로는 J 명령어가 256MB 영역의 마지막 워드에있는 경우를 제외하고는 J 명령어와 동일한 256MB 영역 내의 아무 곳으로도 이동할 수있는 것과 같습니다.

+0

그래, 점프 지시와 목적지가 2 개의 다른 지역에 있다면, 비록 1 개의 지시에 의해 분리 되더라도, 당신은 점프를 할 수 없다는 나의 hypotesis를 확인하고 있단 말인가? – Nicholas

+0

_ "점프 명령과 대상이 2 개의 다른 영역에있는 경우 1 명령으로 분리해도 점프를 할 수 없습니까?"_ 점프 명령이 마지막 단어에있는 특정 경우에 가능합니다. 256 MB 영역. – Michael

+2

PC 값이 가져 오는 과정에서 PC + 4로 바뀌므로 다음 지역의 첫 번째 주소가되므로이 경우가 맞습니까? – Nicholas