시작하기 전
이 글은 필자가 수업시간에 들은 내용과 강의록을 토대로 정리한 글입니다.
수업 필기이다 보니, 오류가 있거나 설명이 부족한 부분이 있을 수 있습니다.
궁금하신 점이나 지적하실 점이 있다면 댓글로 달아주세요! 확인 후 내용을 추가하거나 답변해드리도록 하겠습니다 :)
정수 덧셈 / 뺄셈(Integer Addition / Subtraction)
덧셈
뺄셈
- 두 번째 피연산자를 부호를 바꾸어서(negate) 더하기로 연산하도록 한다.
- 위의 과정을 통해 2의 보수법을 사용한 부호 연산이 가능해진다.
오버플로우(Overflow)
- 결과가 값의 범위를 벗어나면 오버플로우가 발생한다.
덧셈
- (양수 + 음수) → 오버플로우 발생 하지 않음
- (양수 + 양수) → 만약 결과의 부호(Sign) 비트가 1이면 오버플로우
- (음수 + 음수) → 만약 결과의 부호(Sign) 비트가 0이면 오버플로우
뺄셈
- (양수 - 양수), (음수 - 음수) → 오버플로우 발생 하지 않음
- (음수 - 양수) → 만약 결과의 부호(Sign) 비트가 0이면 오버플로우
- (양수 - 음수) → 만약 결과의 부호(Sign) 비트가 1이면 오버플로우
연산 | A | B | 오버플로우가 났을 때 결과 |
---|
A + B | ≥ 0 | ≥ 0 | < 0 |
A + B | < 0 | < 0 | ≥ 0 |
A - B | ≥ 0 | < 0 | < 0 |
A - B | < 0 | ≥ 0 | ≥ 0 |
오버플로우의 처리(Dealing with Overflow)
- 몇몇 언어들은 오버플로우를 무시한다.
- 즉, 오버플로우가 난다고 하더라도 그대로 계산을 진행한다.
- MIPS의
addu
, addui
, subu
명령을 사용한다.
- C나 Java의 경우가 이러하다.
- 다른 언어들은 예외가 발생하여 연산이 중지된다.
- MIPS의
add
, addi
, sub
명령을 사용한다.
- 오버플로우가 발생하면, 예외 처리기를 작동시킨다.
- PC를 예외 프로그램 카운터(EPC) 레지스터에 저장한다.
- 미리 정의된 예외 처리기 주소로 점프한다.
- 처리를 마친 후, 연산을 계속하기 위해
mfc0
(보조 프로세서 레지스터로부터 move
) 명령을 이용하여 EPC 값을 되돌린다.
- Ada나 포트란의 경우가 이러하다.