컴퓨터 구조

어셈블리어 기초 (Basic of Assembly)

chan4 2023. 6. 11. 17:05

해당 블로그의 내용은 학교에서 배운 내용을 개인적으로 정리한 내용이므로, 잘못된 부분이 있을 수도 있습니다. 

 

 

어셈블리

  • 기계어에 1 : 1 대응관계를 갖는 명령어로 이루어진 low-level 프로그래밍 언어
  • CPU, 레지스터, 메모리 사이에 데이터를 조작
  • C의 기준
    • 어셈블리 언어의 함수는 CPU에 내장
    • 어셈블리 언어로 프로그래밍 = CPU의 함수만을 사용하여 구현
  • 어셈블러(Assembler)
    • 어셈블리 컴파일러 
    • 어셈블리 >> 기계어(binary)
  • 링커(Linker)
    • 필요한 라이브러리를 Low-level 함수로 결합하는 모듈
  • 최종 실행파일
    • 기계어(Binary) + 라이브러리
  • 고급 언어에 비해 규칙이 매우 단순
    • 반복적인 부분이 많음
    • 편의를 위해 매크로가 존재 (각 매크로마다 다름)
    • 서로 다른 어셈블러는 호환성 문제가 존재
  • 어셈블러 종류
    • MASM: 윈도우
    • GAS: 리눅스/유닉스 계열
    • NASM: 윈도우, 리눅스/유닉스 계열(MAC 포함)에서 공통으로 동작

어셈블리 언어 표기법

  • 인텔 표기법
    • 윈도우 운영체제 기반에서 사용
    • 거의 대소문자 구분 없음
      • ex. MOV = mov
  • AT&T 표기법
    • 리눅스/유닉스 계열 사용
    • ex. mov $4, %eax

숫자 표기법

  • 16진수 표기를 활용하여 숫자 표기
    • 8bit (1byte) : 0x00
    • 16bit (2byte) : 0x01234
    • 32bit (4byte) : 0x12345678
  • 최근 컴퓨터는 기본 데이터 처리 단위가 64bit

어셈블리 언어 기본지원

  • 메모리(RAM)
    • 프로그램의 명령어를 저장
  • CPU
    • 메모리의 명령어를 1개씩 가져와서 해독 후 수행
  • 레지스터
    • 명령 해석 및 수행 시 필요한 임시 작업 공간
    • C언어에서 보면 아주 속도가 빠른 임시 저장소
  • 어셈블리 프로그램 작성
    • 데이터 이동, 각종 연산, 실행흐름 제어

레지스터

  • 알고리즘 구현 시 사용할 수 있는 특수한 변수
  • 레지스터의 크기는 설치된 운영체제마다 다름

범용 레지스터

  • 작은 데이터의 임시 저장 공간
  • 연산 처리 및 번지 지정을 도움
  • 컴퓨터의 장치 제어
  • 모든 범용 레지스터들은 32bit를 가짐

EAX (Extended Accumulator Register)

  • 산술, 논리 연산 수행
    • 함수 반환 값이 EAX 레지스터에 저장
  • Int, Float 값 등 저장 가능

EBX (Extended Base Register)

  • 메모리 주소를 저장하기 위한 용도
  • Int, Float 값 등 저장 가능

ECX (Extended Counter Register)

  • 반복 명령어 사용 시 반복 카운터로 사용
  • ECX 레지스터에 반복횟수 지정하고, 반복 작업을 할 때 쓰임
  • Int 값만 저장 가능

EDX (Extended Data Register)

  • EAX 레지스터와 같이 쓰임
  • 부호 확장 명령
  • 큰 수의 곱셉/나눗셈 연산

ESI (Extended Source Index) / EDI (Destination Index)

  • ESI
    • 데이터 조작 및 복사할 때 데이터의 주소가 저장됨
  • EDI
    • 복사할 때 목적지의 주소가 저장됨

ESP (Extended Stack Pointer) / EBP (Extended Base Pointer)

  • ESP
    • Stack의 끝 지점 주소를 가리킴
  • EBP
    • Stack의 첫 시작 주소를 가리킴

레지스터 데이터 복사 및 초기화

  • mov

메모리와 변수

  • 메모리의 크기를 결정
  • 사용할 메모리의 위치를 결정
  • 메모리에서 사용할 주소를 사전에 아는 것은 불가능
    • 심벌로 결정
    • 어셈블러가 binary로 변경할 때 결정
      • 심벌은 상위 언어에서 변수라는 표현을 사용 
      • 변수는 메모리의 시작 주소와 사용되는 메모리 크기를 의미 

변수 선언 및 사용

  •  

mov 명령어

레지스터 및 메모리 값 출력

  •  

문자열 선언 및 출력

  • PRINT_STRING 

입력 매크로

 

더하기 연산

 

빼기 연산

 

Shift 연산

 

논리 연산

 

1byte 곱하기 연산

 

2byte 곱하기 연산

 

1byte 나누기 연산

 

2byte 나누기 연산

 

곱하기/나누기가 복잡한 이유

 

플래그 레지스터

 

라벨

 

IF문

 

반복문

 

for문

  •  

while문

 

1 증가 및 감소 명령어

 

배열 선언과 메모리 구조

  •