2013-03-07 3 views
0

addi 명령으로 인해 오버플로 예외가 발생한다는 것을 알고 있습니다. 현재 Bluespec HDL을 사용하여 예외를 발생시키고 적절하게 처리하는 프로세서를 시뮬레이트합니다.MIPS의 "addi"명령에서 오버플로 - 예

어쨌든 MIPS의 addi 명령을 사용하여 오버플로 예외를 트리거하는 테스트 사례를 작성하고 있습니다.

참고 : 내가 테스트하는 프로세서는 SMIPS 기반이지만 예외 및 인터럽트와 같은 목적으로 일부 MIPS 명령어를 지원합니다.

if (function == Addi) begin 
    if((a < 0 && b < 0 && result >= 0) || (a >0 && b > 0 && result < 0)) 
    return True; 
    else 
    return False; 
end 

질문 :

나는 오버 플로우를 검출 내 논리가 정확한지 (아래 의사 코드)를 알고 무엇 오버 플로우의 예가 될 수 있습니다 나는 다음과 같은 노력하고 있어요 : (인라인 어셈블리 사용 __asm__)

addi $2, $0, 0x7fff 
addi $3, $2, 0x000f 

이 예외는 발생하지 않습니다. 그리고 내가 이것을 시도하면 :

addi $2, $0, 0x7fffffff 
addi $3, $2, 0x0000000f 

즉시는 16 비트 여야하기 때문에 어셈블러 오류가 발생합니다. andi에서 오버플로를 얻으려면 어떻게해야합니까? 나에게 좋은 예제를 줄 수 있니? 높은 순서의 비트를 채우기 위해 다른 명령어를 사용해야합니까?

는 레지스터가 32 비트이기 때문에 당신은

답변

1

첫 번째 순서는 오버 플로우 예외가 발생하지 않습니다 감사합니다. 32767 + 15 = 32782, 32 비트 이내.

MIPS에서 단일 명령으로 큰 즉시 수를로드 할 수 없습니다. 먼저 LUI 명령어를 사용하여 상위 16 비트를로드 한 다음 하위 16 비트에 ADDI (또는 ORI 또는 ​​XORI)를로드합니다.

LW를 사용하여 32 비트 값을 메모리에서 가져올 수도 있습니다.

+0

조립에 익숙하지 않아 예제를 넣을 수 있습니다. 감사합니다 –

+0

어떻게하면 HDL을 사용하고, 프로세서를 시뮬레이트하고, 오버플로 감지를 구현하는 코드를 작성하지만 어셈블리 지침을 이해할 수 없는지 이해할 수 없습니다. – NovaDenizen

+0

음. 나는 프로세서 아키텍처를 테스트하는 프로젝트의 일환이다. Bluespec은 어셈블리 세부 사항을 이해할 필요없이 프로세서를 파이프 라인 처리하는 규칙 만 정의하는 매우 높은 수준의 사고입니다. 내 이전 질문을 신경 쓰지 마라, 나는 네가 의미하는 바를 이해한다. –