시작하기 전
이 글은 필자가 수업시간에 들은 내용과 강의록을 토대로 정리한 글입니다.
수업 필기이다 보니, 오류가 있거나 설명이 부족한 부분이 있을 수 있습니다.
궁금하신 점이나 지적하실 점이 있다면 댓글로 달아주세요! 확인 후 내용을 추가하거나 답변해드리도록 하겠습니다 :)
음수 표현법(How to represent negative numbers?)
대부분, 2’s complement를 사용한다.
부호 있는 2의 보수 정수(2’s Complement Signed Integers)
x=−xn−12n−1+xn−22n−2+⋯+x121+x020
이다.
- MSB는 부호(sign) 비트이다.
- 음수의 경우엔 1
- 음수가 아닐 경우엔 0이다.
- 따라서, −(−2n−1) 은 표현될 수 없다.
- 음수가 아닌 수들은 자명하게 부호가 없는 수의 표현과 2의 보수 표현이 같은 표현을 가진다.
- 범위 : −2n−1 부터 2n−1−1 까지
- 8 비트를 사용한다면 → -128 ~ 127
- 16 비트를 사용한다면 → -32768 ~ 32767
- 32 비트를 사용한다면 → -2,147,483,648 ~ 2,147,483,647
- 특수한 경우
- 0은 항상 0000 0000 … 0000 이다.
- -1은 항상 1111 1111 … 1111 이다.
- 가장 작은 수는 항상 1000 0000 0000 … 0000 이다.
- 가장 큰 수는 항상 0111 1111 … 1111 이다.
부호 바꾸기(Signed Negation)
- 부호를 바꾸는 법 : 모든 비트들을 뒤집고(flip), 1을 더하면 된다.
x+xˉ=1111⋯1112=−1
xˉ+1=−x
부호 확장(Sign Extension)
- 부호 확장은 더 많은 비트를 사용해서 숫자의 값은 유지하면서 표현하는 방법이다.
- MIPS 명령 셋에선 다음의 명령들로 수행 가능하다.
addi
: 덧셈 연산을 통해서 즉각적으로 확장한다.
lb
, lh
: 불러와진 바이트나 하프워드(halfword)를 확장한다.
beq
, bne
: 변위(displacement)를 확장한다.
- 부호 비트를 왼쪽으로 복제해서 확장한다. 참고로, 부호가 없는 값은 0을 복제해서 확장한다.
16진수
하나의 16진수 숫자마다, 4 비트가 들어간다고 보면 된다. 즉, 비트 문자열을 짧게 표현한 것이라고 보면 된다.
명령 표현하기(Representing Instructions)
- 명령들은 기계 코드(Machine code)라고 불리는 이진수로 인코딩 된다.
- MIPS 명령
- 정확히 32 비트의 명령 word로 인코딩 된다.
- 연산이나 레지스터 등을 인코딩할 때, 적은 수의 명령(Instruction) 포맷을 가진다.
- 레지스터의 번호(Register numbers)
$t0
- $t7
은 레지스터 8번 - 15번이다.
$t8
- $t9
은 레지스터 24번 - 25번이다.
$s0
- $s7
은 레지스터 16번 - 23번이다.
-
명령 변수(Instruction fields)
- op : 연산 코드(operation code)
- rs : 첫 번째 소스(source) 레지스터
- rt : 두 번째 소스(source) 레지스터
- rd : 목적지(destination) 레지스터
- shamt : 총 시프팅(shift) 수 → 시프트 명령(Shift instruction)에만 쓰인다.
- funct : 함수 코드(operation code를 확장한다)
-
예시 : add
, sub
, and
, slt
등
-
즉각 산술 연산 그리고 불러오기/저장(Load/Store) 명령에 사용된다.
- rt : 목적지(destination) 혹은 소스(source) 레지스터
- 상수(Constants) : −215 에서, 215−1 까지
- 주소(Address) : rs에서 오프셋이 기본 주소에 더해진다.
-
예시 : lw
, beq
, slti
, lui
등
-
디자인 원칙(Design Principle) 4 : 좋은 디자인은 좋은 타협이 필요하다.
- 포맷이 여러개 생기는 것은 디코딩을 복잡하게 하지만, 명령이 일정하게 32 비트가 될 수 있게 지킬 수 있게 한다.
- 포맷을 가능한 비슷하게 한다.
논리적 연산(Logical Operation)
Operation | C | Java | MIPS |
---|
Shift left | << | << | sll |
Shift right | >> | >>> | srl |
Bitwise AND | & | & | and, andi |
Bitwise OR | | | | | or, ori |
Bitwise NOT | ~ | ~ | nor |
- word에 비트들을 풀어넣거나 삽입할 때 유용하다.