Computer Architecture 13강 ~ 15강 정리
18 Jan 202013강 논리 명령어
정의
- AND, NOR, OR 등의 논리 연산을 하기 위한 명령어
- 초기의 컴퓨터는 워드 전체에 대한 처리에만 관심을 가졌으나 비트 일부나 비트 개개에 대한 연산이 필요함을 깨달음
- 비트들을 워드로 묶는 packing, 워드를 비트 단위로 나누는 unpacing 작업 수행
종류
연산자 | 고급언어 표현 | 수행동작 |
---|---|---|
sll | « | 비트 왼쪽 이동 |
srl | >> | 비트 오른쪽 이동 |
and, andi | & | 비트 간 and 연산 |
or, ori | | | 비트 간 or 연산 |
nor | ~ | not, or 연산 |
시프트 연산자
- 비트를 오른쪽으로 4칸 이동
- 만약 지정된 비트수를 넘겼을 경우에는 최하위 비트는 버려짐
srl $t2, $s0, 4
0001 0000 → 0000 0001
1000 1000 → 0000 1000
논리 연산자
AND | T | F |
---|---|---|
T | 1 | 0 |
F | 0 | 0 |
OR | T | F |
---|---|---|
T | 1 | 1 |
F | 1 | 0 |
XOR | T | F |
---|---|---|
T | 0 | 1 |
F | 1 | 0 |
NOR | T | F |
---|---|---|
T | 0 | 0 |
F | 0 | 1 |
1010 OR 0101 = 1111
1010 AND 1001 = 1000
1010 NOR 0010 = 0101
1001 XOR 0110 = 1111
14장 판단을 위한 명령어
조건부 분기
- 컴퓨터와 단순 계산기의 차이점은 판단 기능이 있다는 점
- 입력데이터나 연산 결과에 따라 다른 명령어 실행 가능
- 고급언어 예: if, go to, switch
- MIPS에서는 if-then-else를 이용하여 간단하게 swtich문을 구현 가능
조건부 분기 명령어
- beq(branch if equal): 비교 레지스터 값이 같을 경우 L1으로 분기
- bne(branch if not equal): 비교 레지스터 값이 다를 경우 L1으로 분기
- 조건이 많을수록 bne가 명령이 적어 더 효율적
beq register1, register2, L1
bne register1, register2, L2
반복문(loop)
- 계산의 반복적인 수행을 위하여 명령의 순환이 필요
- 고급언어 예: for, while
대소 비교
- equl, not equal외에 변수 간에 대소 비교 존재
- slt, slti 명령어 이용
- 첫번째 근원지 레지스터와 두번째 근원지 레지스터를 비교하여 첫번째가 작을 경우 목적지 레지스터를 1로 , 아닐 경우 0으로 설정
- 부호없는 수(unsigend number)끼리의 비교는 sltu, sltiu 사용
if (rs<rt) rd=1;
else if(rs>rt) rd=0;
15강 프로시저
프로시저
- 제공되는 인수에 따라 특정 작업을 수행하는 서브 루틴
- 프로시저의 인수는 프로시저에 값을 보내고 결과를 받음
- 프로시저나 함수는 재사용 할 수 있도록 프로그램을 구조화
프로시저 관련 레지스터
- $a0 - $a3: 전달할 인수를 갖는 인수 레지스터
- $v0 - $v1: 반환되는 값을 갖는 값 레지스터
- $ra: 복귀주소(return address)를 가지는 레지스터
명령어
-
jal(jump-and-link)
-
복귀주소를 $ra에 저장하고 프로시저가 할당된 주소로 점프
-
$ra의 주소로 복귀할 때는 jr(jump register) 사용
jal procedure address, jr $ra
실행단계
- 프로시저가 접근할 수 있는 곳에 인수를 넣는다.
- 프로시저로 제어를 넘긴다.
- 프로시저가 필요로 하는 메모리 자원을 획득한다.
- 필요한 작업을 수행한다.
- 호출한 프로그램이 접근할 수 있는 레지스터에 결과값을 넘긴다.
- 호추한 프로그램으로 제어권을 반환한다.
스택
- 레지스터가 부족할 때 사용
- push, pop으로 데이터를 넣고 꺼냄
- 스택포인터(sp)의 값은 스택에서 데이터가 들어가고 나올 때마다 변경
- 스택은 높은 주소에서 낮은 주소로 생성되므로 스택을 할당할 때에는 sp에서 사용할만큼의 값을 감소시켜야 함
스택 프레임
- 각 프로시저는 독립된 스택프레임을 갖고 있음
- 프로시저의 저장된 레지스터와 지역변수를 가지고 있는 스택 영역
- 프레임 포인터(fp)가 프로시저의 첫번째 워드를 가리키도록 되어 있음
- fp는 베이스 레지스터의 역할을 하고 sp는 값이 변경되며 스택의 최하단을 가리킴
- 재귀호출 등에서 ra값이 변경될 여지가 있으므로 복귀주소 저장 수단으로 사용
segment
- 메모리는 각각 다른 값을 저장하는 블록으로 나누어짐
- Stack: 지역변수 선언, 정적 할당, 프로그램 종료시 자동 소멸
- Heap: 동적으로 할당된 메모리 영역, 개발자가 해제(free)해야 함
- Segmentation fault: 참조할 수 없는 메모리 영역을 참조할 때 발생하는 에러