일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- pwn.college
- 시스템해킹
- 시스템
- 리눅스커널
- 커널
- 리눅스 커널
- 시스템프로그래밍
- 프로그래밍
- 어셈블리어
- 시그널
- 리눅스
- radare2
- 컴퓨터구조
- pwncollege
- C언어
- 알고리즘
- css
- 취약점
- C++
- 워게임
- Bandit
- 리버싱
- Pwnable.kr
- Leviathan
- 시스템 프로그래밍
- kernel
- write up
- 드론
- px4
- wargame
- Today
- Total
Computer Security
#6 컴퓨터구조와 명령어 본문
명령어의 구성 요소
1.연산코드와 피연산자
-연산코드(Operation Code,Opcode): 1.기계(CPU)가 수행할 동작을 나타내는 코드이다.
2.명령어에서 '어떤 연산'인지를 나타내는 부분이다.
-피연산자(Operand):연산(동작)의 대상. 주로 레지스터나 메모리상의 데이터가 그 대상이 된다.
2.명령어 코드의 형식
-명령어 코드의 비트열은 필드라고 불리는 몇 개의 그룹으로 나누어진다.
명령어 필드에 들어가는 요소들은 다음과 같다.
→수행해야 할 연산을 명시한 연산 코드(Opcode)필드
→메모리의 주소나 레지스터, 즉 피연산자의 주소를 지정하는 주소(Address)필드
→피연산자의 유효 주소(effective address)가 결정되는 방법을 나타내는 모드 필드
-CPU설계에 따라 피연산자의 주소의 개수는 달라질 수 있고, 피연산자 주소를 나타내는 다양한 방식들을 제공한다.
피연산자 주소를 나타내는 방식을 두고 주소지정방식(Addressing mode)이라 한다.
2.어셈블리어 코드의 형식
-어셈블리어의 각 줄은 다음과 같이 필드라 불리는 세 개의 부분으로 구성된다.
1. 레이블 필드: 심볼 주소를 나타내거나 빈칸이 될 수도 있다.
2. 명령어 필드: 기계 명령어나 의사(pseudo) 명령어를 기술
3. 주석(comment): 명령어에 대한 주석을 기술한다.
코드형식
Label | instruction | comment
3.의사 명령어(Pseudo Instruction)
-어셈블러 디렉티브(Assembler Directive)라고도 함
-기계 명령어가 아니라 번역 과정에서 발생되는 어떤 상황에 관한 정보를 어셈블러에게 알려주는 명령어
-의사 명령어는 어셈블리어 코드와 달리 기계 코드로 번역되지는 않는다.
-어셈블러 구현체에 종속적
4.주소지정방식(Addressing mode)
-CPU 설계에 따라 연산의 대상이 되는 피연산자(레지스터나 메모리,I/O 장치 등)를 지정하기 위한 다양한
어드레싱 기법 제공
-포인터, 카운터 인덱싱, 프로그램 재배치(relocation) 등의 편의를 프로그래머에게 제공함으로써 융통성 제공
-명령어의 주소 필드의 비트 수를 줄인다.
유효주소(Effective Address): 주소지정방식에 의해 결정되는 피연산자의 실제 주소
피연산자의 주소를 표현하는 방법들
묵시 주소지정방식(Implied addressing mode)
-피연산자가 묵시적으로 명령어의 정의에 따라 정해져있다.
ex)
int ; X레지스터의 값을 1증가
dey ; Y레지스터의 값을 1감소
rts ; 서브루틴을 종료
sei ; 인터럽트 비활성(interrupt disable) 비트를 1로 세트한다.
clc ; 캐리(Carry) 비트를 0으로 클리어한다.
php ; PusH Processor status register : 상태 레지스터를 스택에 푸시한다.
레지스터 주소지정방식(Register addressing mode)
-CPU 레지스터를 피연산자로 지정하는 방식
ex)
add $t2, $t0, $t1 t0와 t1을 더해서 t2에 저장
and $t3, $t2, $s0
or $t4, $t3, $s1
즉시 주소지정방식(Immediate addressing mode)
-피연산자 그 자체가 명령어 주소 필드에 들어가는 방식
ex)
lda #$10 ; 누산기 레지스터 A에 0x10 적재
adc #$20 ; 누산기에 0x20 덧셈
직접주소와 간접주소
직접주소(direct address): 주소 필드에 들어가는 주소가 피연산자의 유효주소인 경우를 직접주소라한다.
직접 주소지정방식은 직접주소를 이용하여 피연산자를 지정한다.
간접주소(indirect address):주소 필드에는 피연산자의 유효주소 대신 피연산자의 유효주소가 저장되어 있는 메모리 주소가 들어간다. 피연산자의 간접 참조를 위해 별도의 사이클이 필요하다.
레지스터 간접 주소지정방식: 주소 필드에서 지정한 레지스터는 피연산자의 유효주소를 저장하고 있다.
간접 주소지정방식: 주소 필드에는 피연산자의 유효주소를 저장하고 있는 메모리 주소가 들어간다.
인덱스와 베이스 주소
-피연산자의 유효주소는 베이스(기준) 주소에 인덱스 값을 더해서 구한다.
Effective Address = Base Adress + Index
-흔히 데이터 배열에 접근할 때 사용하는 방법. 배열의 시작 주소를 베이스 주소로 사용하고 시작주소로부터 떨어진 인덱스 값을 인덱스 레지스터를 통해 지정하는 방식
->명령어의 주소 필드에는 베이스 주소가 들어간다.
-인덱스 주소지정방식과 달리 배열의 시작주소를 베이스 레지스터에 저장하고 그로부터 떨어진 인덱스 값을 명시하는 방식을 베이스 레지스터 주소지정방식(base register addressing mode)라 한다.
->명령어의 주소필드에는 인덱스 값이 들어간다.
상대 주소지정방식(Relative addressing mode)
-프로그램 카운터가 명령어의 주소 필드와 합해져서 유효 주소가 결정된다.
-주소 필드에 들어가는 값은 PC로부터 상대적으로 떨어진 오프셋이다.
-근거리 분기(점프) 명령어에서 주로 사용된다.
-주소 필드의 비트 수를 절약할 수 있다는 장점이 있다.
명령어 집합에 따른 컴퓨터 분류
CISC와 RISC
CISC(Complex Instruction Set Computer) 구조의 특징
-많은 수의 명령어
-다양한 주소지정방식
-가변 길이 명령어 형식
-메모리의 피연산자를 처리하는 명령어
RISC(Reduced Instruction Set Computer) 구조의 특징
-상대적으로 적은 수의 명령어
-상대적으로 적은 수의 주소지정방식
-메모리 참조는 load와 store 명령어만으로 제한된다.
-모든 연산은 CPU 레지스터 안에서 수행된다.
-고정 길이 명령어 형식
-단일 사이클의 명령어 실행(평균적인 값)
'컴퓨터구조&어셈블리어' 카테고리의 다른 글
#8 x86 구조 (레지스터 구조) (0) | 2022.05.20 |
---|---|
#7 x86의 구조 (역사) (0) | 2022.05.19 |
#5 컴퓨터 구조2 (0) | 2022.05.15 |
#4 컴퓨터 구조1 (0) | 2022.05.14 |
#3 어셈블리어 스택 (0) | 2022.05.13 |