본문 바로가기

ETC & TIP/정보보호학 전공학습

[시스템보안개론] 80x86 시스템에 대한 이해

1. 80x86 시스템 CPU, 레지스터, 메모리

a404_시스템보안개론_강의노트_0201.docx

a404_시스템보안개론_강의노트_0202.docx

a404_시스템보안개론_강의노트_0203.docx

 

학습목표

80x86 시스템 CPU 구조에 대해

레지스터의 종류에 대해

80x86 시스템의 메모리에 대해

80x86 시스템에 대해 알고, 80x86 시스템 CPU의 구조와 메모리에 대해 설명

 

주요용어

메모리

기억(記憶) 또는 메모리(영어: memory)는 정보를 저장하고 유지하고 다시 불러내는 회상의 기능을 의미한다. 인간은 기억하는 능력을 가지고 있는 동시에 망각하는 기능을 가지고 있다. 기억은 학습, 사고, 추론을 하기 위한 기본적인 기능이다. 인간의 기억은 단기적 작용기억과 장시간 기억되는 장기 기억이 있다. 정보 처리 측면에서는 기억은 부호화(encoding), 저장(storage), 재생(retrieval)의 단계로 이루어진다. 컴퓨터에서는 기억하기 위한 장치로 ROM, RAM 이나 하드 디스크 등의 저장장치를 이용한다.

 

선입 선출(First In First Out, FIFO)

선입 선출(First In First Out, FIFO)은 시간과 우선순위와 관련된 데이터를 정리하고 이용하는 방식을 줄여 말하는 것이다. 이러한 표현은 선입선처리 행위에 따라 순서대로 처리함으로써 기술을 처리하거나 수요 충돌을 관리하는 대기의 원칙을 말한다. 다시 말해, 먼저 온 것은 먼저 처리되고, 처리가 끝날 때까지 다음 것은 대기 상태에 놓이게 된다.

 

80x86 시스템의 CPU모델별 차이점에 대해서 기술하시오.

 8086과 8066은 XT라고 불리던 인텔 CPU를 사용하는 IBM PC의 초기 보급형 모델이다. 이후 AT라고 부르는 80286 시스템이 나오고 80368부터는 80을 때고 386, 486이라 부르는 시스템이 나왔다. 80386 시스템부터는 32비트 서비스 처리가 가능하게 되었다. 80586 부터는 펜티엄, 펜티엄-프로라고 불렀다.

 

 

 

 

【학습정리】

1. 80x86 시스템 CPU는 연산장치, 제어 장치, 레지스터의 구성 요소로 이루어져 있다.

2. 레지스터는 CPU 내부에서 데이터를 일시적으로 저장하는 장소로서 범용 레지스터, 세그먼트 레지스터, 포인터
레지스터, 인덱스 레지스터, 플래그 레지스터로 분류된다.

 

 

 

 

 

2. 어셈블리어 기본 문법

 

학습목표

- 어셈블리어에 대해 알아본다.

- 어셈블리어의 구조에 대해 알아본다.

- 어셈블리어의 데이터 타입과 리틀 엔디언 방식에 대해 알아본다.

- 어셈블리어의 주소 지정방식에 대해 알아본다.

- 어셈블리어 데이터 타입과 저장방식,기본 명령에 대해 설명

 

주요용어

HEX

십육진법(hexadecimal)은 16을 밑으로 하는 기수법이다. 보통 0부터 9까지의 수와 A에서 F까지의 로마 문자를 사용하고, 이때 대소문자는 구별하지 않는다. 이진법 표기의 4자리와 십육진법 한 자리가 일대일 대응하며, 2진수가 많이 쓰이는 컴퓨터에서 2진수를 대신해 많이 쓰이고 있다. 1바이트는 8비트, 즉 2진수 8자리이므로, 16진수 두 자리로 표현할 수 있다.

 

엔디언(Endianness)

엔디언(Endianness)은 컴퓨터의 메모리와 같은 1차원의 공간에 여러 개의 연속된 대상을 배열하는 방법을 뜻하며, 바이트를 배열하는 방법을 특히 바이트 순서(Byte order)라 한다. 엔디언은 보통 큰 단위가 앞에 나오는 빅 엔디언(Big-endian)과 작은 단위가 앞에 나오는 리틀 엔디언(Little-endian)으로 나눌 수 있으며, 두 경우에 속하지 않거나 둘을 모두 지원하는 것을 미들 엔디언(Middle-endian)이라 부르기도 한다.

 

hex 값 0x34F3을 1500번지에 저장하기 할 때 빅 엔디언 방식과 리틀 엔디언 방식의 차이점에 대해서 생각해 보시기 바랍니다.

빅 엔디언 방식은 상위 값은 하위 번지에 저장하고 하위 값은 상위 번지에 저장한다. 따라서 0x34F3을 1500번지에 저장하려면 하위 값 0xF3은 1501번지에 저장하고, 상위 값 0x34는 1500 번지에 저장한다. 그에 반하여 리틀 엔디언 방식은 상위 값은 상위 번지에 저장하고 하위 값은 하위 번지에 저장한다. 따라서 0x34F3을 1500번지에 저장하려면 하위 값 0xF3은 1500번지에 저장하고, 상위 값 0x34는 1501번지에 저장한다.

 

 

 

 

 

【학습정리】

1. 데이터를 리틀 엔디언 방식으로 스택에 저장하기 위해서는 상위 바이트와 하위 바이트를 나누어 각각 상위 번지와
하위 번지에 저장한다.

2. 어셈블리어의 주소 지정 방식은 레지스터 주소 지정, 직접 메모리 주소 지정, 레지스터 간접 주소 지정, 인덱스 주소
지정, 베이스 인덱스 주소 지정, 변위를 갖는 베이스 인덱스 주소 지정 방식이 있다.

 

 

 

 

 

3. 어셈블리어 기본 명령, 스택을 통한 명령 처리

 

 

 

주요용어

캐리(carry)

받아올림(carry)은 수학에서 덧셈을 하는 과정에서 같은 열의 수끼리의 합이 10이거나 10보다 크면 바로 윗 열로 10을 올려주는 것을 뜻한다. 바로 윗 열의 수는 1 커진다.

 

아스키

영문 알파벳을 사용하는 대표적인 문자 인코딩이다. 아스키는 컴퓨터와 통신 장비를 비롯한 문자를 사용하는 많은 장치에서 사용되며, 대부분의 문자 인코딩이 아스키에 기초를 두고 있다.

 

1000과 1010의 AND, OR, XOR 결과 값에 대해서 생각해 보시기 바랍니다.

논리곱이라 불리는 AND 명령은 대응되는 비트가 둘 다 1일 때만 결과가 1이 되고, 그 이외는 모두 0이 된다. 따라서 1000과 1010의 AND 연산의 결과는 1000이 된다.
논리합이라 불리는 OR는 대응되는 비트 중 하나만 1이어도 결과가 1이고, 둘 다 0인 경우에만 0이 된다. 따라서 1000과 1010의 OR 연산의 결과는 1010이 된다.
XOR는 대응되는 비트 중에서 한 비트가 1이고 다른 비트가 0이면 1이고 두 개의 비트가 모두 0 또는 1일 때 0이 된다. 따라서 1000과 1010의 XOR 연산의 결과는 0010이 된다.

 

 

 

【학습정리】

1. 어셈블리어 기본 명령은 산술 연산 명령, 데이터 전송 명령, 논리 명령, 스트링 명령, 제어 전송 명령, 프로세서 제어
명령이 있다.

 


 


1. 80x86 시스템 CPU 구조

 

 

2. 연산 장치(ALU,Arithmetic and Logic Unit)
*CPU(중앙 처리 장치)의 핵심 부분 중 하나
*산술과 논리 연산을 수행하는 연산 회로 집합

 

 
[시스템보안개론] 2주차 1차시. 80x86 시스템 CPU, 레지스터, 메모리


3. 연산 장치의 구성 요소

 

 

4. 제어 장치(Control Unit)

* 입력, 출력, 기억, 연산 장치를 제어하고 감시
* 주기억 장치에 저장된 명령을 차례로 해독하여 연산 장치로 보내 처리되도록 지시

 

5. 제어 장치의 구성 요소

 

 

학습내용2 : 레지스터의 종류


1. 레지스터(Register)

* 처리 중인 데이터나 처리 결과를 임시 보관하는 CPU 내의 기억 장치
* 레지스터의 종류
범용 레지스터(General Resistor)
세그먼트 레지스터(Segment Resistor)
포인터 레지스터(Pointer Resistor)
인덱스 레지스터(Index Resistor)
플래그 레지스터(Flag Resistor)

2. 범용 레지스터(General Resistor)

* 연산 장치가 수행한 계산 결과의 임시 저장, 산술 및 논리 연산, 주소 색인 등의 목적으로 사용될 수 있는 레지스터
* EAX, EBX, ECX, EDX

* 앞의 E는‘확장된(Extended)’을 의미

 

 

* EAX(Extended Accumulator Resistor)
누산기(Accumulator)
32비트
산술 연산과 입출력에 사용

 

 


* EBX(Extended Base Resistor)
베이스 레지스터(Base Resistor)
32비트
DS 세그먼트에 대한 포인터를 저장
ESI나 EDI와 결합하여 메모리의 주소 지정을확장하기 위한 인덱스에 사용되는 유일한 범용 레지스터

* ECX(Extended Count Resistor)
카운트 레지스터(Count Resistor)
32비트
루프가 반복되는 횟수를 제어하는 값

* EDX(Extended Data Resistor)
데이터 레지스터(Data Resistor)
32비트
입출력 연산에 사용
큰 수의 곱셈과 나눗셈 연산을 위해 EXA와 함께 사용

3. 세그먼트 레지스터(Segment Resistor)

* 프로그램에 정의된 메모리상의 특정 영역
* 코드, 데이터, 스택 등을 포함
* 기본 세그먼트 레지스터
CS, DS, SS

* 여분 세그먼트 레지스터(Extra Segment Resistor) ES, FS, GS

 

 

* CS(Code Segment Resistor)
실행될 기계 명령을 포함
코드 세그먼트의 시작 주소를 나타냄

* DS(Data Segment Resistor)
프로그램에 정의된 데이터, 상수, 작업 영역을 포함
데이터 세그먼트의 시작주소를 나타냄
데이터의 오프셋을 DS 레지스터에 저장된 주소 값에더해 데이터 세그먼트내에 위치해 있는데이터의 주소를 참조

 

 


* SS(Stack Segment Resistor)
실행 과정에서 필요한 데이터나 연산 결과 등을임시로 저장하거나 삭제할 때 사용
스택 세그먼트의 시작 주소를 나타냄

* ES
추가로 사용된 데이터 세그먼트의 주소를 나타냄
16비트

* FS, GS
ES와 목적은 이와 비슷하지만 거의 사용되지 않음
16비트

4. 포인터 레지스터(Pointer Resistor)

* 프로그램 실행 과정에서 사용되는 주요 메모리 주소 값 저장
* EBP(Extended Base Pointer Resistor)
스택 세그먼트에서 호출되어 사용되는 함수의시작 주소 값 저장
ESP 레지스터와 함께 스택 프레임 형성
실제 메모리 주소 참고할 경우 SS 레지스터와 함께 사용
32비트

* ESP(Extended Stack Pointer Resistor)
현재 스택의 가장 하위 주소 저장
실제 메모리 주소 참고할 경우 SS 레지스터와 함께 사용

* EIP(Extended Instruction Pointer)
현재 실행 중인 코드 세그먼트에 속한 현재 명령을 나타냄
메모리상의 주소 참조를 위해 CS와 함께 사용

5. 인덱스 레지스터(Index Resistor)

*데이터를 복사할 때 출발지와 목적지 주소를 나타냄
*ESI(Extended Source Index Resistor)
출발지 주소에 대한 값 저장
32비트
*EDI(Extended Destination Index Resistor)
목적지 주소에 대한 값 저장
32비트


 


6. 플래그 레지스터(Flag Resistor)

* 32비트 크기로 연산 결과 및 시스템 상태와 관련된 여러 가지 플래그 값 저장

 


* 상태 플래그(State Flag)
산술 명령(ADD, SUB, MUL, DIV) 결과를 반영
CF(Carry Flag, 비트 0)> 산술 연산 결과로 자리올림, 자리내림 발생할 때 세트
ZF(Zero Flag, 비트 6)> 산술 연산 결과 0이면 세트, 이외에는 클리어
OF(Overflow Flag, 비트 11)> 부호가 있는 수의 오버플로우가 발생하면 세트> MSB(Most Significant Bit)가 변경되었
을 때 세트
PF(Parity Flag, 비트 2) : 산술 연산의 결과가 짝수면 세트
AF(Adjust Flag, 비트 4) : 8비트 피연산자를 사용한 산술연산에서 비트 3에서 비트 4로 자리올림하면 세트
SF(Sign Flag, 비트 7) : 산술 및 논리 연산의 결과로 음수가 생기면 세트

* 제어 플래그(Control Flag)
DF(Direction Flag, 비트 10)
스트링 명령(MOVS, CMPS, SCAS, LODS, STOS)을 제어
DF가 1이면 스트링 명령 자동 감소
DF가 0이면 스트링 명령 자동 증가
STD 명령은 DF 플래그를 세트
CLD 명령은 DF 플래그를 클리어

* 시스템 플래그(System Flag)
TF(Trap Flag, 비트 8)> 디버깅 시 Single Step Mode 모드를 활성화하면 세트
IF(Interrupt enable Flag, 비트 9)> 프로세서의 인터럽트 처리 여부를 제어
IOPL(I/O Privilege Level, 비트 12/13)> 현재 실행되는 프로그램이나 태스크의 입출력 특권 레벨 지시
NT(Nested Task flag, 비트 14)> 인터럽트되거나 호출된 태스크를 제어
RF(Resume Flag, 비트 16)> 프로세서의 디버그 예외 반응을 제어
VM(Virtual 8086 Mode flag, 비트 17)> V86 모드를 활성화하면 세트
AC(Alignment Check, 비트 18)> 메모리 참조 시 정렬 기능을 활성화하면 세트
VIF(Virtual Interrupt Flag, 비트 19), VIP(Virtual Interrupt Pending, 비트 20)> 가상 모드 확장과 관련해 사용
ID(IDentification, 비트 21)> CPUID 명령의 지원 유무를 결정

 

 


학습내용3 : 80x86 시스템의 메모리


1. 메모리의 기본 구조

 

 

2. 스택(Stack)

* 후입선출(LIFO : Last-In, First Out) 방식에 의해 정보를 관리하는 데이터 구조
* 가장 나중에 삽입된 정보가 가장 먼저 읽힘
* Top 이라고 불리는 스택의 끝부분에서 데이터의 삽입과 삭제가 발생

3. 힙(Heap)

* 프로그램의 실행 중 필요한 기억 장소를 할당하기 위해 운영체제에 예약되어 있는 기억 장소영역
* 힙에 대한 기억 장소는 포인터를 통해 동적으로 할당되거나 반환

4. 데이터 세그먼트(Data Segment)

* 초기화된 외부 변수나 static 변수 등이 저장되는 영역
* 보통 텍스트 세그먼트(Text segment)와 데이터 세그먼트 영역을 합쳐 프로그램이라 지칭
static int a = 1;

5. BSS 세그먼트(BSS Segment)

* 초기화 되지 않은 데이터 세그먼트
(Uninitalized data segment)
* 프로그램이 실행될 때 0이나 NULL 포인터로 초기화
* 외부 변수나 static 변수 중 초기화 되지 않은 변수들이 정의될 때 저장
static int a ;

 


6. 텍스트 세그먼트(Text Segment)

* CPU에 의해 실행되는 머신 코드가 있는 영역

7. 메모리 접근 모드와 동작

* 실제 모드
8086 CPU에서 사용되던 동작 모드
20비트 주소 버스 사용 위해 16비트 레지스터 사용
1MB(220 = 1,048,567)의 메모리 사용 가능
20비트 주소를 나타내기 위해 세그먼트 레지스터를도입

 

 

 

* 세그먼트 주소인 CS 레지스터가 0x2525h,
오프셋인 IP가 0x95F3h면 0x2525h 뒤에
한 자리의 0x0h를 붙여 95F3h를 더한 2E843h가 실제 가리키는 물리 주소가 됨

* 2525h:95F3h, 또는 [CS]:96F3h로 표현

 

 


* 보호 모드
80286부터 도입하여 32비트 CPU 80386에 완성
32비트 주소 버스를 통해 4GB의 메모리를 사용 가능
메모리 보호 기능과 페이징(Paging) 등을 통해 가상 메모리를 효율적으로 구현

 



어셈블리어 기본 문법

 

 

학습내용1 : 어셈블리어의 개요


1. 어셈블러(Assembler)

저급언어로 쓰여진 프로그램을 읽어서 그와 동일한 기능을 하는 기계언어 프로그램으로 변환하는 기능 수행

2. 저급언어를 사용하여 프로그래밍할 때 프로그래머가 알아야 할 것

* 명령문과 사용규칙
* 프로그램이 실행될 기계의 기본 구조
메모리에 자료가 저장되는 방식
프로세서가 자료를 처리하는 방식 등

3. 어셈블리어

* 기계어와 일대일 대응이 되는 컴퓨터 프로그램의 저급언어

4. 고급언어의 특징

① 개념적인 언어
② 대상 컴퓨터의 세부적인 사항을 숨기고 있음
③ 프로그램이 읽기 쉽고 수정하기 편함

5. 어셈블리 언어를 사용해야 하는 경우

① 프로세서를 직접 제어하려고 할 때
② 속도 빠른 코드를 생성하려고 할 때
③ 프로그램의 크기를 최소화하려고 할 때

 

 

 


6. 어셈블리어 프로그램 개발 단계

 

 

 

 

 

7. 진수 체계

* 2진수
2진법(2진 위치 기수법)을 사용한 진수 체계
디지털 시스템에서 사용되는 0과 1을 이용
소자 특성에 편리하고 논리의 조립이 간단하기 때문에 컴퓨터 내부 디지털 신호는 2진법을 사용

* 2진수 - 10진수와 2진수의 대응관계

 

 

 

 

 

 

* 8진수
8진법(8진 위치 기수법)을 사용한 진수 체계
0, 1, 2, 3, 4, 5, 6, 7을 사용
오래된 컴퓨터 시스템에서 데이터를 표현하기 위한 단위
8진법 한 자리는 2진법의 세 자리와 일대일 대응

* 16진수
16진법(16진 위치 기수법)을 사용한 진수 체계
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F을 사용
컴퓨터 시스템에서 데이터를 표현하기 위한 단위
16진법 한 자리는 2진법의 네 자리와 일대일 대응

 

 

 

 

 

 

 

 

학습내용2 : 어셈블리어의 구조

1. Intel 문법
① 윈도우에서 사용
② 목적지 (Destination)가 먼저 오고 원본(Source)이 뒤에 위치

 

 

 


2. AT&T 문법

① 리눅스에서 사용
② 원본(Source)이 먼저 오고 목적지 (Destination)가 뒤에 위치

 

 

 


3. MOV

① 제2피연산자의 값을 제1피연산자로 복사하는 명령
② 어셈블리어 작동 코드 또는 명령 코드라고 불림

4. Comment

① 기계어 코드로 번역되지 않음
② 해당 명령에 대한 사용자 주석

 


5. Label

① 기계어 코드로 번역되지 않음
② 점프(분기) 명령 등에서 참조될 때 메모리 주소 계산에 사용
Label_1 : MOV AX, BX
.
.
.
JMP Label_1 ; Label_1로 무조건 이동하라는 명령

6. Label 명명법

① 31문자까지 가능
② Label 명명 후 콜론(:) 으로 종료
③ 알파벳, 숫자, 특수 문자(? @ _ $) 사용 가능
④ 첫 문자를 숫자로 사용할 수 없음
⑤ 레지스터의 이름은 사용하지 않음

* 적합한 예
HELLO $MARKET A12345 LONG_NAME PART_3
* 적합하지 않은 예
LONG-NAME 3_PART

7. 어셈블리어에 사용되는 연산자 특징

* 명령어가 작용하는 레지스터나 기억 장소의 위치
* 연산항을 갖지 않는 명령어
CLD > 캐리 플래그를 클리어하는 명령
* 연산항이 한 개인 명령어
DEC CX > 피연산자 CX 내용을 하나 감소시킴
* 연산항이 두 개인 명령어
MOV AX, BX > BX의 내용을 AX로 이동시킴

8. 숫자 정의 규칙

* 숫자는 10진수, 16진수와 2진수로 표현될 수 있음
1) 10진수
0~9를 사용
예) AX 레지스터에 10진수인 855를 로드
MOV AX, 855

 


2) 16진수
0과 9 사이의 숫자와 A~F(대문자 또는 소문자) 사용
16진수라는 것을 나타내기 위해 “H”를 숫자 뒤에 붙임
예) AX 16진수인 855H(10진수로 2133)를 로드
MOV AX, 855H
16진수가 A~F 중의 한 문자로 시작될 때 0을 앞에 첨가
예) AX 16진수인 FFH(10진수로 255)를 로드
MOV AX, 0FFH

3) 2진수
0과 1만 사용하고, 숫자 뒤에 “B”를 붙임
예) AX에 2진수인 011010010110B(10진수로 1686, 16진수로 696H) 를 로드
MOV AX, 011010010110B

 

학습내용3 : 어셈블리어의 데이터 타입과 리틀 엔디언 방식

 

1. 데이터 타입
비트(Bit)
- 데이터 표현의 최소단위
- 한 개의 2진수
- 0 또는 1

니블(Nibble)
- 4비트(하프바이트, Half-byte)
- 단순한 디지털 장치의 데이터를 처리
- 예) 1101

바이트(Byte)
- 8비트
- 예) 1100 0111

워드(Word)
- 16비트(일반적인 정의)
- 더블워드(Double-word) : 32비트

 

 


* 어셈블리어의 데이터 타입

 


2. 리틀 엔디언 방식
2개의 번지로 나누어 저장해야 하는 16비트 데이터(워드)의 경우 하위 바이트는 하위 번지에 상위 바이트는 상위 번지에
저장
* 어셈블리어의 데이터 타입별 메모리 저장 위치

 

 

학습내용4 : 어셈블리어의 주소 지정 방식


1. 주소 지정 방식

* 직접 주소 지정 방식
레지스터 주소 지정
직접 메모리 주소 지정
* 간접 주소 지정 방식
레지스터 간접 주소 지정
인덱스 주소 지정
베이스 인덱스 주소 지정
변위를 갖는 베이스 인덱스 주소 지정

2. 레지스터 주소 지정

레지스터의 주소 값을 직접 지정 복사, 처리 속도 가장 빠름
예시 : BX 레지스터의 내용을 DX 레지스터로 복사
MOV DX, BX

 

 

 

 


3. 직접 메모리 주소 지정

가장 일반적인 주소 지정 방식
피연산자 하나가 메모리 위치를 참조하고 다른 하나는 레지스터를 참조
세그먼트:오프셋 형식 사용
두 연산자가 메모리를 직접 참조하는 것은 MOVS와 CMPS만 가능

* 직접 메모리 주소 지정의 예
MOV AL, DS:[8088h]
MOV DS:[1234h], DL

 

 

 

 


4. 레지스터 간접 주소 지정

* 직접 메모리 주소 지정 방식처럼 세그먼트: 오프셋 형식 사용
* 세그먼트는 명시적으로 적지 않고 주소에 레지스터만 표시함
레지스터 간접 주소 지정의 예
MOV AL, [BX]
MOV AL, [BP]

 

 

 

 

* 다음과 같이 기본이 아닌 세그먼트를 강제로 지정 할 수도 있음
MOV AL, CS:[BX]
MOV AL, DS:[BP]

 

 

 

 

 

 


5. 인덱스 주소 지정

레지스터 간접 지정 방식에 변위가 더해진 메모리 주소 지정 방식
예시 : 20h만큼 더해 메모리를 참조한 명령

* 인덱스 주소 지정의 예
MOV AL, [BX+20h]
MOV AL, [BP+20h]

 

 

 

 


* 다음과 같이 바꿔서 표현할 수 있음
MOV AL, 20h[BX]
MOV AL, 20h[BP]

6. 베이스 인덱스 주소 지정

실제 주소 생성 위해 베이스 레지스터(BX 또는 BP)와 인덱스 레지스터(DI 또는 SI)를 결합
2차원 배열의 주소 지정에 사용
* 베이스 인덱스 주소 지정의 예
MOV AL, [BX+SI]
MOV AL, [BP+SI]

 

 

 

 


* 다음과 같이 바꿔서 표현할 수 있음
MOV AL, [BX][SI]
MOV AL, [BP][SI]

 

 

 

 
[시스템보안개론] 2주차 2차시. 어셈블리어 기본 문법


7. 변위를 갖는 베이스 인덱스 주소 지정

베이스-인덱스의 변형으로 실제 주소 생성 위해 베이스 레지스터, 인덱스 레지스터, 변위 결합

* 변위를 갖는 베이스 인덱스 주소 지정의 예
MOV AL, [BX+SI+20h]
MOV AL, [BP+SI+20h]

 

 

 


* 다음과 같이 바꿔서 표현할 수 있음
MOV AL, [BX][SI][20h]
MOV AL, [BP][SI][20h]

 

 


 

 

어셈블리어 기본 명령,스택을 통한 명령처리 과정

 

 

학습내용1 : 어셈블리어의 기본 명령


1. 산술 연산 명령

* 기본적인 정수 계산
* ADD(Add)
제1피연산자와 제2피연산자 값을더한 결과 값을 제1피 연산자에 저장
ADD AL 4
* SUB(Subtract)
제1피연산자에서 제2피연산자 값을뺀 결과 값을 제1피연산자에 저장
SUB AL 4
* CMP(Compare)
데이터의 두 값 비교 시 사용
CMP A, B 의 경우 A에서 B를 뺀 값이 0이면 참
CMD AL 4

2. 기타 산술 연산 명령

 

 

 

 

 

 


3. 데이터 전송 명령

* 메모리, 범용 레지스터, 세그먼트 레지스터로참조되는 주소에 존재하는 데이터 전송
* MOV(Move)
데이터 이동할 때 사용
MOV AX [BP+8]
* PUSH(Push)
스택에 데이터를 삽입할 때 사용
[그림 2-19]와 같이 스택은 커지고,스택 포인터는 데이터 크기만큼 감소

 


* POP(Pop)
스택에서 데이터 삭제할 때 사용
스택에서 삭제된 명령은 반환 값으로 받아 사용 가능
[그림2-20]과 같이 스택 포인터는삭제하는 데이터 크기만큼증가

 

 


* LEA(Load effective address to register)
데이터의 값 이동할 때 사용
제1피연산자는 데이터 이동의 목적지
제2피연산자에‘BP+4’가 있을 경우‘BP’만 주소 값으로 인식 ‘+4’는BP 주소 값에 대한추가 연산으로 처리

 

 

 

 

 

 

4. 기타 데이터 전송 명령

 


5. 논리 명령

* 연산부호가 논리연산을 지정하는 명령
* AND(And)
대응되는 비트가 둘 다 1일 때만 결과가 1
그 이외는 모두 0
AND AX 10h

 

 


* OR(Or)
대응되는 비트 중 하나만 1이어도 결과가 1
둘 다 0인 경우에만 0
OR AX 10h

 

 


* XOR(Exclusive Or)
대응되는 비트 중에서 한 비트가1이고 다른 비트가 0이면
1 두 개의 비트가 모두 0 또는 1일 때 0
XOR AX 10h

 


* NOT(Invert)
피연산자의 1의 보수를 구하는 작동 코드
각 비트를 반전
NOT AX

 

 

* TEST(And Function to flags, no result)
데이터의 두 값 비교할 때 사용
데이터의 변경 없이 단순 비교
TEST AL 00001001b

 

 

기타 논리 명령

 

 


6. 스트링 명령
* 바이트로 구성된 스트링(strings of bytes)을메모리 내에서 전송
* REP(Repeat)
ADD나 MOVS와 같은 작동 코드의 앞에 위치
CX가 0이 될 때까지 뒤에 오는 스트링 명령 반복
REP 작동 코드
* MOVS(Move String)
바이트나 워드, 더블워드 옮기는 명령
MOVSB, MOVSW, MOVSD 명령 존재
DS:SI가 지시한 메모리 데이터를ES :DI가 지시한 메모리로 전송

 

 


* MOVS(Move String) 사용의 예

 

 

 

 

* 기타 스트링 명령

 

 

 

 


7. 제어 전송 명령
* 프로그램의 흐름 제어
* JMP(Unconditional Jump)
대표적인 점프 명령 프로그램을실행할 주소 또는 라벨로 이동
JMP 100h
* 조건부 점프 명령

 

 

 


* CALL(Call)
JMP처럼 함수 호출할 때 사용
제1피연산자에 라벨을 지정
리턴 주소로 IP(Instruction Pointer) 주소 백업
PUSH EIP + JMP 와 같은 의미
CALL [제1피연산자]

* RET(Return from CALL)
함수에서 호출한 곳으로 돌아갈 때 사용하는 명령
POP EIP 와 같은 의미
CALL [제1피연산자]

LOOP(Loop CX times)
문장들의 블록을 지정된 횟수만큼 반복
CX는 자동적으로 카운터로 사용되며루프를 반복할 때 마다 감소

 

 

 

 


* INT(Interrupt)
인터럽트가 호출되면CS:IP(Code Segment : Instruction Pointer)와플래그를 스택에 저장
그 인터럽트에 관련된 서브 루틴이 실행
CALL [제1피연산자]

* 기타 제어 전송 명령

 


 


8. 프로세스 제어 명령

*레지스터의 플래그 값을 세트 또는 클리어하는 명령
*STC(Set Carry)
피연산자 없이 사용
EFLAGS 레지스터의 CF 값을 세트
*NOP(No Operation)
아무 의미 없는 명령
일종의 빈 칸을 채우려고 사용

* 기타 프로세스 제어 명령