반응형
1. EAX(Accumulator Register)
- 덧셈, 뺄셈 등과 같은 산술 및 논리 연산 결과를 저장
mov eax, 5 ; eax = 5
add eax, 3 ; eax = eax + 3
- 함수의 반환 값도 저장해줌
- 예를 들어 다음과 같은 코드에 각 매개변수에 10, 20의 argument을 주고 결과 값을 반환한다면
int add(int a, int b){
return a+b;
}
- 어셈블리 내부에서는 다음과 같이 표현되며 함수의 실행 결과를 eax에 저장
mov eax, [ebp+8] ; eax = a
add eax, [ebp+12] ; eax = a + b
ret
- 다음과 같이 EAX의 계층 구조를 표로 정의
| 이름 | 크기 | 설명 |
| EAX | 32-bit | 전체 데이터 (예: 숫자 4,294,967,295까지) |
| AX | 16-bit | EAX의 절반 |
| AH | 8-bit | AX의 왼쪽 절반 (High) |
| AL | 8-bit | AX의 오른쪽 절반 (Low), 주로 문자 1개 저장 |
2. EBX(Base Register)
- 메모리 주소의 기준(base), 즉 어떤 메모리 영역의 시작 주소를 의미함
- 기준점 역할을 하며, ebx + offset의 조합으로 정의
mov ebx, array ; array의 base point를 ebx에 저장
mov eax, [ebx+4] ; array[1]
mov ecx, [ebx+8] ; array[2]
- 한 번 정해두고 여러 번 참조하는 기준 주소나 상태값(상수)을 담는 데 사용
3. ECX(Count Register)
- 반복을 수행할 때 사용되는 반복 횟수 따위를 저장
mov ecx, 5 ; ECX 레지스터에 반복 횟수 5를 저장
L1: ; 루프의 시작 지점(라벨)
-- ; 여기에 반복 실행할 코드를 작성
loop L1 ; 1. ECX 값을 1 감소시킴 (ECX = ECX - 1)
; 2. ECX가 0이 아니면 L1으로 점프
; 3. ECX가 0이면 루프 종료 후 다음 줄 실행
- 많은 양의 데이터를 복사하거나 비교할 때도 사용, ex) 복사할 바이트와 크기
mov ecx, 10 ; 10번 반복하겠다고 설정
lea esi, [Source] ; 복사할 원본 데이터 주소
lea edi, [Dest] ; 복사될 목적지 주소
rep movsb ; ECX가 0이 될 때까지 원본(ESI)에서 목적지(EDI)로 바이트씩 복사하고 ECX를 자동으로 감소 시킴
4. EDX(Data Register)
- 데이터 처리를 보조하는 역할을 수행, EAX와 같이 사용됨
- EDX는 나눗셈 연산에서 다음과 같이 나머지 값을 저장함, 나눗셈을 나누기 전에는 EDX를 0으로 초기화해야함
mov eax, 10 ; 피제수(나눌 수)의 하위 32비트 설정
mov edx, 0 ; 피제수의 상위 32비트(EDX)를 0으로 초기화 (매우 중요!)
mov ebx, 3 ; 제수(나누는 수)를 EBX에 저장
div ebx ; EAX를 EBX로 나눔 (10 / 3)
; [결과]
; EAX = 3 (몫)
; EDX = 1 (나머지) -> EDX에 나머지가 저장됨!
5. ESI(Source Index), EDI(Destination Index)
- 각각 데이터를 옮기거나 비교할 때 데이터의 시작 지점을 가르키는 용도와 데이터의 목적 지점을 가르키는 용도로 사용
- 문자열 처리 명령어(MOVS, LODS, CMPS)에서 필수적으로 사용
- 배열과 같은 연속된 데이터를 다룰 때, 배열의 시작 주소를 ESI에 넣고 인덱스를 더해가며 접근하는 방식
- 다음은 메모리에 저장된 문자열을 한 글자씩 읽어올 때 사용하는 코드
section .data
msg db "Hello", 0
section .text
lea esi, [msg] ; 'msg'의 시작 주소를 ESI에 저장 (Source)
load_char:
lodsb ; ESI가 가리키는 곳에서 1바이트를 읽어 al에 넣음
; ESI는 자동으로 1 증가
test al, al ; 문자가 0(NULL)인지 확인
jz done ; 0이면 종료
; (여기서 AL에 담긴 문자를 화면에 출력하는 코드 실행)
jmp load_char ; 다음 문자 반복
done:
6. EBP(Base Pointer), ESP(Stack Pointer)
- 각각 스택 프레임의 기준점, 스택 프레임의 현재 지점을 가리킴
- 즉 함수만의 독립적인 메모리 공간을 관리하는 데 필수적인 레지스터들
- 만약 다음과 같은 함수가 있다고 과정했을 때,
int func(int a, int b)
- 해당 함수의 지역 변수 a, b는 다음 과정을 통해 저장됨
push ebp ; 이전 함수의 기준점(EBP)을 스택 메모리에 안전하게 보관
mov ebp, esp ; 새로운 기준점(EBP)에 현재의 ESP(스택 꼭대기)을 설정
sub esp, 8 ; ESP를 아래로 밀어서 지역 변수 2개(8바이트)를 위한 공간 확보
mov [ebp-4], 10 ; EBP 기준 첫 번째 지역 변수에 10 저장
mov [ebp-8], 20 ; EBP 기준 두 번째 지역 변수에 20 저장
push 100 ; 임시 계산을 위해 값을 스택에 넣음 (ESP가 자동으로 바뀜)
mov esp, ebp ; ESP를 EBP 위치로 끌어올림 (지역 변수 공간 싹 비우기)
pop ebp ; 스택에 보관했던 '이전 함수의 EBP'를 복구
ret ; 함수 종료 및 복귀
반응형
'IT Dictionary > Computer Science' 카테고리의 다른 글
| 레지스터 설명 (0) | 2026.02.02 |
|---|---|
| git error: remote unpack failed: unable to create temporary object directory 오류 (0) | 2023.05.16 |
| 리눅스(Linux) 터미널 필수 명령어 정리 (1) | 2023.05.06 |
| 리엑트(React) 설명 (2) | 2023.05.02 |
| 카페24(Cafe24) react, nodejs 빌드, 배포, 호스팅 하기 (10) | 2023.05.01 |