본문 바로가기

전공/컴퓨터구조

컴퓨터 구조 및 설계 2장 연습 문제 풀이

컴퓨터 구조 및 설계 2장 연습 문제 풀이

* 개인적으로 문제를 푼 것이며, 풀이 및 계산 과정에 오류가 있을 수도 있습니다.

* 연습문제는 컴퓨터 구조 및 설계 5판 기준입니다.

[2.4]

다음과 같은 MIPS 명령어들이 주어졌을 때 이에 해당하는 C문장은 무엇인가?

변수 f,g,h,i,j,는 각각 레지스터 $s0,$s1,$s2,$s3,$s4에 할당되었고, 배열 A와 B의 시작 주소는 레지스터 $s6과 $s7에 들어있다고 가정한다.

sll $t0, $s0, 2 // $t0 = f * 4 좌로 2만큼 비트이동, 2^2 배

add $t0, $s6, $t0 // $t0 = &A[f] A와 f값 더해서 t0에 넣음

sll $t1, $s1, 2 // $t1 = g * 4 좌로 2만큼 비트이동, 2^2 배

add $t1, $s7, $t1 // $t1 = &B[g] B와 g값 더해서 $t1에 넣음

lw $s0, 0($t0) // f = A[f] $t0메모리 값을 $s0 레지스터로

addi $t2, $t0, 4 // $t2 = &A[f+1] - t0에 정수 4를 더해 A의 다음 배열에 값이 들어가고, 그 값을 t2에 넣음,

lw $t0, 0($t2) // $t0 = A[f+1] $t0에 A[f+1] 넣음

add $t0, $t0, $s0 // $t0 = A[f+1] + A[f] ($s0 = f = A[f]이므로)

sw $t0, 0($t1) // B[g] = A[f+1] + A[f] $t0값을 $t1에 넣음 ($t1 = &B[g])

A: B[g] = A[f+1] + A[f]

 

[2.7]

값 0xabcdef12가 리틀엔디안 컴퓨터와 빅엔디안 컴퓨터에서 어떻게 저장되는지 보여라.

단, 데이터는 주소 0번지에 저장된다고 가정한다.

A :

리틀 엔디안은 하위 바이트가 먼저 저장되고, 빅엔디안은 상위 바이트가 먼저 저장되므로

리틀엔디안 : 12, ef, cd, ab

빅엔디안 : ab, cd, ef, 12

순서로 저장된다.

 

[2.12]

레지스터 $s0와 $s1이 값 0x80000000과 0xD0000000을 갖고 있다고 가정한다.

1) 다음 명령어를 수행 한 후의 $t0값은 무엇인가?

add $t0, $s0, $s1

A : $t0 = $s0 + $s1이 되므로 0x80000000 + 0xD0000000 = 0x150000000 이다.

2) $t0값이 원하던 값인가 아니면 오버플로가 일어났는가?

A : 오버플로가 일어났다.

3) 레지스터 $s0와 $s1 값이 위와 같을 때 다음 명령어를 수행한 후의 $t0값은 무엇인가?

sub $t0, $s0, $s1

A : $t0 = $s0 - $s2 이므로 0x80000000 - 0xD0000000 = -0x50000000이다.

4) $t0 값이 원하던 값인가 아니면 오버플로가 일어났는가?

A : 원하던 값이다.

5) 레지스터 $s0와 $s1 값이 위와 같을 때 다음 명령어를 수행 한 후의 $t0값은 무엇인가?

add $t0, $s0, $s1

add $t0, $t0. $s0

A:

$t0 = $s0 + $s1 = 0x80000000 + 0xD0000000 = 0x150000000 나온 $t0값에 $s0를 더해 다시 넣는다.

$t0 = $t0 + $s0 = 0x150000000 + 0x80000000 = 0x1D0000000

6) $t0 값이 원하던 값인가 아니면 오버플로가 일어났는가?

A : 오버플로가 일어났다.

 

[2.15]

다음 명령어에 대한 16진수 표현은 무엇인가?

sw $t1, 32($t2)

A :

sw는 I타입이고, 구성요소는 opcode, rs, rt, immediate 4개가 있다.

sw opcode 값은 10진수로 43이고, 2진수로 변환하면

sw - 101011

$t1 -> 레지스터 9번이므로 01001

$t2 -> 레지스터 10번이므로 01010

immediate 값은 32메모리주소를 가진 16비트므로 -> 0000 0000 0010 0000

위 순서로 나열해서 자르면 2진수로는 1010 1101 0100 1001 0000 0000 0010 0000

16진수로 표현하면 0xAD490020

 

[2.17]

다음 MIPS 필드가 나타내는 명령어의 종류, 어셈블리 명령어, 명령어의 이진 표현을 나타내라.

op = 0x23, rs = 1, rt = 2, const = 0x4

A:

op=0이 아니면 대부분 I타입을 의미한다. 그러므로 I타입이며,

opcode의 16진수 0x23을 10진수로 바꾸면 35이며, 이는 lw 명령어의 값과 같다.

const는 I타입에서 immediate 값을 의미하니 위 값들을 2진수로 나열하면

opcode = 100011 rs = 00001 rt = 00010 immediate = 0000 0000 0000 0100

이 값을 나열하고 4자리씩 나누어 나열하면

1000 1100 0010 0010 0000 0000 0000 0100 이 된다.

 

[2.20]

레지스터 $t0의 비트 16-11을 추출하여 $t1의 비트 31-26을 대체하려한다.

단 $t1의 다른 비트들은 변화해서는 안된다. 이를 수행하는 최소 크기의 MIPS 명령어 시퀀스를 작성하라.

A:

srl $t0, $t0, 11 // 우로 11만큼 비트 이동, 0~10 사이의 비트는 삭제됨

sll $t0, $t0, 26 // 좌로 26비트 만큼 이동, 11~16 사이의 비트를 제외한 모든 비트가 삭제됨.

sll $t1, $t1, 6 // 좌로 6만큼 비트 이동, 왼쪽 끝의 26~31 사이의 비트는 삭제됨.

srl $t1, $t1, 6 // 다시 우로 6만큼 비트 이동, 26~31 사이의 비트는 0으로 초기화되고, 나머지는 원래대로 돌아옴

or $t1, $t1, $t0 // $t1과 $t0 or연산하여 계산. 이때 $t0는 대체하려는 내용을 제외하곤 전부 0이고, $t1은 대체하려는 부분

은 전부 0이고 나머지는 그대로 이므로 or연산 시 $t1의 비트 31-26은 $t0로 대체되며, 이을 제외하고는 변화가 없다.