본문 바로가기
컴퓨터구조

컴퓨터구조 4주차

by mokhwasomssi 2021. 2. 18.

1/4 월 ~ 1/10 일 : 4시간

이번주 정리

1. 한장한장 넘길 때마다 모르는 것 투성이네~

2. 2.9절 좀 어려워서 강의 들어봤는데 괜찮네 진도가 빨라서 복습하기에 좋을 듯

책으로 예습하고, 강의로 핵심내용 정리


1/6 수 : 2시간

2.9 MIPS의 32비트 수치를 위한 주소지정 및 복잡한 주소지정 방식

이 절에서는 32비트 상수를 지원하는 방법과

분기 명령어나 점프 명령어에서 사용되는 명령어 주소의 최적화를 알아본다.

32비트 수치 피연산자

프로그램에서 사용하는 상수는 대체로 크기가 작아서

16비트 필드면 충분하지만 때에 따라서 더 큰 상수가 필요한 경우도 있기 때문에

MIPS는 레지스터 상위 16비트에 상수를 넣는 lui (load upper immediate) 명령어를 제공한다.

lui 명령어의 동작

The machine language version of lui $t0, 255 # t0 is register 8:

001111 00000 01000 0000 0000 1111 1111

Contents of register $t0 after executing lui $t0, 255:

0000 0000 1111 1111 0000 0000 0000 0000

32비트 상수의 로딩

레지스터 $s0에 다음 32비트 상수를 채우는 MIPS 어셈블리 코드를 작성하라.

0000 0000 0011 1101 0000 1001 0000 0000

상위 16 비트 채움 lui $s0, 61

하위 16비트 더함 ori $s0, $s0, 2304

하드웨어 소프트웨어 인터페이스

컴파일러나 어셈블러는 큰 숫자를 직접 다룰 수 없기 때문에

몇 조각으로 나눈 후 레지스터에서 재조립해야 한다.

수치 명령어의 상수는 물론 load나 store의 메모리 주소도

상수 필드 크기의 제약이 문제가 된다.

MIPS 소프트웨어처럼 이 문제를 어셈블러가 해결하도록 하려면

큰 값을 만드는 데 사용할 임시 레지스터를 제공해야 한다.

어셈블러를 위해 예약된 레지스터 $at가 이런 용도로 사용된다.

분기와 점프 명령에서의 주소지정

점프 명령 j 10000 # go to location 10000

2
6 bits
10000
26 bits

조건부 분기 명령 bne $s0, $s1, Exit # go to Exit if $s0 ≠ $s1

5
6 bits
16
5 bits
17
5 bits
Exit
16 bits

프로그램 크기 216 는 너무 작음

PC = 레지스터 + 분기주소 를 통해 프로그램 크기 232 까지 키움

그러면 분기주소에 어떤 레지스터를 더함?

PC (program counter) = PC + 분기주소

조건부 분기는 주로 순환문이나 if문에서 사용되므로 가까이 있는 명령어로 분기하는 경향이 있다.

PC는 현 명령어의 주소를 가지고 있으므로 분기 주소를 더할 레지스터로 PC를 선택하면

현 위치에서 ±215 워드 이내 떨어진 곳은 어디든지 분기할 수 있다.

거의 모든 순환문과 if문의 분기 범위가 216 워드 이내이므로 PC는 이상적인 선택이다.

이런 분기 주소지정 방식을 PC 상대 주소 지정(PC-relative addressing) 방식이라 한다.

조건부 분기의 목적지는 대체로 가까운 곳에 있기 때문에

MIPS도 모든 조건부 분기 명령에 PC 상대 주소를 사용한다.

반면에 프로시저들은 가까이 붙어 있어야 할 이유가 없으므로

MIPS 구조에서 j 명령어나 jal 명령어가 긴 주소를 사용할 수 있도록 J 타입 형식을 사용한다.

MIPS 명령어의 길이는 항상 4바이트이므로,

MIPS의 PC 상대 주소지정 방식에서는 분기할 거리를 바이트 수가 아니라 워드 수로 나타내면 더 먼 거리까지 분기할 수 있다.

바이트 주소 대신 워드 주소를 사용함으로써 분기 거리를 4배로 늘릴 수 있는 것이다.

→ 주소를 넣을 공간이 작으니까 확장시킨다.

기계어에서의 분기 변위

while ( save[i] == k )
     i += 1;
Loop : sll $t1, $s3, 2         # Temp reg $t1 = i * 4
     add $t1, $t1, $s6         # $t1 = address of save[i]
     lw $t0 , 0($t1)           # Temp reg $t0 = save[i]
     bne $t0, $s5, Exit        # go to Exit if save[i] ≠ k
     addi $s3, $s3, 1          # i = i + 1
     j Loop                    # go to Loop
Exit :

Loop의 주소가 80000번지라고 할 때 위 프로그램에 해당하는 MIPS 기계어 코드는?

어셈블된 명령어와 그 주소는 다음과 같다.

80000 0 0 19 9 2 0
80004 0 9 22 9 0 32
80008 35 9 8 0
80012 5 8 21 2
80016 8 19 19 1
80020 2 20000
80024 ...

MIPS 명령어는 바이트 주소를 사용하므로 이웃한 워드의 주소는 4씩 차이가 남을 기억하라.

점프 명령어는 Loop에 해당하는 주소 전체(20000x4 = 800000)를 사용한다.

하드웨어 소프트웨어 인터페이스

거의 모든 조건부 분기의 목적지는 가까운 곳이지만,

가끔은 16비트로 나타낼 수 없는 먼 곳으로 분기하는 경우도 있다.

분기 목적지로 가는 무조건 점프를 삽입한 후,

분기 조건을 반대로 만들어서 이 점프를 건너뛸 것인지 말 것인지를 결정하게 한다.

아주 먼 거리로의 분기

레지스터 $s0가 레지스터 $s1과 같으면 분기하는 코드

beq $s0, $s1, L1

를 L1이 아주 멀어도 분기가 가능하도록 바꾸되 명령어 두 개를 사용하라.

    bne $s0, $s1, L2

    j L1

L2:

MIPS 주소지정 방식 요약

여러 형태의 주소 표현을 일반적으로 주소지정 방식(addressing mode)이라 한다.

- 피연산자와 주소를 다양하게 사용하여 실제 주소를 나타내는 여러 방식.

MIPS에서 사용되는 주소지정 방식은 다음과 같다.

1. 수치(immediate) 주소지정 : 피연산자는 명령어 내에 있는 상수이다.

2. 레지스터 주소지정 : 피연산자는 레지스터이다.

3. 베이스(base) 또는 변위(displacement) 주소지정 : 메모리 내용이 피연산자이다.

4. PC 상대 주소지정 : PC 값과 명령어 내 상수의 합을 더해서 주소를 구한다.

5. 의사직접(pseudodirect) 주소지정 : 명령어 내의 26비트를 PC의 상위 비트들과 연접하여 점프 주소를 구한다.

하드웨어 소프트웨어 인터페이스

MIPS 구조는 32비트 주소를 사용한다고 설명하기는 했지만,

거의 모든 마이크로프로세서(MIPS를 포함해서)가 64비트로 주소를 확장할 수 있다.

이것은 더 큰 프로그램을 필요로 하는 소프트웨어 쪽의 요구를 따른 것이다.

이러한 명령어 집합의 확장은 소프트웨어가 차세대 구조와 상향 호환성을 유지하면서

컴퓨터 구조를 확대할 수 있게 해 준다.

기계어의 해독

때로는 역공학을 통해 기계어로부터 원래의 어셈블리 언어를 추출하는 작업을 해야한다.

1/7 목 : 2시간

기계어 코드의 해독

다음 기계어에 해당하는 어셈블리 명령어는 무엇인가?

00af8020hex

첫 단계는 16진수를 이진수로 바꾸어 op 필드 값을 찾아내는 것이다.

0000 0000 1010 1111 1000 0000 0010 0000

 

비트 31-29 : 000

비트 28-26 : 000

R 형식 명령어

비트 5-3 : 100

비트 2-0 : 000

add

 

op rs rt rd shamt funct

000000 00101 01111 10000 00000 100000

 

add $s0, $a1,$t6

2.10 병렬성과 명령어 : 동기화

동기화

두 개의 프로세서가 메모리를 공유할 때

- P1는 쓰고, P2는 읽을 경우

- P1과 P2가 동기화 하지 않는다면 Data race 발생 : 접근 순서에 따라 결과가 달라짐

하드웨어가 지원되어야 함

- Atomic read/write memory operation

- 읽기와 쓰기 사이에 외부 접근 비허용

하나의 명령어처럼 행동

...패스...