4.2.3) mov 명령
mov 명령을 다음과 같이 설명할 수 있다.
mov: copy value from source to destination |
mov reg, reg reg, mem reg, imm mem, reg mem, imm |
첫 줄에는 mov 명령에 대한 설명이 적혀있다. mov 명령을 포함한 NASM의 대부분의 연상 기호는 첫 번째 피연산자가 목적지(destination), 두 번째 피연산자가 근원지(source)가 된다.
다음 칸을 보면 mov 명령에 대해 가능한 피연산자의 목록을 확인할 수 있다.
- reg, reg: 근원지로 레지스터, 목적지로 레지스터가 옵니다.
- reg, mem: 근원지로 메모리, 목적지로 레지스터가 옵니다.
- reg, imm: 근원지로 즉시 값, 목적지로 레지스터가 옵니다.
- mem, reg: 근원지로 레지스터, 목적지로 메모리가 옵니다.
- mem, imm: 근원지로 즉시 값, 목적지로 메모리가 옵니다.
여기서 중요한 내용이 있다. NASM에서는 한 번에 두 군데 이상의 메모리를 참조할 수 없다. 무슨 말이냐면, mov와 같은 명령의 피연산자로 근원지도 메모리, 목적지도 메모리가 올 수는 없다는 말이다. 따라서 어떤 메모리에 저장된 값을 다른 메모리로 복사하기 위해서는 레지스터에 먼저 보관하는 과정을 거쳐야만 한다.
다음은 mov 명령에 대한 예제이다.
mov.asm |
%include 'handy/handy.inc'
segment .text global _main
_main: push ebp mov ebp, esp
mov esi, 10 ; mov r32, imm (3) call print_int ; 정수 출력; esi = 출력할 정수 call print_newline ; 개행 문자를 콘솔에 출력합니다.
mov eax, 20 ; mov r32, imm (3) mov esi, eax ; mov r32, r32 (1) call print_int ; esi의 값인 10을 출력합니다. call print_newline
mov eax, 0 mov esp, ebp pop ebp ret |
r32와 같은 기호를 써서 당황한 분이 있을 것이다. 실제론 간단한데, r32라고 하면 32bit 레지스터를 의미하는 것이다. 마찬가지로, m32라고 하면 32bit 메모리를 의미하는 것이다.
이 예제를 완전히 이해했다면 다음 절로 넘어가자. 메모리를 다루는 방법은 좀 더 나중에 배운다.