2014-04-09 5 views
2

부호 확장이 MIPS addi 명령의 즉시 값으로 발생한다는 것을 알게되었습니다. (http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/Mips/addi.html)MIPS의 addi 명령 정보

그러나 서명 할 때 언제 마이너스 값으로 연장할지는 확실하지 않습니다.

나는

main: 
    addi $t0, $0, 0x8000 
    jr $31 

이 코드를 시도하고 qtSpim 다음과 같은 오류를했다.

파일 ADDI의 $ t0의 라인 3 범위 (-32768 .. 32767), $ 0 아웃

치값 (32768)은 0x8000을

마이너스 값을 부호 확장하기 위해, MSB는이어야 '1'이지만 범위를 벗어나 즉시 값이됩니다.

그래서, 내가 추측하는 바는 addi은 '실제로'부호가 확장 된 것입니다. 맞습니까?

그렇지 않다면 내가 잘못 이끌었던 곳을 알려주실 수 있습니까? 또한 기호 확장의 예는 많은 도움이됩니다.

+2

나는 어셈블러가 0x8000을 양수 상수로 취급한다고 생각한다. -0x8000 또는 -32768을 사용해야합니다. –

+0

고마워요! 나는 -0x8000을 시도했으나 정상적으로 작동했다. – user3415167

답변

0

addi는 부호있는 값을가집니다. 조립 ADDI 명령의 형식은 다음과 같습니다

bit 31-26 25-21 20-16 15-0 
value 8  rs  rd (signed) const 

* 출처 참조 MIPS 실행 (8)는 연산 코드가

는, RS 대상 레지스터, RD 소스 레지스터이며, (서명) CONST 부호있는 정수가 rd에 추가됩니다.

어셈블러는 0x8000 값을 제공하는 (선택적으로) 부호있는 16 비트 정수를 예상합니다. 당신이 사용하고있는 특정 어셈블러는 16 진수로 이것을 32768로보고 있습니다.

나는 당신이 btw하고있는 무엇이든 오버플로에 대해 조심할 것입니다.

0x8000이 정수 또는 원시 이진 값으로 처리되는지 여부는 사용중인 어셈블러에 따라 다릅니다. Lưu Vĩnh Phúc는 -0x8000 또는 -32768이 효과가 있다고 지적했습니다. -0x8000 대신 -32768을 사용하는 것이 좋을 것입니다. 이것은 같은 방법으로 다른 어셈블러에서 받아 들일 가능성이 더 큽니다. 미안하다. 테스트에 편리한 밉스 툴체인이 없다.