ISA, ABI, 명령어의 구조

Instruction Set

컴퓨터의 명령어 집합 (The repaertoire of instructions of a computer)

ISA : Instruction Set Architecture

하드웨어와 로우레벨 소프트웨어(OS) 사이의 추상화 인터페이스. 모든 정보들은 명령어들을 명령어들을 통해 프로세스에게로 전달 됨. 어떤 레지스터를 사용할지, 어떤 명령어를 사용할지, 어떤 메모리를 사용할지, I/O등등이 모두 명령어를 통해 전달이 됨.

ABI: Application Binary Interface

프로그래머가 사용하는 사용자 영역의 명령어 집합 (The user portion of the instruction set)과 OS 인터페이스를 합친 것.

다시말하면 어떤 프로그램이 어떤 컴퓨터에서 실행이 될지 안될지 판단할때 ABI를 보고 판단한다.

같은 리눅스 운영체제에서 실행되는 프로그램이라도, 프로세서(CPU)가 다르면 instruction set이 다르기에 실행되지않는다. 운영체제가 다르면 OS 인터페이스가 다르니 이역시 실행되지 않는다. 따라서 ABI는 프로그램의 이식성을 확인하는 조건. 어떤 환경에서 돌아가는 프로그램의 ABI와 다른 컴퓨터의 ABI와 같다면 실행이 됨.

MIPS

해당 교재에서 사용하는 프로세서

MIPS의 ISA의 구조가 현재 많이 사용되고 있는 프로세서들의 ISA와 많이 동일하다고 함.

Arithmetic Operations (산술 연산)

덧셈, 뺄셈과 3개의 operands

2개는 소스, 하나는 결과값을 저장

구조

add a, b, c # a gets b + c

a 에 b+c의 값을 저장

모든 산술연산은 이 구조를 따름.

디자인 원칙 1: 단순한 규칙을 선호한다.

규칙은 실행을 단순하게 만들음.

단순함은 저비용 고성능을 가능하게 함.

Register Operands

Arithmetic 명령어는 레지스터 operand들을 사용한다.

MIPS는 32개의 32비트 레지스터를 가지고 있다.

자주 사용하는 데이터를 저장하기위해 사용

0~31까지의 번호가 있음

32비트 데이터를 “word”라고 함.

어셈블러 이름

$t0, $t1…$t9는 임시 값 저장

$s0, $s1…$s7은 저장할 값

디자인 패턴2: 작을수록 빠르다.

바이트 주소

대부분의 프로세서는 바이트를 기본 단위로 사용.

MIPS의 경우 32비트 프로세서. word 단위로 메모리 주솟값을 액세스함.

Big Endian: 데이터의 주소값이 높은 순으로 저장

Little Endian: 데이터의 주소값이 낮은 순으로 저장

Intel, DEC, Dec Alpha, ARM (ARM의 경우 Big, Little 둘 다 지원)

메모리 operand

메인 메모리는 composite data를 저장하는데 사용.

Arrays, structures, dunamic data

Arithmetic Operations을 적용

메모리에서 레지스터로 값을 Load

레지스터에서 메모리로 결과를 Store

이렇게 Load, Store같은 메모리 접근 명령어를 통해 데이터를 액세스하는 아키텍처를 Load/Store Architecture라고 한다. MIPS, RISC 계열 프로세서들은 이 방식을 사용.

예제

A[12] = h + A[8];

A[8]은 Int타입 배열. h는 $s2, A는 $s3. 이걸 MIPS 코드로 컴파일하면

lw  $t0, 32($s3)
add $t0, $s2, $t0
sw  $t0, 48($s3)

lw는 load word, $s3는 A의 시작 주소, 32는 A[8]이므로 Int타입의 크기인 4바이트이고 8번째 떨어진 곳의 데이터를 가지고 와야 하므로 4*8 = 32 이므로, $s3 주소에서 32바이트 떨어진 곳에 있는 데이터를 $t0에 넣으라는 말. 그 아래 sw역시 같은 원리.단 $t0의 값을 48($s3)에 넣는다.

레지스터 VS 메모리

레지스터에 액세스 하는것이 메모리보다 더 빠르다.

메모리 데이터는 load와 store 명령어를 통해야 하므로, 메모리를 사용하는것은 명령어의 수가 더 증가하는 것이므로 시간이 더 오래걸림.

따라서 가능하면 레지스터를 많이 사용하는것이 좋다.

많이 사용 안하는 데이터는 메모리로, 자주 사용하는 데이터는 레지스터에 저장. 이런 최적화가 매우 중요

MIPS의 레지스터

MIPS 는 32비트의 레지스터가 32개 있음

2개의 read 포트와 한개의 write 포트로 구성

1클록에 2개 읽고 1개 쓰는 연산을 할 수 있다는 뜻

Unsigned Binary Integer 표현

MIPS는 32비트 프로세서 이므로 0~2^32-1까지 수를 표현 할 수 있음.

2s-Complement Signed Integers

컴퓨터에서 음수를 표현할 때 2의 보수를 이용하여 표현

Range: -2~n-1부터 2^(n-1)-1까지

2의 보수로 표현할때 최상위 비트는 sign 비트. 1이면 음수, 0이면 양수

양수를 2의 보수를 이용해 음수를 바꾸는 방법은 비트를 반전 시키고 +1을 한다.

예시 : 2 → -2

+2 = 0000 0010

-2 = 1111 1101+1

= 1111 1110

Sign 비트 확장

어떤 수를 비트를 더 사용해서 표현해야 할때가 있음

아무렇게나 비트를 확장하면 원래 수가 변경되니 어떤 방식을 통해 수가 유지 되야 함.

MIPS의 명령어 set

  • addi: 상수 값을 32비트로 확장하여 더함
  • lb, lh: 메모리로부터 1바이트/2바이트 단위로 데이터를 읽었을 때, 레지스터에 값을 넣기 위해 32비트로 확장해야됨
  • beq, bne

확장할떄는 sign비트의 값을 복사하여 넣음.

8비트 → 16비트

예시) +2: 0000 0010 → 0000 0000 0000 0010

-2: 1111 1110 → 1111 1111 1111 1110

명령어의 구조

명령어는 2진수로 되어있음. (기계어라고도 함)

MIPS는 32비트로 되어있음. 명령어를 연산코드와 레지스터 번호로 인코딩하는 방식이 적음. 규칙적이고 단순하므로 고성능.

MIPS R-format 명령어(레지스터) 구조

 

op rs rt rd shamt funct
6 bits 5bits 5bits 5bits 5bits 6bits
  • op: 연산 코드
  • rs: 첫 소스 레지스터 번호
  • rt: 두번째 소스 레지스터 번호
  • rd: 목적지 레지스터 번호 (rs, st를 op로 연산을 한 결과를 rd 레지스터에 저장)
  • shamt: shift 연산 관련
  • funct: op코드 확장. op코드만으로 연산을 다 표현 할 수 없어서 사용하는 확장코드

예시

add $t0, $s1, $s2

MIPS I-format 명령어(Immediate)구조

op rs rt constant or address

6 bits 5bits 5bits 16 bits

Immediate arithmetic 과 load/store 명령어 구조

  • rt: 목적지 레지스터 또는 소스 레지스터 번호
  • Constant: -2^15부터 2^15-1까지
  • Address: rs에 있는 base address에 offset을 더한 값

Immediate arithmetic 과 load/store 명령어는 별개의 명령어지만, 명령어 구조를 공유 할 수 있다.

디자인 원칙 4번째: 다른 포맷들은 디코딩을 복잡하게 만들지만, 32비트 명령어는 균일하게 사용한다. 가능한 포맷의 수를 줄여야 함.

Shift 연산

shamt: 몇 비트만큼 움직일것인지

shift left logical

왼쪽으로 움직이고 0을 채워넣음. ex) 왼쪽으로 1만큼 이동 : 0111(7) → 1110 (14)

i만큼 움직일 시, 원래 있던 수에 2^i 만큼 곱한 값이 됨.

Shift right logical

오른쪽으로 움직이고 0을 채워넣음. ex) 오른으로 1만큼 이동 : 0111(7) → 0011 (3)

i만큼 움직일 시, 원래 있던 수에 2^i 만큼 나눈 값이 됨. (unsigned만 적용)

Instruction Set

컴퓨터의 명령어 집합 (The repaertoire of instructions of a computer)

ISA : Instruction Set Architecture

하드웨어와 로우레벨 소프트웨어(OS) 사이의 추상화 인터페이스. 모든 정보들은 명령어들을 명령어들을 통해 프로세스에게로 전달 됨. 어떤 레지스터를 사용할지, 어떤 명령어를 사용할지, 어떤 메모리를 사용할지, I/O등등이 모두 명령어를 통해 전달이 됨.

ABI: Application Binary Interface

프로그래머가 사용하는 사용자 영역의 명령어 집합 (The user portion of the instruction set)과 OS 인터페이스를 합친 것.

다시말하면 어떤 프로그램이 어떤 컴퓨터에서 실행이 될지 안될지 판단할때 ABI를 보고 판단한다.

같은 리눅스 운영체제에서 실행되는 프로그램이라도, 프로세서(CPU)가 다르면 instruction set이 다르기에 실행되지않는다. 운영체제가 다르면 OS 인터페이스가 다르니 이역시 실행되지 않는다. 따라서 ABI는 프로그램의 이식성을 확인하는 조건. 어떤 환경에서 돌아가는 프로그램의 ABI와 다른 컴퓨터의 ABI와 같다면 실행이 됨.

MIPS

해당 교재에서 사용하는 프로세서

MIPS의 ISA의 구조가 현재 많이 사용되고 있는 프로세서들의 ISA와 많이 동일하다고 함.

Arithmetic Operations (산술 연산)

덧셈, 뺄셈과 3개의 operands

2개는 소스, 하나는 결과값을 저장

구조

add a, b, c # a gets b + c

a 에 b+c의 값을 저장

모든 산술연산은 이 구조를 따름.

디자인 원칙 1: 단순한 규칙을 선호한다.

규칙은 실행을 단순하게 만들음.

단순함은 저비용 고성능을 가능하게 함.

Register Operands

Arithmetic 명령어는 레지스터 operand들을 사용한다.

MIPS는 32개의 32비트 레지스터를 가지고 있다.

자주 사용하는 데이터를 저장하기위해 사용

0~31까지의 번호가 있음

32비트 데이터를 “word”라고 함.

어셈블러 이름

$t0, $t1…$t9는 임시 값 저장

$s0, $s1…$s7은 저장할 값

디자인 패턴2: 작을수록 빠르다.

바이트 주소

대부분의 프로세서는 바이트를 기본 단위로 사용.

MIPS의 경우 32비트 프로세서. word 단위로 메모리 주솟값을 액세스함.

Big Endian: 데이터의 주소값이 높은 순으로 저장

Little Endian: 데이터의 주소값이 낮은 순으로 저장

Intel, DEC, Dec Alpha, ARM (ARM의 경우 Big, Little 둘 다 지원)

메모리 operand

메인 메모리는 composite data를 저장하는데 사용.

Arrays, structures, dunamic data

Arithmetic Operations을 적용

메모리에서 레지스터로 값을 Load

레지스터에서 메모리로 결과를 Store

이렇게 Load, Store같은 메모리 접근 명령어를 통해 데이터를 액세스하는 아키텍처를 Load/Store Architecture라고 한다. MIPS, RISC 계열 프로세서들은 이 방식을 사용.

예제

A[12] = h + A[8];

A[8]은 Int타입 배열. h는 $s2, A는 $s3. 이걸 MIPS 코드로 컴파일하면

lw  $t0, 32($s3)
add $t0, $s2, $t0
sw  $t0, 48($s3)

lw는 load word, $s3는 A의 시작 주소, 32는 A[8]이므로 Int타입의 크기인 4바이트이고 8번째 떨어진 곳의 데이터를 가지고 와야 하므로 4*8 = 32 이므로, $s3 주소에서 32바이트 떨어진 곳에 있는 데이터를 $t0에 넣으라는 말. 그 아래 sw역시 같은 원리.단 $t0의 값을 48($s3)에 넣는다.

레지스터 VS 메모리

레지스터에 액세스 하는것이 메모리보다 더 빠르다.

메모리 데이터는 load와 store 명령어를 통해야 하므로, 메모리를 사용하는것은 명령어의 수가 더 증가하는 것이므로 시간이 더 오래걸림.

따라서 가능하면 레지스터를 많이 사용하는것이 좋다.

많이 사용 안하는 데이터는 메모리로, 자주 사용하는 데이터는 레지스터에 저장. 이런 최적화가 매우 중요

MIPS의 레지스터

MIPS 는 32비트의 레지스터가 32개 있음

2개의 read 포트와 한개의 write 포트로 구성

1클록에 2개 읽고 1개 쓰는 연산을 할 수 있다는 뜻

Unsigned Binary Integer 표현

MIPS는 32비트 프로세서 이므로 0~2^32-1까지 수를 표현 할 수 있음.

2s-Complement Signed Integers

컴퓨터에서 음수를 표현할 때 2의 보수를 이용하여 표현

Range: -2~n-1부터 2^(n-1)-1까지

2의 보수로 표현할때 최상위 비트는 sign 비트. 1이면 음수, 0이면 양수

양수를 2의 보수를 이용해 음수를 바꾸는 방법은 비트를 반전 시키고 +1을 한다.

예시 : 2 → -2

+2 = 0000 0010

-2 = 1111 1101+1

= 1111 1110

Sign 비트 확장

어떤 수를 비트를 더 사용해서 표현해야 할때가 있음

아무렇게나 비트를 확장하면 원래 수가 변경되니 어떤 방식을 통해 수가 유지 되야 함.

MIPS의 명령어 set

  • addi: 상수 값을 32비트로 확장하여 더함
  • lb, lh: 메모리로부터 1바이트/2바이트 단위로 데이터를 읽었을 때, 레지스터에 값을 넣기 위해 32비트로 확장해야됨
  • beq, bne

확장할떄는 sign비트의 값을 복사하여 넣음.

8비트 → 16비트

예시) +2: 0000 0010 → 0000 0000 0000 0010

-2: 1111 1110 → 1111 1111 1111 1110

명령어의 구조

명령어는 2진수로 되어있음. (기계어라고도 함)

MIPS는 32비트로 되어있음. 명령어를 연산코드와 레지스터 번호로 인코딩하는 방식이 적음. 규칙적이고 단순하므로 고성능.

MIPS R-format 명령어(레지스터) 구조

op rs rt rd shamt funct

6 bits 5bits 5bits 5bits 5bits 6bits
  • op: 연산 코드
  • rs: 첫 소스 레지스터 번호
  • rt: 두번째 소스 레지스터 번호
  • rd: 목적지 레지스터 번호 (rs, st를 op로 연산을 한 결과를 rd 레지스터에 저장)
  • shamt: shift 연산 관련
  • funct: op코드 확장. op코드만으로 연산을 다 표현 할 수 없어서 사용하는 확장코드

예시

add $t0, $s1, $s2

MIPS I-format 명령어(Immediate)구조

op rs rt constant or address

6 bits 5bits 5bits 16 bits

Immediate arithmetic 과 load/store 명령어 구조

  • rt: 목적지 레지스터 또는 소스 레지스터 번호
  • Constant: -2^15부터 2^15-1까지
  • Address: rs에 있는 base address에 offset을 더한 값

Immediate arithmetic 과 load/store 명령어는 별개의 명령어지만, 명령어 구조를 공유 할 수 있다.

디자인 원칙 4번째: 다른 포맷들은 디코딩을 복잡하게 만들지만, 32비트 명령어는 균일하게 사용한다. 가능한 포맷의 수를 줄여야 함.

Shift 연산

shamt: 몇 비트만큼 움직일것인지

shift left logical

왼쪽으로 움직이고 0을 채워넣음. ex) 왼쪽으로 1만큼 이동 : 0111(7) → 1110 (14)

i만큼 움직일 시, 원래 있던 수에 2^i 만큼 곱한 값이 됨.

Shift right logical

오른쪽으로 움직이고 0을 채워넣음. ex) 오른으로 1만큼 이동 : 0111(7) → 0011 (3)

i만큼 움직일 시, 원래 있던 수에 2^i 만큼 나눈 값이 됨. (unsigned만 적용)

'컴퓨터 구조' 카테고리의 다른 글

명령어 addressing  (0) 2023.06.30
함수 호출 작동 방식  (0) 2023.06.28
스택 포인터  (0) 2023.06.27
MIPS프로세서 명령어의 구조  (0) 2023.06.11
CPU와 성능  (0) 2023.06.07