컴퓨터 구조
어셈블리어 기초 (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 증가 및 감소 명령어
배열 선언과 메모리 구조