다음 부분은 데이터의 주소 지정 방법에 대해 소개하고있다.

Operand in instruction itself
명령어 자체에 피연산자의 값이 들어있다는것이다.
addi $s1, $s2, 100 을생각하면 된다.
Operandd in register
이건 레지스터에 값이 들어있는경우다.
Operand in Memory
메모리에 값이 들어있는경우
Address부분에는 메모리의 시작주소가 들어있고
register에는 오프셋이 저장되어있어, 두 개를 더한 부분을 주소로 지정한다,
예시로 lw $s1, 100($s2) ($s2 + 100주소에 있는 값을 $s1에 넣으라는 뜻)

Instruction in memory
PC-relative addressing(branch)
프로그램 카운터의 값과 더해서 주소 산출
Pseudo-direct addressing(jump)
J - format은 op를 제외한 나머지 26비트만 작성이 가능해서 주소를 표현하려면 32비트가 필요하니 6비트를
4바이트 단위로 접근 시키는 제약을 걸어 00비트를 확보(이렇게 되면 4바이트 단위의 첫번째 비트지점으로만 점프가능) + 현재 프로그램 카운터(PC) 값을 기준으로 점프할 주소를 계산 할것이므로 4비트를 가져와서 32비트를 만든다.
ㄴ 이거에 대해서 좀 자세하게 알고싶은점은 PC의 상위 4비트가 메모리에서 어떤 의미를 가지길래 Jump에 붙이면 메모리 주소를 지정가능한지다.
이제 위의 주소 지정방식을 알았으니 이제 우리가 쓰는 high level언어의 표현과 비교해보자.

덧셈은 별거없다 임시 레지스터 $t0에 $s1 + $s2를 해줘서 넣어주고
밑에줄도 $t1에 $s3 + $s4를 해준후 $t0 , $t1을 빼주면된다.

배열의 경우 각 원소가 4바이트단위로 저장되므로 4i를 계산해줘서 배열 시작점 기준 위치를 계산해준다.
add $t1, $s4,$s4
add $t1,$t1,$t1
-> 4i계산
아래는 더하기

switch문 연산을 변환해보자면
먼저
1번째 : slt $t3, $s5, $zero -> slt는 set less than으로 $s5가 0보다 작으면 $t3에 1, 그렇지않으면 0을 집어넣는다.
2번째 : bne $t3,$zero,Exit -> $t3의 값이 1이면 즉, 0보다 작으면 Exit시킨다.
3번째 : slt $t3, $s5,$t2 이것도 $t2보다 작으면 1, 그렇지않으면 0을 집어넣는데 $t2는 분기의 크기이다. 여기에는 4개의 분기가 존재,
들어온값이 분기의 크기보다 크면 안된다는 처리를 해준다.
4번째 beq $t3,$zero,Exit
정리하자면 위의 명령들은 k가 0~3사이의 값을 가지는지 확인하는 절차라는것이다.
이제 k의 크기를 알았으니 마지막 add인 add $t1 , $t1,$t4로 가야하는 분기의 주소를 계산한다. $t4는 분기의 base address(시작주소)이다.

MIPS에서는 Pseudo instruction이라고 구현되어있진 않으나 왼쪽처럼 입력하면 오른쪽으로 바꿔서 실행해주는 명령어가 존재한다.
여기서 매우 중요한점은 Pseudo instruction은 at레지스터외에 다른 레지스터의 값을 변경해서는 안된다.
수업중 질문중에 "그렇다면 at레지스터외의 레지스터를 +1했다가 -1하는 작업을 수행하면 결과적으로 변경하지 않게되는건데 이것은 가능한가?"라는 질문이있었다.
이에 대해 교수님의 대답은 "대부분은 가능하겠지만 overflow의 가능성을 배제할순 없기때문에 그것또한 해선 안된다"라고 말씀하신다.

0 : 상수 0이 자주쓰이니 지정해놓은 레지스터
1 : Pseudo instruction을 real MIPS instruction으로 바꾸는 역할을 하는 레지스터라 프로그래머가 건드려선 안된다.
2~3 : return 을 위한 레지스터로 반환값은 1개인데 2개가있는 이유는 64비트인 경우에도 동작하기 위해서다
4~7 : arguments를 위한 레지스터, 그럼 넘겨주고싶은 argument가 5개이상이라면? -> stack을 통해 처리한다고 함
(common한 경우는 5개 이하라 이렇게 처리하고 rare한 경우에도 대비한 모습)
8~15: 임시로 값을 저장할때 사용하는 레지스터
16~23:variable값을 저장할 때 사용하는 레지스터
24~25:임시로 값을 저장할때 사용하는 레지스터-> 8~15도 임시인데 이럴꺼면 연속되게 두면되지 않나? -> 아마 과거에는 다른 용도로 사용했다가 더이상 사용되지 않아서 임시로 전환된것으로 보인다고 교수님이 설명하심
이러한 레지스터들을 General purpose register라고 부르는데, 번역하면 범용 레지스터이다. 하지만 각 레지스터에 대한 convention을 해놓은걸 보면, 뭔가 이름과는 동떨어진 느낌이 들것이다. 이것은 만약 프로그래머가 자기만의 기준을 둔채로 레지스터를 사용한다면,
서로다른 레지스터 사용 방식이 존재할것이다.
그런식으로 여러 컴파일러가 존재한다고 치자, 그리고 프로그램을 실행 했을때 어떠한 경우에는 프로그램을 구성하는 모듈들을 서로 다른 컴파일러로 컴파일 하는 경우가 존재한다.이때 interoperability를 보장해주기 위해서 이런 convention을 만들어 둔것이다.
'컴퓨터 구조론' 카테고리의 다른 글
| [컴퓨터 구조론]7.Pipelining Bascis (0) | 2025.01.06 |
|---|---|
| [컴퓨터 구조론]4. Calling Convention (0) | 2025.01.02 |
| [컴퓨터 구조론]3. MIPS -1 (0) | 2024.12.29 |
| [컴퓨터 구조론]2-1 summary (0) | 2024.11.22 |
| [컴퓨터 구조론]2.Virtualization (0) | 2024.11.14 |