⋅ 명령어의 집합
⋅ 컴퓨터마다 다르다.
MIPS 명령어 세트: 많은 최신 ISA의 전형적인 세트
⋅ 피연산자 3개의 경우: 1개의 대상, 2개의 소스
⋅ 어셈블리어 언어 변환은 컴파일러에 의해 이루어짐.
디자인 원칙1: 간단한 것을 위해선 규칙적인 것이 좋음
add, sub
MIPS 구조: 레지스터의 크기는 32비트=“word”
32개의 32비트 레지스터. / 자주 액세스하는 데이터
디자인 원칙2: 작은 것이 더 빠르다.
나머지 데이터들은 메인 메모리에.
어셈블러 이름
⋅ 임시 값: $t0 ~ $t9
⋅ 저장된 변수: $s0 ~ $s7
복합 데이터에 사용되는 메인 메모리
(배역, 구조체, 동적 데이터)
⋅ lw $t0, 8($s1) #load value (메모리->레지스터)
⋅ sw $t0, 8($s1) #store result (레지스터->메모리)
MIPS: Big Endian이다.(최소 주소에 최상위 바이트)
(Little Endian은 최소 주소에 최하위 바이트)
word의 시작 주소는 항상 4의 배수
//A[12]=h+A[8]
lw $t0, 32($s3)
add $t0, $s2, $t0
sw $t0, 48($s3)
⋅ 레지스터는 메모리보다 접근이 빠르다.
⋅ 컴파일러는 사용되는 변수에 레지스터 사용
⋅ 원래는 상수를 메모리에서 읽어와야 함 (프로그램이 적재될 때 메모리에 상수가 넣어진다.)
⋅ 상수 연산자 – 적재 명령을 사용하지 않는 방법
⋅ 빼기가 없음. 더하기 연산으로 구현한다.
addi $s3, $s3, 4 //$s3=$s3+4
디자인 원칙3: 자주 생기는 일을 빠르게 하라.
⋅ MIPS 레지스터 0($zero)는 따로 존재.
⋅ 디자인 원칙3의 좋은 예
add $t2, $s1, $zero로 복사(move) 연산
⋅ 범위: 0 ~ 2^n -1
⋅ 32비트 사용: 0 ~ 2^32 -1
⋅ 부호 비트
-음수의 경우 1 / 음수가 아니면 0
⋅ 더 많은 비트 이용
MIPS에서
⋅ addi : 즉각적인 확장 (최대 16bits)
⋅ lb, lh : 로드된 byte/halfword 확장
⋅ beq, bne : 변위를 확장
부호 없는 값은 0으로 확장, 음수는 1로 확장
명령어는 바이너리로 인코딩 된다. - 기계 코드
⋅ MIPS 명령어
-32비트 명령어로 인코딩
-규칙적
⋅ 레지스터 넘버 #외울 필요 없음
-$t0 ~ $t7 : 레지스터로 8 ~ 15
-$t8 ~ $t9 : 레지스터로 24 ~ 25
-$s0 ~ $s7 : 레지스터로 16 ~ 23
op: 연산 코드
rs: 첫 번째 소스 레지스터 번호
rt: 두 번째 소스 레지스터 번호
rd: 대상 레지스터 번호
shamt: 이동량(현재는 00000)-shift 연산 아닌 경우
funct: 함수 코드(opcode 확장)
⋅ 즉각적인 산술 및 load/store 명령
rt: 대상 또는 소스 레지스터 번호
rs: 소스 레지스터 번호(저장 데이터 주소)-> 소스
디자인 원칙4: 좋은 설계에는 적당한 절충이 필요하다.