Notice
Recent Posts
05-06 01:42
«   2024/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
Today
Total
관리 메뉴

프로그래밍 잡화점

0 - 1. 기본적인 Assembly 개념 - 레지스터 본문

Assembly

0 - 1. 기본적인 Assembly 개념 - 레지스터

Luana7 2022. 9. 25. 12:40

어셈블리를 통한 C 컴파일러의 해석 구조를 알아보자.

기본적인 분석을 위해 알아야 할 기본 지식들을 알아보고 가보자.

들어가기 앞서 문법은 nasm, intel을 사용하며, arm은 다루지 않을 예정입니다.
(arm은 intel이랑 문법이 다르며 구조도 좀 달라 intel과 함께 포스팅하기 어렵습니다)

 


레지스터란?

아주 작은 메모리 공간인데, cpu와 붙어 있어 매우 빠른 속도로 동작이 가능하다.

레지스터의 종류는 이 블로그를 참고해보자


범용 레지스터


주로 값 이동과 반환 값을 갖는 레지스터(AX, BX, CX, DX)는 특이한 성질이 있다
AL, AH, AX, EAX, RAX로 5가지 종류가 존재하는데
이들은 각각 큰 레지스터를 공유하여 사용한다.

  • AL과 AH는 각각 8비트, 즉 1바이트의 크기이다
  • AL:AH로 표기하며 이 둘을 이어 붙인 공간으로 AX(16비트 = 2바이트)와 크기가 같다
  • EAX는 32비트, 즉 4바이트의 크기이다.
  • RAX는 64비트, 즉 8바이트의 크기이다.
  • AL값이 1로 셋팅되면 EAX의 하위 1바이트도 1로 셋팅되는 셈이다.
  • 그러나 AL의 값을 바꾼다고 EAX의 나머지 비트가 초기화 되는 것은 아니다.

예를 들어 EAX가 다음과 같을때

eax = 0110 0000 1010 1101 1111 1100 0001 0001

AL를 1로 설정하게 되면

al = 0000 0001

AL 부분에 해당하는 부분만 변경된다

eax = 0110 0000 1010 1101 1111 1100 0000 0001


RAX의 경우 32비트 운영체제에선 사용할 수 없다. (32bit로 컴파일 하는 경우도 해당)
이는 32비트 cpu가 rax 레지스터를 포함하지 않아서이다.

이와 동일하게 16비트 컴퓨터에는 eax가 없는데 대부분의 컴퓨터는 32비트/64비트 cpu를 사용하는 경우가 많으므로 rax의 사용 여부만 확인하여도 충분하다.

(* 보통 32bit는 앞에 붙는 e는 extended를 의미하고, 64bit는 앞에 붙는 r은 register를 의미한다.)

그 다음으로 알아볼 것은 포인터 레지스터이다.

포인터 레지스터에는 3종류가 존재한다.

  • (e/r)sp는 stack pointer의 약자로 스택의 끝을 가리키는 레지스터이다.
  • (e/r)bp는 base pointer의 약자로 스택의 시작점을 가리키는 레지스터이다.
  • (e/r)ip는 다음 실행 명령어를 기록하는 포인터이다. 이 포인터의 값을 변경하여 label 없이 jmp를 할 수 있게 된다.

플래그 레지스터

연산 결과에 따라 바뀌는 레지스터이다. 위에 글을 읽어보고 자세한건 후에 cmp와 jmp 명령어에 관련해 설명할 때 자세히 설명할 것이다.



다음 포스팅에선 기본 명령어를 알아볼려고 한다.

Comments