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
- 읽기와 쓰기 사이에 외부 접근 비허용
하나의 명령어처럼 행동
...패스...