컴퓨터구조 정리-3

beenyyy·2023년 5월 17일

<논리 연산 명령어>

[1. shift 연산자] sll, srl

shamt: 이동할 위치 수
rs가 쓰이지 않고, rt에 소스 표현
4자리를 left 이동하면, 를 곱한 것과 같다.
function=0이면 left, 2이면 right

[2. and 연산자] and

일부 비트들을 감추는 mask하는 데 유용

[3. or 연산자] or

word에 비트를 포함하는 데 유용

[4. not 연산자] nor

not이 없어서 nor로 묘사한다.
nor $t0, $t1, $zero

<조건부 연산>

⋅ 조건이 참인 경우 지정된 명령어로 분기
beq rs, rt, L1 #rs==rt이면 L1로 (I-Format)
bne rs, rt, L1 #rs!=rt이면 L1로 (I-Format)
j L1 #L1로 무조건 점프 (J-Format)

<If문 컴파일>

if 조건에서 같지 않으면 else로 점프할 때, 어셈블러가 주소를 계산한다.

<Loop문 컴파일>

<-Basic Blocks->

분기(branch) 명령을 포함하지 않는다. (맨 끝에는 있을 수 있다)
분기 목적이나 분기 레이블도 없는 (맨 앞에 있는 것은 허용된다) 시퀀스이다.
⋅ 컴파일러는 최적화를 위한 기본블록을 식별한다.
⋅ 고급 프로세서는 기본블록 실행을 가속화할 수 있다.
(최적화의 대상)

< slt, slti 조건부 연산 >

⋅ 조건이 참인 경우 결과를 1로 설정 (아닌 경우 0)
slt rd, rs, rt #rs<rt인 경우 rd=1
slti rt, rs, 상수 #rs<상수인 경우 rt=1

->blt로 안쓰고 결합해서 사용하는 이유는 클럭 속도가 느려지거나 별도의 클럭 사이클이 더 필요하게 되기 때문에 빠른 명령어 2개를 사용하는 것이 더 유리하다.

<프로시저(Procedure) 실행>

  1. 프로시저가 접근할 수 있는 곳에 인수를 넣고 프로시저로 제어를 넘긴다.
  2. 프로시저가 필요로 하는 메모리 자원을 획득한다.
  3. 필요한 작업을 수행한다.
  4. 호출한 프로그램이 접근할 수 있는 장소에 결과값을 넣는다. / 프로시저는 원래 위치로 제어를 돌려준다.

<프로시저 실행 할당 레지스터>

⋅ $a0 ~ $a3: 인수 레지스터(4 - 7)
⋅ $v0, $v1: 결과값 레지스터(2, 3)
⋅ $gp: global pointer for 정적 데이터(28)
⋅ $sp: 스택 포인터(29)
⋅ $fp: frame pointer(30) 스택 시작 주소
⋅ $ra: return address(31) 돌아가야 할 주소

<프로시저 호출 지침>- jal: J-Format, jr: R-Format

⋅ jal ProcedureAddress #점프하면서 다음 명령어의 주소를 $ra 레지스터에 저장 (jump and link)
⋅ jr $ra #$ra에 저장된 주소로 점프 (PC+4)

<Leaf Procedure 예시> - 다른 프로시저 호출 X


<중첩된 프로시저>

호출자는 스택에 return 주소 ($ra)를 다른 함수 호출 전 꼭 저장해야 한다. - 호출 후 스택에서 복원

<$fp의 역할>

$sp가 가변적이므로 스택의 시작점인 $fp를 사용
사용하는 스택을 frame이라고 함.
$sp로 상대적인 위치로 표현하면 나중에 해석하기가 힘듦. 코드 디버깅하는 사람들이 볼 때도 어려움. 헷갈림. 이런 문제를 없애기 위해 사용.

<$gp의 역할>

전역변수 접근 주소.
I-Type의 주소는 16bits
16bits으로 표현할 수 있는 주소가 적음
⋅ 16bit만으로는 전역변수 영역을 포인팅하기 어려워서 gp레지스터를 사용.
⋅ 전역변수에 대한 접근 단순화.
⋅ 상대주소로 표현하기 위해서.
⋅ gp는 전역변수 영역의 중간을 가리킴.

<-Char Data-> -문자 데이터

⋅ 바이트 인코딩된 char 집합

  • ASCII: 128문자(7-bit) #1byte
  • Latin-1: 256문자(8-bit) #1byte

⋅ 유니코드: 32비트 char 집합

  • 대부분의 세계 알파벳과 기호
  • UTF-8, UTF-16: 가변 길이 인코딩 #1byte~4byte
    (가변적으로 사용)

<바이트 / 하프워드 연산>

⋅ lb rt, offset(rs) lh rt, offset(rs) #short
⋅ lbu rt, offset(rs) lhu rt, offset(rs) #char
⋅ sb rt, offset(rs) sh rt, offset(rs) #byte/halfword

#lbu -> char, unsigned short
c언어는 문자열을 표시할 때 끝에 값이 0인 바이트 하나를 둠.
(“Cal” = 67, 97, 108, 0) ASKII의 null ‘\0’

<32비트 상수>

대부분의 상수는 작음. (16비트면 충분)
가끔 32비트 상수.
lui rt, constant #상수값을 레지스터 상위 16bits에.
ori #나머지 채워넣음

<Branch 주소지정> - PC의 상대주소 지정

⋅ 조건부 분기
다음 명령어 주소 PC+4
I-Format
대상 주소 = PC+4+offset4 #대상 주소로 점프
⋅ jump(j and jal) :26bits 주소가 실제로는 28bits 표현하는 것처럼 보임(4의 배수)

<먼 곳으로 분기>-16비트로 표현 불가능한 주소로

명령어 2개로.
jump는 J-Format이므로 주소가 더 넓음.

<5가지 주소 지정 방식>

  1. 즉각 주소 : addi (피연산자가 상수)
  2. R-format : add, sub (피연산자가 레지스터)
  3. base-format : I-Format 중 lw/sw, lh, lb
  4. PC-주소지정: I-Format 중 조건부 분기
  5. (슈도 주소지정)J-Format : jal, j
profile
📚beenyyy의 개발공부

0개의 댓글