Instruction의 피연산자로 올 수 있는 것들에 대해 알아본다.
Arithmetic Instruction은 레지스터 피연산자를 사용한다. 앞으로의 설명은 MIPS 아키텍쳐 기준으로 한다.
$t0
, $t1
, ..., $t9
: 임시(temporary) 값을 저장할 레지스터$s0
, $s1
, ..., $s7
: 보존할(saved) 값을 저장할 레지스터앞 포스팅에서 들었던 예제 f = (g + h) - (i + j);
를 레지스터들을 이용한 어셈블리로 변환해보자.
여기서 변수 f
, g
, h
, i
, j
는 각각 레지스터 $s0
, ..., $s4
에 저장되어 있다고 한다.
add $t0, $s1, $s2 # $t0 = g + h
add $t1, $s3, $s4 # $t1 = i + j
sub $s0, $t0, $t1 # f = $t0 - $t1
메인 메모리는 복합적인 데이터(배열, 구조체, 동적인 데이터)를 저장하는 데에 사용된다. 또, 레지스터는 32bit, 32개로 한정되어 있기 때문에 여기에 들어갈 수 없는 데이터가 메모리에 저장되기도 한다.
Memory Instruction에는 lw (Load Word), sw (Store Word) 가 있다. 피연산자로는 목적지 레지스터, 오프셋, 베이스 레지스터가 있는데 말로 하는 것보다 사용 예시를 한 번 살펴보자
lw $t0, 32($s3) # Load Word Example
우선, lw다. 여기서 $t0
는 메모리에서 가져온 데이터를 담을 레지스터이다. 그리고 $s3
는 접근할 메모리를 저장하고 있는 레지스터이고, base register라고 한다. 그리고 숫자 32
는 Offset인데 (베이스 레지스터의 주소값 + Offset) 위치에서 최종적으로 데이터를 가져온다.
위 코드의 결과는 ($s3
에 저장된 주소값 + 32) 위치에서 1 word를 가져와 $t0
에 저장하는 것이다.
sw $t0, 32($s3) # Store Word Example
sw도 명령어 형태는 lw와 동일하다. 그리고 접근하는 주소를 계산하는 법도 (베이스 레지스터의 주소값 + Offset)으로 lw와 동일하다. lw와의 차이점은 $t0
에 메모리의 값을 저장하는 것이 아니라, $t0
에 있는 값을 해당 메모리 주소에 저장하는 것이다.
이번에는 C 코드를 MIPS Instruction으로 변환하는 예제로 실용적인 사용법을 알아보도록 하자.
g = h + A[8]; // g: $s1, h: $s2, A의 베이스 주소: $s3(A는 int(4byte) 배열)
여기서 주목할 점은 A[8]
의 값을 가져오는 방식이다. 포인터를 제대로 공부했다면 당연히 A
라는 식별자가 배열의 첫 요소의 주소값을 가리키는 것과 A[8]
은 베이스 주소값인 A
에서 32(4 * 8)바이트 뒤에 위치한다는 사실 쯤은 알고 있어야 한다. 여기서는 부연 설명 없이 바로 변환하겠다. 이 예시에는 없지만 sw도 마찬가지 방식이므로 직접 한 번 시도해보자.
lw $t0, 32($s3) # $t0 = A[8]
add $s1, $s2, $t0 # g = h + $t0
즉시값은 숫자, 메모리 주소 같은 상수를 직접 입력하는 방식의 피연산자를 말한다. 대표적인 Immediate Operation으로는 add
의 Immediate 버전인 addi
가 있다.
addi $s3, $s3, 4 # $s3 = $s3 + 4(Immediate)
subi
는 없다. 대신, 즉시값으로 음수를 넣는 것으로 대체 가능하다.
MIPS에서는 상수 0을 대신할 수 있는 레지스터 $zero
를 제공한다. $zero
에는 값을 덮어쓸 수 없으며 $zero
와 add
를 이용하면 레지스터에 값을 복사할 수 있다.
add $t2, $s1, $zero # $t2 = $s1
[컴퓨터 구조] 4.2 Logic Design Conventions (0) | 2020.10.25 |
---|---|
[컴퓨터 구조] 4.1 Introduction (0) | 2020.10.25 |
[컴퓨터 구조] 2.2 Operations of the Computer Hardware (0) | 2020.10.25 |
[컴퓨터 구조] 2.1 Introduction (0) | 2020.10.25 |
[컴퓨터 구조] 1.10 Fallacies and Pitfalls (0) | 2020.10.25 |
댓글 영역