Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
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 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

abcdef

어셈블리어 - 범용레지스터 본문

IT 독학/어셈블리어

어셈블리어 - 범용레지스터

whistle.l 2018. 7. 30. 21:20

1)    어셈블리어란?


프로그래밍 언어의 하나기계어에서 한 단계 위의 언어이며 기계어와 함께 단 둘뿐인 로우레벨(Low Level) 언어에 속한다.
기계어라는 게 컴퓨터 관점에서 바로 읽을 수 있다는 것 빼고는 인간의 관점에서는 사용이 불편한 언어이기 때문에 이를 보완하기 위해 나온 것이 어셈블리어다. 따라서 어셈블리어의 특징은 기계어 1라인당 어셈블리 명령어가 대부분 1라인씩 대응되어 있고 이를 비교적 간단하게 짤 수 있는 어셈블러를 통해 기계어로 변환되도록 한 것이다. 이 때문에 어셈블리어는 고급 언어와 기계어 사이에 있다 하여 '중간 언어'라고도 불린다.

 

 

명령어

설명

PUSHAD

8개의 범용 레지스터의 값을 Stack에 저장하는 명령어

POPAD

PUSHAD 명령에 의해서 Stack애 저장된 값을 다시 각 레지스터에 입력한다.

PUSH A

A Stack에 넣는다.

POP 레지스터

Stack에서 값을 꺼내 레지스터에 넣는다.

INC A

A의 값을 1 증가시킨다.

DEC A

A의 값을 1 감소시킨다.

DIV ECX

EAX/ECX 연산을 수행하여 몫을 EAX 레지스터에 저장한다.

REP ECX

레지스터를 카운터로 사용해서 문자열 관련 명령을 ECX>0인 동안 반복한다. 한번 진행될 때 마다 ECX 레지스터 값이 -1된다.

 

 

 

명령어

설명

ADD A B

A의 내용에 B의 내용을 더해서 그 결과를 A에 저장한다.

SUB A B

A에서 B를 빼고 그 결과를 A에 저장한다.

IML A B

A B를 곱하고 그 결과를 A에 저장한다.

LEA A B

A의 값을 B의 값으로 만든다.(레지스터에서 주로 사용한다.)

MOVE A B

B의 값을 A로 복사한다.

TEST A B

A B AND 연산한다. (연산 결과 값이 A에 저장되지 않지만 ZF플래그를 설정에 영향을 준다. 연산 결과가 0이면 ZF 1이 되고 연산 결과가 0이 아니면 ZF 0이 된다.)

AND A B

A B AND 연산한다. (연산 결과 값은 A에 저장되고 ZF플래그를 설정에 영향을 준다. 연산 결과가 0이면 ZF 1이 되고 연산 결과가 0이 아니면 ZF 0이 된다.)

CMP A B

비교구문으로 A B의 값이 같은지 판단한다. (같을 경우 ZF 1이 되고 다를 경우 ZF 0이 된다.)

XCHG A B

A에 있는 값과 B에 있는 값을 바꾼다.

 

 

명령어

설명

JMP Address

해당 주소로 무조건 이동한다.

JZ(Jump if Zero)  Address

계산결과가 0이면(ZF=1) 이동하고 아니면(ZF=0) 다음 명령을 실행한다.

ZE(Jump if Equal) Address

JNZ(Jump if Not Zero)  Address

계산결과가 0이 아니면(ZF=0) 이동하고 0이면(ZF=1) 다음 명령을 실행한다.

JNE(Jump if Not Equal)  Address

JNB(Jump on Not Below)  Address

계산결과가 크거나 같으면 이동한다.

JAE(Jump on Above or Equal) Address

 

 

명령어

설명

MOVE DWORD PTR DS:[Address], EAX

Address부터 4Byte의 크기를 EAX 값으로 채우라는 의미다.

STOS Byte PTR ES: [EDI]

EAX에 들어있는 데이터를 지정한 크기(Byte, Word, Dword)만큼 복사한다. EDI는 복사된 만큼 이동한다.

Lods Byte PTR ES: [ESI]

ESI가 가리키는 곳에서 지정한 크기(Byte, Word, Dword)만큼 읽어와 EAX에 복사한다. ESI는 복사한 만큼 이동한다.

 

 

2)   어셈블리어 장단점


장점 :

   프로세서를 직접 제어할 수 있다.(레지스터, I/O에 접근)

   동작을 하나하나를 정확하게 제어할 수 있다.

   효율적이고 최적화된 코드를 작성할 수 있다.

   고수준의 언어들로는 구현할 수 없는 부분까지 구현할 수 있다.

   어셈블리 언어를 통해 최적화된 소스는 가장 빠르고, 용량도 적다.


단점 :

    프로그램 자체를 작성하기에는 복잡하다.

    만약 코딩을 재계획 하는 경우, 코드 전체를 수정해야 한다.

    다른 아키텍쳐나 프로세서로의 이석성이 부족하다.

 

3)  범용레지스터란?


※레지스터 : CPU내부에 존재하는 다목적 저장 공간이다.

CPU와 한 몸이기 때문에 고속으로 데이터를 처리할 수 있다. 종류로는 범용레지스터, 세그먼트 레지스터, 상태 플래그 레지스터, 명령 포인터 레지스터로 구성되어있다.

말 그대로 범용적으로 사용되는 레지스터들이다. lA-32에서 각 범용 레지스터들의 크기는 32비트이다.


4)  범용레지스터 종류 및 특징


범용레지스터는 EAX, EBX, ECX, EDX, ESI, EDI, ESP, EBP로 구성되어 있다.


EAX (Extended Accumulator Register)

산술연산 명령에서 상수/변수 값을 저장하거나 함수의 리턴 값이 저장되는 용도로도 사용된다.


EBX (Extended Base Register)

EBX DS 세그먼트에 대한 포인터를 주로 저장하고 ESI EDI와 결합하여 인덱스에 사용된다. EBX는 메모리 주소 지정을 확장하기 위해 인덱스로 사용될 수 있는 유일한 범용 레지스터이다.

 

ECX (Extended Counter Register)

반복 명령어 사용 시 반복 카운터로 사용된다. ECX 레지스터에 반복할 횟수를 지정해 놓고 반복 작업을 수행하게 된다.


EDX (Extended Data Register)

데이터 레지스터이다. 입출력 포인터 값을 저장할 때 사용한다.


ESI (Extended Source Index)

데이터 복사나 조작 시 Source Data 의 주소가 저장된다. ESI 레지스터가 가리키는 주소의 데이터를 EDI 레지스터가 가리키는 주소로 복사하는 용도로 많이 사용된다.


EDI (Extended Destination Index)

복사 작업 시 Destination의 주소가 저장된다. 주로 ESI 레지스터가 가리키는 주소의 데이터가 복사된다.


ESP (Extended Stack Pointer)

하나의 스택 프레임의 끝 지점 주소가 저장된다. PUSH, POP 명령어에 따라서 ESP값이 4Byte씩 변한다.


EBP (Extended Base Pointer)

하나의 스택 프레임의 시작 지점 주소가 저장된다. 현재 사용되는 스택 프레임이 소멸되지 않는 동안 EBP의 값은 변하지 않는다. 현재의 스택 프레임이 소멸되면 이전에 사용되던 스택 프레임을 가리키게 된다.


32bit 레지스터의 특징으로는 범용 레지스터는 이름 첫 글자가 ‘E’ 인 것을 있다. ‘확장되었다(Extended)’는 의미로 32bit 컴퓨터 환경이 되면서 16bit 레지스터인 AX, BX, CX, DX 등의 레지스터를 32bit, 16bit, 8bit로 사용할 수 있다. EAX 레지스터를 예로 들면 32bit EAX, 16bit AX, 8bit AH, AL로 사용할 수 있다.



상위 8비트는 HIGH라서 ‘H’가 붙고 하위 8비트는 Low라서 ‘L’이 붙는다고 생각하면 외우기 쉽다. ESI, EDI, EBP, ESP 레지스터는 32bit, 16bit로 사용이 가능하다.