2.4 명령어세트 (instruction set) 명령어세트 CPU 가지원하는기계어명령어들의집합 명령어연산의종류 데이터전송 : 레지스터 / 메모리간에데이터이동 산술연산 : 덧셈, 뺄셈, 곱셈및나눗셈 논리연산 : 비트들간의 AND, OR, NOT 및 XOR 연산 입출력 (I/O) : CPU( 레지스터 ) 와외부장치들간의데이터이동 프로그램제어 : 분기, 서브루틴호출 (subroutine call) 명령어실행순서를변경하는연산들 무조건분기, 조건부분기 오퍼랜드의수에따른명령어분류 1-주소명령어 (one-address instruction) : [ 예 ] ADD X ; AC AC + M[X] AC 레지스터가묵시적오퍼랜드로사용됨 2- 주소명령어 (two-address instruction) : [ 예 ] ADD R1, R2 ; R1 R1 + R2 MOV R1, R2 ; R1 R2 ADD R1, X ; R1 R1 + M[X] 한오퍼랜드는 source와 destination으로동시에함 오퍼랜드는레지스터또는메모리이며, 동시에메모리인것을허용하지않는 CPU들도많이있음 3- 주소명령어 (three-address instruction) : [ 예 ] ADD R1, R2, R3 ; R1 R2 + R3 대부분의 3주소명령어의오퍼랜드는레지스터만가능함 37 38 범용레지스터 여러명령어형식 Accumulator 방식의 CPU 모든연산결과는 AC(Accumulator) 에저장함 ( 예 ) 앞에서소개한간단한 CPU, 1 주소명령어 범용레지스터를사용하는 CPU 대개의 CPU 는연산결과를저장할수있는여러개의범용레지스터를제공함 ( 예 ) ARM : R0-R15 80386 : EAX, EBX, ECX, EDX, ESI, EDI, ESP, EBP 64-bit x86: EAX, EBX, ECX, EDX, ESI, EDI, ESP, EBP, R8-R15 1-주소명령어 2- 주소명령어 3-주소명령어 명령어형식에서레지스터필드에사용하는레지스터를지정함 명령어의길이는 (1) 고정길이형식 (2) 가변길이형식 39 40
명령어형식 연산코드 (Operation Code) : 수행될연산을지정 연산코드필드길이 : 연산의개수를결정 ( 예 )4 비트 2 4 =16 가지의연산정의가능 연산코드필드가 5 비트로늘어나면, 2 5 = 32 가지연산들 정의가능하지만다른필드의길이가감소됨 오퍼랜드 (Operand) 연산을수행하는데필요한데이터또는데이터의위치를지정 데이터는 CPU 레지스터, 주기억장치, 또는 I/O 장치에위치레지스터번호메모리주소 분기 / 호출명령어에서는분기할명령어주소를포함 오퍼랜드필드의길이 : 오퍼랜드의범위를결정 오퍼랜드의종류에따라범위가달라짐 데이터 : 표현가능한수의크기가결정 메모리주소 :CPU 가직접주소를지정할수있는메모리크기를결정 레지스터번호 : 데이터저장에사용될수있는레지스터의수를결정 41 42 명령어형식이프로그래밍에미치는영향 1-주소명령어를사용한프로그램 [ 예 ] X = (A + B) x (C - D) 프로그래밍에다음과같은니모닉을가진명령어들을사용 ADD : 덧셈 SUB : 뺄셈 MUL : 곱셈 DIV : 나눗셈 MOV : 데이터이동 LOAD : 기억장치로부터레지스터로데이터적재 STOR : 레지스터에서기억장치로데이터저장 프로그램 LOAD A ; AC M[A] ADD B ; AC AC + M[B] STOR T ; M[T] AC T A+B LOAD C ; AC M[C] SUB D ; AC AC - M[D] AC C - D MUL T ; AC AC * M[T] AC (A+B)*(C-D) STOR X ; M[X] AC X AC M[A] : 메모리 A번지의내용 T : 메모리내의임시저장장소의주소 ( 레지스터가 AC 한개밖에없으므로임시저장장소를사용 ) 프로그램의길이 = 7 명령어 43 44
2-주소명령어를사용한프로그램 3-주소명령어를사용한프로그램 프로그램 MOV R1, A ; R1 M[A] ADD R1, B ; R1 R1 + M[B] R1 A+B MOV R2, C ; R2 M[C] SUB R2, D ; R2 R2 - M[D] R2 C-D MUL R1, R2 ; R1 R1* R2 MOV X, R1 ; M[X] R1 프로그램의길이 = 6 명령어 프로그램 ADD R1, A, B ; R1 M[A] + M[B] SUB R2, C, D ; R2 M[C] - M[D] MUL X, R1, R2 ; M[X] R1 R2 프로그램의길이 = 3 단점 명령어의길이가증가한다 ( 오퍼랜드가 3 개 ) 명령어해독과정이복잡해진다 RISC(Reduced Instruction Set Computer) 형식의명령어는레지스터오퍼랜드만사용하는 3 주소명령어를제공 45 46 CISC 와 RISC 명령어집합 RISC 의 3-주소명령어프로그램 CISC complex instruction set computer 많은수의명령어들로구성됨 복잡한동작의고수준연산을수행하는명령어들이포함됨 메모리오퍼랜드에대해서산술 / 논리연산수행허용 마이크로코드 (micro-code) 에의한기계어해독 ( 예 ) Intel 80x86 계열, 680x0 계열 RISC reduced instruction set computer 적은수의짧고간단한명령어들로구성됨 하드웨어에의한기계어처리 레지스터오퍼랜드만사용하는 3- 주소연산지원 load 와 store 명령어를사용하여메모리오퍼랜드를액세스 프로그램의길이가길어짐 ( 명령어를더많이사용 ) ( 예 ) Sparc, PowerPC, ARM, Alpha... 프로그램 LOAD R1, A LOAD R2, B ADD R1, R1, R2 ; R1 M[A] + M[B] LOAD R2, C LOAD R3, D SUB R2, R2, R3 ; R2 M[C] - M[D] MUL R1, R1, R2 STORE X, R1 ; M[X] R1*R2 프로그램길이 = 8 명령어 RISC 는프로그램길이가길어지지만각명령어의실행시간이비슷하여명령어파이프라이닝의효율이좋음 47 48
상태레지스터 (status register) 상태레지스터 CPU 연산의실행결과에대한상태 ( 조건플래그 ) 를저장 조건분기명령어에서사용 : 조건플래그에따라서분기여부결정 플래그 부호 (Sign, Negative) 플래그 : 산술연산결과의부호비트를 저장 영 (Zero) 플래그 : 연산결과값이 0 이면 1로설정 올림수 (Carry) 플래그 : 덧셈이나뺄셈에서올림수 (carry) 나빌림수 (borrow) 가발생한경우에 1로설정 오버플로우 (overflow) V 플래그 : 산술연산과정에서오버플로우가발생한경우에 1로설정 약칭 : C, V, N, Z 또는 CF, OF, SF, ZF 49 조건분기명령어 형식 Jcc addr (cc는조건을명시함 ) 이전명령어의실행결과가 cc로지정되는조건을만족하면 addr 번지로분기하며, 그렇지않으면다음명령어를수행함. 플래그값에따른분기 JS addr JNS addr (Sign) JC addr JNC addr (Carry) JZ addr JNZ addr (Zero) JO addr JNO addr (Overflow) 크기비교에따른분기 - 조건플래그들을참조하여결정 JE addr JNE addr JG addr JGE addr JL addr JLE addr ( 부호있는비교 ) JA addr JAE addr JB addr JBE addr ( 부호없는비교 ) 부호있는비교와부호없는비교를구분하여조건분기명령어제공 50 서브루틴호출을위한명령어 서브루틴이포함된프로그램이수행되는순서 CALL 명령어 : 서브루틴을호출함 동작 : 1) 현재의 PC 내용을스택에저장하고 2) 서브루틴의시작주소로분기 RET 명령어 : 원래실행하던루틴으로복귀 동작 : 1) 스택에저장된복귀주소로분기 CALL RET 스택 (stack) Last In First Out 동작을하는자료구조 nested 호출시에복귀주소가사용되는순서가저장되는순서와반대이므로스택의동작과같음 51 52
프로그램수행과정에서스택의변화 SP(Stack Pointer) : 메모리의스택영역의꼭대기주소를가리킴 push push pop push pop pop 스택에 push 또는 pop할때마다 SP 가이동함 주소지정방식 주소지정방식 (addressing mode) 오퍼랜드의위치를지정하는방식 다양한주소지정방식 (addressing mode) 을사용하는이유 : 제한된수의명령어비트들을이용하여여러가지방법으로오퍼랜드를지정하고, 고급언어에서간편하게기계어명령어를 생성할수있도록하기위함 기호 EA : 유효주소 (Effective Address), 데이터가저장된기억장치의실제주소 A : 명령어내의주소필드내용 M(A) : 기억장치 A 번지의내용 R 필드 : 명령어내의레지스터필드내용 R : R 필드가가리키는레지스터의내용 53 54 주소지정방식의종류 직접주소지정방식 직접주소지정방식 (direct addressing mode) 간접주소지정방식 (indirect addressing mode) 묵시적주소지정방식 (implied addressing mode) 즉치주소지정방식 (immediate addressing mode) 레지스터주소지정방식 (register addressing mode) 레지스터간접주소지정방식 (register-indirect addressing mode) 변위주소지정방식 (displacement addressing mode) 상대주소지정방식 (relative addressing mode) 인덱스주소지정방식 (indexed addressing mode) 베이스-레지스터주소지정방식 (base-register addressing mode) 유효주소 EA = A 오퍼랜드 = M(A) MOV R1, 100 ; R1 M(100) 55 56
간접주소지정방식 유효주소 EA = M(A) 오퍼랜드 = M(EA) = M( M(A) ) MOV R1, (100) ; R1 M(M(100)) 묵시적 / 즉치주소지정방식 묵시적주소지정방식 : 명령어실행에필요한데이터의위치가묵시적으로지정되는방식 1-주소명령어 : 누산기가오퍼랜드로사용됨 PUSH R1 명령어 : 레지스터 R1 의내용을스택에저장 EA = 미리정해진레지스터 / 기억장소 오퍼랜드 = 미리정해진레지스터 / 메모리의내용 간접비트 즉치주소지정방식 : 데이터가명령어에포함되어있는방식 오퍼랜드 = 명령어의데이터필드 MOV R1, #100 ; R1 100 57 58 레지스터주소지정방식 레지스터간접주소지정방식 유효주소 EA = R필드 오퍼랜드 = R 유효주소 EA = R 오퍼랜드 = M(R) MOV R1, (R2) ; R1 M(R2) 주소지정에사용될수있는레지스터들의수 = 2 k 개 (k는오퍼랜드비트수 ) 필드 필드 MOV R1, R2 ; R1 R2 R R 59 60
변위주소지정방식 유효주소 EA = R + A (R: 베이스, A: 변위, 양수 / 음수가능 ) EA = A + R (A: 시작주소, R: 인덱스 ) 사용되는레지스터에따라여러종류의변위주소지정방식정의 상대주소지정방식 : R = PC, EA = PC + A 인덱스주소지정방식 : R = 인덱스레지스터, EA = A + IX 베이스레지스터주소지정방식 : R = 베이스레지스터, EA = BR+A A 는상수, R( 레지스터 ) 는변수 상대주소지정방식 장점 : JMP target target 분기주소가상대주소로표기 MOV R1, Var Var 에대한 A 필드가상대주소로표기 전체주소비트수보다적은수의비트로분기주소를표현가능 프로그램위치가이동해도오퍼랜드의상대주소는불변 단점 : 분기범위가오퍼랜드필드의길이에의하여제한 61 62 인덱스주소지정방식 자동증가, 감소주소지정방식 자동인덱싱 (auto-indexing) 명령어가실행될때마다 ( 인덱스 ) 레지스터의내용이자동적으로증가혹은감소됨 사전증감 : 명령어가실행되기전에증가혹은감소 사후증감 : 명령어가실행된후에증가혹은감소 용도 : 스택연산, 블록데이터이동 MOV R1, Array(R2+) ; R1 M(Array+R2), R2 R2+1 MOV R1, Array(R2) ; R1 M(Array+R2) MOV R1, Array(-R2) ; R2 R2-1, R1 M(Array+R2) 주요용도 : 배열데이터액세스 배열의첨자값을인덱스레지스터에저장하여사용 63 64
베이스 -레지스터주소지정방식 펜티엄프로세서의명령어형식 유효주소 EA = BR + A 베이스레지스터의내용과변위 A 를더하여유효주소를결정 선형주소 (linear address: LA) = 세그먼트의시작주소 + 유효주소 ( 세그먼트의시작주소는세그먼트레지스터에저장 ) 주요용도 : 서로다른세그먼트내프로그램의위치지정 구조체의특정필드액세스 MOV R1, (R2+10) ; R1 M(R2+10) 65 66 Pentium 의가변길이명령어형식 ARM Instruction format 67 68