MIPS의 논리 연산과 메모리에 접근하는 Data Transfer 연산에 대해 알아본다.
- 논리 연산
- C언어에서 3 & 1 연산을 하면 결과는 1이 나온다. 이유는 C와 같은 고급 언어에서는 0이 아닌 모든 수를 참으로 가정하기 때문에 참 & 참 = 참이므로 결과가 1(참)이 나오는 것이다.
- 하지만 기계어에서 진행되는 bit 단위 연산에서 3 & 1 을 수행하면 0011 & 0001 = 0001 이다.
- 예시가 좀 별론데...어쨌든 무슨 의미인지 알겠죠? ㅎ
- 논리 연산에서도 산술 연산과 마찬가지로 immediate 값(16bit)을 사용할 수 있다.
- 레지스터에는 32bit 값을 저장할 수 있는데, immediate에는 16bit 값을 저장한다. and immediate에서는 32bit의 레지스터 값과 16bit의 immediate값을 bit 단위 논리 연산해야 하는 경우가 발생한다. 이 연산을 어떻게 진행해야 할까?
- 양수끼리의 연산이라면, 0을 사용해 16bit를 확장하면 된다(32bit가 되도록).
- 음수가 있는 연산이라면, 2의 보수법에 따라 MSB가 signed bit일테니 immediate의 MSB값으로 모자란 16bit를 확장하면 된다.
- 레지스터에는 32bit 값을 저장할 수 있는데, immediate에는 16bit 값을 저장한다. and immediate에서는 32bit의 레지스터 값과 16bit의 immediate값을 bit 단위 논리 연산해야 하는 경우가 발생한다. 이 연산을 어떻게 진행해야 할까?
- 메모리에 접근하는 연산
- load word(4 byte): 메모리에 저장된 값을 레지스터로 옮김, 4byte를 저장함
- store word(4 byte): 레지스터의 값을 메모리에 저장함
- load halfword(2 byte): 메모리에 저장된 값을 레지스터로 옮김
- load byte unsigned:
- store byte(1 byte): 1 byte를 저장함
- MIPS에서 메모리의 특정 주소를 표현하려면 32bit가 필요했다. 그런데 MIPS의 기계어 하나는 32bit이므로 주소를 나타낼 공간이 부족하다. 메모리 주소 외에도 opcode와 값을 load/store하는 데 사용할 레지스터가 적어도 하나 필요하기 때문이다. 따라서 load/store에서는 접근하려는 메모리의 기본 주소(base address)를 레지스터에 저장한 후, 16bit를 사용해 해당 주소로부터 얼만큼(몇 번지) 떨어진 곳의 값을 가리킬 것인지를 저장한다.
- 레지스터 하나의 크기는 4byte인데, store byte의 경우 1byte를 저장하는 명령어이므로 상위 3byte를 잘라낸 후 하위 1byte만을 메모리에 저장한다. 메모리로부터 1byte를 읽어오는 경우 MSB 값으로 sign extension을 진행한 후 레지스터에 저장한다.
- 모든 MIPS연산은 unsigned로 하는 것이 가능하다. load byte unsigned 등이 그 예인데, 이는 MSB값을 sign bit로 해석하지 않고, 1byte 내의 모든 값을 양수로 해석하는 연산이다. 이 경우 sign extension할 때 비어있는 bit값들을 무조건 0으로 채운다.
정리하자면,
- MIPS에서 모든 메모리 접근은 load/store을 통해서만 가능하다.
- 메모리로부터 halfword 또는 byte 단위 load 시
- signed operation의 경우 sign extension 진행
- unsigned operation의 경우 zero extension 진행(unsigned가 명시적으로 붙지 않으면 signed operation으로 간주한다.)
- Alignment restriction
- MIPS에서 word(4byte) 단위의 load/store할 때는 메모리 주소가 4의 배수여야 한다.
- halfword(2 byte) 단위 load/store할 때는 메모리의 주소가 2의 배수여야 한다.
- 메모리로부터 4byte를 load하고 싶은데, 메모리 상의 읽고 싶은 부분의 시작 주소가 4의 배수가 아니라면 어떻게 해야 하는가?
- 2 byte로 끊어 읽든지 1byte로 끊어 읽든지 해야한다.
'System SW' 카테고리의 다른 글
[2.5] MIPS Instruction Set Architecture V - 연산별 비트 구조 (0) | 2022.10.13 |
---|---|
[2.4] MIPS Instruction Set Architecture IV - branch & jump 연산 (0) | 2022.10.12 |
[2.2] MIPS Instruction Set Architecture II - 비트 포맷 및 산술 연산 (0) | 2022.10.12 |
[2.1] MIPS Instruction Set Architecture - 레지스터 및 메모리 모델 (0) | 2022.10.12 |
[1] System Software & Instruction Set Architecture (0) | 2022.10.12 |
댓글