mov 명령어는 어셈블리어에서 가장 기본적이고 중요한 명령어 중 하나로, 데이터를 한 위치에서 다른 위치로 복사하는 데 사용됩니다. mov 명령어는 레지스터, 메모리, 상수 간의 데이터를 이동시킬 수 있습니다. 여기서는 x86 아키텍처를 중심으로 mov 명령어의 다양한 사용법을 설명하겠습니다.
mov 명령어 형식mov destination, source
mov eax, ebx ; EBX 레지스터의 값을 EAX 레지스터로 이동
mov ecx, edx ; EDX 레지스터의 값을 ECX 레지스터로 이동
mov eax, 10 ; 10이라는 상수를 EAX 레지스터에 이동
mov ebx, 0xFF ; 0xFF(16진수 255)를 EBX 레지스터에 이동
mov eax, [myVar] ; 메모리 위치 myVar의 값을 EAX 레지스터로 이동
mov ebx, [esp] ; 스택 포인터가 가리키는 메모리 위치의 값을 EBX 레지스터로 이동
mov [myVar], eax ; EAX 레지스터의 값을 메모리 위치 myVar로 이동
mov [esp], ebx ; EBX 레지스터의 값을 스택 포인터가 가리키는 메모리 위치로 이동
mov [myVar], 10 ; 10이라는 상수를 메모리 위치 myVar로 이동
mov 명령어는 다양한 메모리 주소 지정 모드를 지원합니다.
mov eax, [0x00403000] ; 메모리 주소 0x00403000의 값을 EAX 레지스터로 이동
mov eax, [ebx] ; EBX 레지스터가 가리키는 메모리 위치의 값을 EAX 레지스터로 이동
mov eax, [ebx+4] ; EBX 레지스터의 값에 4를 더한 메모리 위치의 값을 EAX 레지스터로 이동
mov eax, [ebx+esi*4] ; EBX 레지스터의 값에 ESI 레지스터의 값을 4배한 값을 더한 메모리 위치의 값을 EAX 레지스터로 이동
mov 명령어는 32비트 레지스터뿐만 아니라 16비트와 8비트 레지스터에도 사용할 수 있습니다.
mov ax, bx ; BX 레지스터의 값을 AX 레지스터로 이동
mov [myVar], ax ; AX 레지스터의 값을 메모리 위치 myVar로 이동
mov al, bl ; BL 레지스터의 값을 AL 레지스터로 이동
mov [myVar], al ; AL 레지스터의 값을 메모리 위치 myVar로 이동
다음은 간단한 어셈블리어 프로그램으로, mov 명령어를 사용하여 두 숫자를 더하는 예제입니다.
section .data
num1 dd 10 ; 32비트 정수 10
num2 dd 20 ; 32비트 정수 20
result dd 0 ; 결과를 저장할 32비트 정수
section .text
global _start
_start:
mov eax, [num1] ; num1의 값을 EAX 레지스터로 이동
mov ebx, [num2] ; num2의 값을 EBX 레지스터로 이동
add eax, ebx ; EAX에 EBX의 값을 더함
mov [result], eax ; 결과를 메모리 위치 result로 이동
; 프로그램 종료를 위해 exit 시스템 호출
mov eax, 1 ; 시스템 호출 번호 (sys_exit)
xor ebx, ebx ; 종료 코드 0
int 0x80 ; 시스템 호출 인터럽트
이 프로그램은 num1과 num2의 값을 더하고, 결과를 result에 저장합니다.
mov 명령어는 데이터를 한 위치에서 다른 위치로 복사합니다.mov 명령어를 잘 이해하고 활용하면 어셈블리어 프로그래밍에서 매우 유용한 도구가 됩니다.