1. 개요

 

어셈블리어 또는 어셈블리 언어는 기계어와 일대일 대응이 되는 컴퓨터 프로그래밍의 저급 언어이다.

컴퓨터 구조에 따라 사용하는 기계어가 달라지며, 기계어에 대응되어 만들어지는 어셈블리어도 각각 다르게 된다. 컴퓨터 CPU마다 지원하는 오퍼레이션의 타입과 개수는 제각각이며, 레지스터의 크기와 개수, 저장된 데이터형의 표현도 각기 다르다. 모든 범용 컴퓨터는 기본적으로 동일한 기능을 수행하지만, 기능을 어떤 과정을 거쳐 수행할지는 다를 수 있으며, 이런 차이는 어셈블리어에 반영되게 된다.

 

어셈블러는 니모닉 기호를 opcode로 변환하고 메모리 위치와 기타 존재물에 따라 식별자를 다시 분석함으로써 목적 코드를 만들어낸다. 고급 언어와는 달리 어셈블리어는 간단한 문장에 대해 기계어와 일대일 대응관계가 있지만, 자주 쓰이는 몇 명령은 둘 이상의 기계어 명령을 묶어 하나의 어셈블리 명령어에 대응시키기도 한다.

 

어셈블리 명령어 종류는 기능으로 분류하면 다음과 같다.

 

어셈블리 명령어의 구조는 다음과 같다.

 

Opcode는 ADD, SUB 등과 같은 명령어들을 의미하고 Operand는 피연산자이다. 명령어에 따라 Operand의 개수가 정해져 있다.

예를 들면 다음과 같다.

 

Posted by Imp3rio

1. 레지스터


1) 개요

레지스터는 컴퓨터의 프로세서 내에서 자료를 보관하는 아주 빠른 기억장소이다.

레지스터는 메모리 계층의 최상위에 위치하며, 가장 빠른 속도로 접근 가능한 메모리이다. 최신 프로세서에서 레지스터는 대개 레지스터 파일로 구현되지만, 과거에는 플립플롭, 마그네틱 코어, 박막 필름 메모리 등으로 구현되기도 했다.


2) 레지스터 종류

레지스터는 사용 용도에 따라 나뉜다.


범주

이름

용도

범용 

레지스터

EAX(Accmulator)

산술연산(함수의 결과값 저장)

EBX(Base Register)

특정 주소 저장

ECX(Count)

반복적 실행되는 특정 명령

EDX(Data)

일반 자료 저장

포인터 

레지스터

EBP(Base Pointer)

스택 내 가장 밑의 주소

ESP(Stack Pointer)

스택 내 가장 위의 주소

EIP(Instruction Pointer)

다음 실행할 명령의 주소

플래그 

레지스터

EFLAGS

연산 결과 및 시스템 상태와 관련된 플래그 값


위의 표는 컴파일러가 컴파일 할 때 주로 사용되는 것이다. 반드시 위의 용도에만 사용해야 하는 것은 아니다. 즉, 일종의 변수로 보는 것이 좋다.


3) 레지스터의 길이

EXA(Extend) : 32bits

AX : 16bits

AL(low), AH(high) : 8bits


2. 스택 (Stack)


1) 개요

스택은 제한적으로 접근할 수 있는 나열 구조이다. 그 접근 방법은 언제나 목록의 끝에서만 일어난다.

스택은 한쪽 끝에서만 자료를 넣거나 뺄 수 있는 선형구조(LIFO - Last In First Out)으로 되어 있다. 자료를 넣는 것을 푸시(Push)라고 하고 반대로 넣어둔 자료를 꺼내는 것을 팝(Pop)이라고 한다. 이때 꺼내지는 자료는 가장 최근에 보관한 자료부터 나오게 된다.

Top(), Empty(), Push(), Pop() 등의 함수로 관리한다.


2) 스택의 용도

- 지역 변수의 저장

- 매개변수 전달

- 임시 데이터 백업

- 함수 호출, 복귀 정보 저장


3) Stack Frame

스택에 저장되는 함수의 호출 정보를 스택 프레임(Stack Frame)이라 하며, 이러한 스택 프레임에는 함수로 전달되는 인수와 함수 실행을 모두 마치면 돌아올 복귀 주소, 지역 변수 등의 정보가 들어간다. 

스택 프레임은 함수에 독립적인 메모리 영역이다.

함수 호출시 생성되고 복귀시 삭제한다.

함수는 Stack Frame을 독립적으로 사용한다.


4) Stack에서 사용되는 레지스터

- ESP : Stack의 가장 위의 주소를 가리킨다.

- EBP : Stack의 가장 밑의 주소를 가리킨다.

프로그램이  Stack안의 값을 참조할 때에는 ESP, EBP에 offset을 더하거나 빼서 참조한다.


5) Prolog & Epilog

Prolog : 함수 호출시 호출 받은 함수가 스택을 독립적으로 사용할 수 있도록 Stack Frame을 생성하는 작업

Epilog : 함수 복귀시 생성한 Stack Frame을 해제하고 함수 호출하기 이전의 Stack Frame을 되돌리는 작업


Posted by Imp3rio

1. 변수


C언어에서의 변수는 숫자의 표현에 관련해서 정수형과 실수형있다. 그리고 자료가 있는 위치값인 메모리 주소값으로 처리하는 포인터 변수가 있다. 이것은 CPU의 메모리 체계와 관련되어 있어 CPU 의존적이다. 


1) 정수형 변수

정수형의 표현은 char, int로 선언한다. char는 8비트(1바이트)로 규정되어 있어 변수의 범위가 결정되지만 int는 CPU와 OS에 의존적이다. 32비트 컴퓨터에서는 32비트(4바이트), 64비트 컴퓨터에서는 64비트(8바이트) 크기를 갖는다.


2) 실수형 변수

실수를 처리하기 위해 float와 double을 사용한다. 실수를 2진수로 표혆ㄹ 때는 부동소수점 방식을 사용한다.


3) 포인터 변수

포인터 변수는 메모리 주소를 저장하기 위한 변수이다.

포인터 변수 A안에 X의 주소가 들어있으면 'A는 X를 가리킨다' 라고 표현한다.


3) 배열

배열은 여러개의 데이터를 저장하기 위해 사용하며, []를 사용한다.

배열의 이름은 포인터이다.


2. 함수


1) 함수의 구조



Posted by Imp3rio