컴퓨터구조론 (숭실대 강의 보충)

4강 중간부터 복습

Jump Instructions

jr(jump register) instruction - jump table의 인덱스만 계산해서 해당 루틴으로 점프할 수 있다.

jr $t0 ## jump to the address specified (branch target)

jal(jump - and link) instruction #$ra <- pc+4 ##pc <- procedureAddress

jr $ra #return form procedure

(function call을 하면 나중에 되돌아 와야 하기 때문에, 돌아오려면 리턴 address를 저장해야한다. 그게 $jal)

※ return address -> $31번에 저장. 역사적으로 3가지 방법이 있었음 (특정 레지스터에 저장, procedure head?에 저장, 첫 줄을 비워놓고 프로그램을 뒤에서부터 시작, stack에 저장(recursive한 call을 하려면)) 복잡한거 하드웨어가 하면 느려지니까 소프트웨어가 하자 rested call을 처리, recursive도 해결.

2018-04-02 9 59 45

소프트웨어 적인 호환을 위해서 이렇게 하자는 거지 하드웨어적으로는 구분 안된다.

32-Bit Immediate Operands

MIPS에서 register 크기 - 32bit MIPS에서 메모리주소 - 32bit MIPS에서 명령어 - MIPS에서

jump 하려면 주소가 32비트인데, 32비트 자리가 없을 때, 32비트 중에서 6비트는 op cord 에 써야하니까. 더군다나 branch equal $s2 ,$s4 등 이런거 넣고 할려면 register 주소가 더 없지.

$s3 <- FF33 A098을 넣고 싶다! 저런 명령어를 만들려고 하는데, 저 데이터만 해도 32비트.

그래서 MIPS에서는 2단계로 나눔. 저렇게 한쪽을 밀어 16비트씩

load upper immedaite image

뒤에 채우는 건 OR Immediate

add immediate는 더하기 할 때, 음수로 생각할 수도 있어. 그래서 문제발생

JUMP (unconditional branch)

문제 명령어가 32비트인데 주소가 32비트다. 명령어 32비트를 주소에 집어 넣을 수 없다. 32비트 중 최소 6코드는 op코드로 사용해야 하니까. 남은게 26비트 jump 명령어에서는 word addressing을 사용한다. jump 주소는 항상 4의 배수 번지일 거다. 2진수로 보면 끝의 두비트는 항상 00이다. 00따라서 생략하고 표현한다. 32비트에서 30비트로 줄인거다. 4비트를 더 줄여야하는데 위의 네비트를 생략한다. 점프라 멀리가지 않기 때문에, 현재 이 명령어의 주소의 상위 4비트의 주소가 같을 것이라는 가정.

점프한다 -> 프로그램 카운터에 주소를 집어넣는 일. 이런 방식 pseudo-Direct Addressing Mode

나중에 보면 알겠지만, 이게 사실은 program counter. 이게 점프 명령어의 주소가 아니라. 점프 명령어의 주소 + 4(다음 명령어의 주소)이다.

conditinonal branch 명령어.

레지스터가 2개 나오고, 주소가 나오고 점프는 그래도 26비트 공간이 있었는데.

점프할 곳이 여기서부터 크게 멀지 않다. 이 명령어를 기준으로 해서 점프할 곳의 위치를 상대적인 주소로 나타내자 -> relative addressing

이 때도 이 브랜치 명령어가 있는 곳의 주소도 4의 배수, 점프할 곳의 주소도 4의 배수. 그 차이도 4의 배수. 점프에서와 마찬가지로 끝의 2비트는 00일 테니까 생략 가능.

실제 실행중에 보면, 프로그램 카운터가 이 주소를 가지고 있지 않고, 이 주소의 다음 주소를 가지고 있다. 다음 명령어를 가지고 오기 위해서 준비를 하므로. 그래서 기준이 다음 명령어다. 이 명령어의 다음 명령어. (ex) PC+4) 예를 들어서 16비트 주소가 있다고 하면, *4해서 뒤의 00을 복원. +4 다음 명령어 주소를 더해서 점프 주소를 만들어서 그게 다시 pc 카운터로 들어간다.

bne, beq는 다음 주소가 얼마를 기준으로 나타낸다.

다음 명령어부터 시작해서, 명령어 갯수로 따져가면 쉽다.

pc-relative addressingmode

conditional 주소에서 사용 상대주소 값 들어갈 것 찾기 예제 image

32비트로 나타냈을 때, 위의 4비트는 같겠지. 별로 크지 않은 숫자니까. 위의 4비트 생략해도 문제가 없다. 목적지 주소를 4로 나눈 20000만 집어넣으면 된다.

예제

위의 4비트 생략, 앞의 2비트 항상 00이니까 생략 나머지 26비트 그대로 들어가면 된다.

다음 명령어 주소 기준 (목적지 기준) (상대주소는 그런 식으로 계산한다)

무조건 점프해서 사용하는 수도 다이렉트 컨디셔널 브랜치에서 사용하는 피시 렐러티브

로드워드 스토어워드에서 하는 베이스어드레싱 lw $t0 30($t1)

레지스터하고, 콘스탄트를 더하는 건 마찬가지지만 로드워드 스토어워드에서는 사용할 레지스터 번호 지정.

그렇지 않으면 디폴트로 프로그램 카운터를 사용 MIPS에서는 3가지가 사용된다.

예제 Branching Far Away beq $s0, $s1, L1 # but L1 is too far

lwi $t0, F300 7A88 jr $t0

MIPS Addressing Modes

image

register indirect addressing (레지스터에 가서 다시 주소를 가져온다)

Assembler Pseudo-instructions 어셈블러가 없지만 번역해주는 것

decoding Machine language

36분부터 3장 시작


참고자료

컴퓨터 구조 및 설계 지음 DAVID A.PATTERSON, JOHN L>HENNESSY

숭실대학교 컴퓨터구조론 강의

0%