문제

나는 MIPS에 특정 코드를 작성하고 있으며 요구 사항이 일시적으로 결과를 저장하는 시점에 이르렀습니다. HI 그리고 LO 특수 레지스터 (둘 다 너비 4 바이트). 이 지침은 내 처분에 있습니다.

divu     s,t    lo <-- s div t ; hi <-- s mod t
multu    s,t    hi / lo < -- s * t ;

그래서, divu 부서의 결과를 저장합니다 LO 그리고 나머지 HI, 동안 multu 곱셈의 결과를 저장합니다 LO (하부 4 바이트) 및 HI (높은 4 바이트).

나중에 결과를 검색합니다 HI 그리고 LO 레지스터, 나는 할 수있다 :

mfhi $v0
mflo $v1

나는 이미 계산 결과를 저장하는 방법을 알아 냈습니다. LO:

ori     $v0,$0,1            # Store result from $a0 into LO
divu    $a0,$v0
  • 그만큼 divu LO의 부서 결과를 저장하므로 결과를 1로 나누기 위해 결과를 나누는 것입니다.

그러나 저장 HI 더 복잡합니다. 한 가지 방법은 강요하는 것입니다 multu 값을 32 비트 (4 바이트)로 전환하는 지시 :

multu    $a0,0x80000000     # Shift $a0 by 32 bits and store into HI/LO

그러나 결과는 그 가치입니다 HI 어디에 있어야하는지 1 비트입니다 (내 가치가있는 경우 0100 1000 그 다음에 HI 포함됩니다 0010 0100).

누구든지 무언가를 저장하는 방법을 알고 있습니까? HI 등록하다?

도움이 되었습니까?

해결책

NILS Pipenbrinck kk을 확장하고 싶습니다. 답변 :

프로그래머를위한 MIPS32 ARQUITECHTURE에서

MTHI

형식 : MIPS32 (MIPS I)

  MTHI rs

목적 : GPR을 특수 목적에 복사하려면 안녕하세요 레지스터

Description: HI ← rs

GPR RS의 내용은 Special Register HI에로드됩니다.

제한:

Div, Divu, Multu에 의해 Hi/Lo 쌍에 기록 된 계산 된 결과는 새로운 결과를 HI 또는 LO에 작성할 수 있으려면 MFHI 또는 MFLO가 읽어야합니다. 이러한 산술 지침 중 하나이지만 MFLO 또는 MFHI 명령 이전에 MTHI 명령이 실행되는 경우 LO의 내용은 예측할 수 없습니다. 다음 예는이 불법적 인 상황을 보여줍니다.

 MUL       r2,r4   # start operation that will eventually write to HI,LO
 ...               # code not containing mfhi or mflo
 MTHI      r6
 ...               # code not containing mflo
                   # this mflo would get an UNPREDICTABLE value
 MFLO      r3

역사적 정보 :

MIPS I-III에서, 앞의 두 지시 중 하나가 MFHI 인 경우, 해당 MFHI의 결과는 예측할 수 없습니다. HI 또는 LO Special Register의 읽기는 둘 이상의 지침으로 작성하는 후속 지침과 분리되어야합니다. MIPS32 및 MIPS64를 포함하여 MIPS IV 및 나중에이 제한은 존재하지 않습니다.

MTLO

형식 : MIPS32 (MIPS I)

    MTLO rs

목적 : GPR을 특수 목적에 복사하려면 LO 레지스터 설명 :

 LO ← rs

GPR RS의 내용은 특별 레지스터로로드됩니다.

제한 : Div, Divu, Multu 또는 Multu가 Hi/LO 쌍에 작성한 계산 된 결과는 새로운 결과를 HI 또는 LO로 작성할 수 있으려면 MFHI 또는 MFLO가 읽어야합니다.

이러한 산술 지침 중 하나이지만 MFLO 또는 MFHI 명령 전에 MTLO 명령이 실행되면 HI의 내용은 예측할 수 없습니다. 다음 예는이 불법적 인 상황을 보여줍니다.

 MUL       r2,r4   # start operation that will eventually write to HI,LO
 ...               # code not containing mfhi or mflo
 MTLO      r6
 ...               # code not containing mfhi
                   # this mfhi would get an UNPREDICTABLE value
 MFHI      r3

역사적 정보 :

MIPS I-III에서, 앞의 두 지시 중 하나가 MFHI 인 경우, 해당 MFHI의 결과는 예측할 수 없습니다. HI 또는 LO Special Register의 읽기는 둘 이상의 지침으로 작성하는 후속 지침과 분리되어야합니다. MIPS32 및 MIPS64를 포함하여 MIPS IV 및 나중에이 제한은 존재하지 않습니다.

다른 팁

MIPS 명령 설정에는 MFLO/MFHI에 대한 상대가 있습니다.

MTLO/MTHI라고하며 원하는 것을 정확하게 수행합니다.

  mtlo $v0  # moves the contents of v0 into the lo-register
  mthi $v1  # moves the contents of v1 into the hi-register

이 지침은 드물며 종종 요약 된 지침 세트 참조에 존재하지 않습니다.

BTW : Lo/Hi Regs와 관련된 대기 시간 및 위험에 대해 프로세서 매뉴얼을 확인하십시오. 그것들은 매우 특별하며 코드는 쓰기와 읽기 사이에 적어도 3 회주기를 기다리는 것과 같은 것들을 가질 수 있습니다. 불행히도이 동작은 어떤 CPU를 진행하고 있는지에 달려 있습니다.

이것을 잘못 이해하는 것은 야심 찬 MIPS 프로그래머에게 일반적인 함정입니다 :-)

Multu/Divu의 두 번째 논쟁으로 사용될 때 다른 극단적 값이 흥미로운 결과를 낳을 수있는 것에 대해 생각해보십시오 (이것은 숙제 질문처럼 보이기 때문에 의도적으로 모호합니다).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top