MIP의 HI 및 LO 레지스터에 값을 저장합니다
-
05-07-2019 - |
문제
나는 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의 두 번째 논쟁으로 사용될 때 다른 극단적 값이 흥미로운 결과를 낳을 수있는 것에 대해 생각해보십시오 (이것은 숙제 질문처럼 보이기 때문에 의도적으로 모호합니다).