728x90
반응형
mov
mov | operand 1 | operand 2 |
mov | eax | 1 |
eax 레지스터에 값 1을 넣는 코드
- operand2를 operand1로 이동한다
- operand1 : 레지스터 or 메모리 (상수는 불가능함)
- operand2 : 상수 or 레지스터 or 메모리
- 두 피연산자의 크기가 일치해야함
- 두 피연산자에 동시에 메모리가 올 수 없음
메모리는 TYPE PTR [레지스터 or 상수]로 표기하는데, TYPE에는 BYTE(1), WORD(2), DWORD(4) QWORD(8)이 올 수 있다.
*mov는 "값"과 연관이 있다고 생각하면 쉬워짐
Example
mov rax, 0x1 : rax 레지스터에 0x1을 대입한다
mov rax, rbx : rbx 레지스터의 값을 레지스터에 대입한다
mov QWORD PTR [0x400000], rax : rax 레지스터의 값을 0x40000에 대입한다.
mov QWORD PTR [rcx+8], rax : rax레지스터의 값을 rcx+8 주소에 대입한다.
mov al, BYTE PTR [0x400000] : 0x400000이 가리키는 주소의 1바이트만큼 레지스터 al에 대입한다.
lea
lea | operand 1 | operand 2 |
lea | eax | DWORD PTR [eax] |
eax 레지스터의 "값"에 eax의 "주소"를 넣는다
- operand2의 주소를 operand1로 이동한다
- operand1 : 레지스터
- operand2 : 메모리
- 주소를 연산해서 가져올 수 있음
- operand2의 유효주소 (Effective address)를 저장하여 사용
*lea는 "주소"와 연관이 있다고 생각하면 쉬워짐
mov vs lea
mov는 주소에 있는 값을 옮기고 lea는 주소 자체를 옮긴다
- mov eax, ebx+ecx : 성립하지 않는 문법
- mov eax, DWORD PTR [ebx + ecx]
- lea eax, DWORD PTR [ebx + ecx]
이 두개는 완전 다른 의미를 가진다.
mov eax, DWORD PTR [ebx + ecx] | lea eax, DWORD PTR [ebx + ecx] |
1. ebx의 값 + ecx의 값을 연산함 2. 메모리에서 그 주소에 대응하는 값을 읽음 3. 그 값을 eax에 저장 |
1. ebx의 값 + ecx의 값을 연산함 2. eax에 ebx + ecx 값 자체를 대입함 *이 때 ebx+ecx의 값은 메모리에 대응한다. |
해당 내용을 통해 보면
mov rax, [rbx+8]을 실행한 후, rax에 저장되어 있는 값은
0xC0FFEE이다
lea rax, [rbx+8]을 실행한 후, rax에 저장되어 있는 값은
0x401A48이다
728x90
반응형
'CS > Computer Architecture' 카테고리의 다른 글
[Assembly] 산술 연산 (0) | 2024.09.27 |
---|---|
Static Link vs Dynamic Link (0) | 2024.09.05 |
함수의 프롤로그 & 에필로그 (0) | 2024.08.22 |
Register (0) | 2024.08.16 |
[Assembly] Intel vs AT&T (2) | 2024.08.14 |