본문 바로가기

Domain/시스템 프로그래밍

6. IA Assembly Programming

Assembly Language

 언어 계층 구조적인 관점에서 고급 언어와 기계어 사이에 있는 언어이다. 기계어의 Symbolic한 표현이다.

 

 -사용 영역 : 하드웨어 제어, 취약성 테스트, 최적화, SW 저작권 보호, SW 유사성 분석, 프로그램 제작, 디버깅, 분석 등

 

 

ISA(Instruction Set Architecture)

  • Register model
  • Memory model
  • Instruction model

 

Register Model

 register는 cpu 내부의 소형 메모리 공간이며 메인 메모리에 비해 접근이 빠르다는 이점이 있다.

 

 

 1. General Purpose Register

  특별한 용도로  사용될 수 있지만 다른 범용적인 용도로도 사용되는 레지스터

  • EAX(accumulator) : 산술연산
  • EBX(base) : Data segment의 데이터를 가리킴
  • ESP(stack pointer) : 스택의 top을 가리킨다.
  • EBP(base pointer) : 스택 프레임의 어느 한 부분을 가리킨다.
  • 그 외, ECX, EDX, ESI, EDI

 

2. Segment Register

  가상 메모리가 실제 물리 메모리에 위치하는데 해당 주소를 저장한다.

  • CS(Code segment) : 연산 가능한 명령어의 기본 위치
  • DS(Data segment) : 변수의 기본 위치
  • SS(Stack segment) : 스택의 기본 위치
  • ES(Extra segment) : 변수를 위한 추가적인 기본 위치

 

3. EIP(Instruction Pointer)

  PC의 역할을 하는 레지스터

 

 

4. EFLAGS 

 현재 CPU의 상태 및 제어를 위한 레지스터

  • Carry Flag : 연산의 결과로 carry의 발생 여부를 확인한다.
  • Overflow Flag : 연산의 결과로 오버플로우가 발생했는지 확인한다.
  • Zero Flag : 연산의 결과로 0이 되었는지 확인한다.
  • Sign Flag : 연산의 결과로 음수가 되었는지 확인한다.
  • Parity Flag : 오류 검출 여부를 확인한다.
  • I/O Previelge Level : 2bit로 4가지 특권을 나타낸다.

 

Memory Model

  • Segmentation : 크기가 가변적이다. 소프트웨어적으로 이점이 있다.
  • Paging : 크기가 1개의 디스크 블록(4KB)으로 고정적이다. 하드웨어적인 이점이 있다.

 

segmentation과 paging의 매핑. 회색 부분은 다른 프로세스가 사용중인 물리 주소이다.

 

 

Instruction Model

 Instruction format

  • Label : 첫번째로 위치하며 :(콜론) 앞에 위치한다. 없을 수도 있다.
  • Opcode : label 다음에 오며 실제 명렁어 부분에 해당한다.
  • Operand : 명령어에 사용될 인자들로 0-3개까지 허용된다.
//Instruction Format Example
Here: movl 0x80492333, %eax
      addl 0x80294939, %eax

 

 Operand의 종류

  • 리터럴(상수) : $
  • 레지스터 : %
  • 메모리 : Alphanumeric

 

 Instrution Detail

  1. Data Transfer Instruction

 

 2. Arithmetic Instruction

mull 명령어의 경우 operand를 %eax 레지스터와 곱하게 된다. 4byte영역을 넘어가므로 edx:eax의 형태로 저장한다.

 특이점1. load-store architecture

 우측의 경우 subl 명령어에서 불러오는 작업과 뺄셈 연산을 동시에 해야하는데 한 명령어에서 두개의 일을 처리할 경우 병렬 처리에 문제가 생긴다. 따라서 가능한 경우 좌측의 방식으로 레지스터들 끼리의 산술 연산이 되게 프로그래밍 한다.

 

 특이점2. 곱셈 연산

 

3. Control Transfer Instruction(if)

cmpl의 연산 결과는 저장하지 않고 EFLAGS가 바뀌게 된다. 이에 해당하는 변화로 조건문에 따라 분기하게 된다.

 

4. Control Transfer Instruction(for)

 

 

Stack Frame의 구조

 

 

실제 예제

 func1이 호출되었을 경우 순서도
  1. (pushl) ESP를 감소시키고 222를 저장. (pushl) ESP를 감소시키고 111을 저장.  func1을 실행. EIP는 addl $8, %esp를 가리킨다.

  2. ESP를 감소시키고 Return Address를 저장한다. 스택 포인터를 감소시키고 ebp를 저장한다.

  3. esp가 ebp를 가리킨다. 그 다음 명령어에 의에 esp는 지역변수 b를 가리킨다.

  4. 지역변수 a에 777을 저장한다. 12(%ebp)에 해당하는 222를 eax에 저장한다.

  5. 8(%ebp)에 해당하는 111과 eax에 저장된 222를 더하여 eax에 저장한다.

  6. eax의 값을 b에 저장한다. b의 저장된 값을 eax에 저장한다. (리턴 값은 항상 eax레지스터에 저장된다.)

  7. EIP가 가리키던 aadl $8, %esp를 수행하여 caller's frame을 제거한다.

  8. mobl %eax, g에 의해 리턴 값을 메인함수의 전역변수 g에 전달한다.

 

 directice

  Meta-statement로 어셈블러에게 정보를 주기 위해 사용된다.

 

 

 Software Interrupt

  system call을사용하기 위해 필요하다.

 

 

Library와 System call의 차이점

  Library System call
mode Uers mode Kernel mode
호출 방식 스택을 이용 레지스터를 이용
호출 명령어 call int
속도 빠르다 느리다

'Domain > 시스템 프로그래밍' 카테고리의 다른 글

4. Process Structure  (0) 2020.03.14
5. Task Programming  (0) 2020.03.14
7. IA : History & Features  (0) 2020.03.14
8. Optimization  (0) 2020.03.14
9. Assembler  (0) 2020.03.14