우선, 산술명령어(addi/addiu) 일 때, 상수 operand 가 signed number여야 한다고 가정하기 때문에
그 값이 -32768~32767 의 범위를 벗어나면 out-of-range가 발생하며
논리명령어(andi/ori) 일 때, 상수 operand 가 unsigned number여야 한다고 가정하기 때문에
그 값이 0~65535를 범위를 벗어나면 out-of-range가 발생한다.
그런데 SPIM assembler 는 상수를 해석할 때는 어떤 명령어인지 상관이 없이 십진수로 썼는지 16진수로 썼는지에 따라 해석을 한다.
즉, 10진수로 쓰면 signed number로 보고 sign extension을 하며,
16진수로 쓰면 unsigned number로 해석하여 zero extension을 한다.
이해를 위해 간단한 예를 통해서 알아보자.
0x8000는 16진수로 쓰여있기에 unsigned number 로 해석되어 +32768 이 되는데
addi가 산술명령어라서 -32768~32767 범위 밖에 있기에 out-of-range error 를 발생시킨다.
⇒ $t1 이 +32768 의 값을 갖도록 ori 명령을 대신 수행하여 0x00008000 의 값을 갖게 된다.