오퍼랜드 앞에 크기 지정자가 옴. ABC PTR [~~~]
BYTE
: 1바이트WORD
: 2바이트 (16비트) 워드DWORD
: 4바이트 (32비트) 더블 워드QWORD
: 8바이트 (64비트) 쿼드 워드QWORD PTR [0x8048000]
// 데이터 0x8048000을 8바이트만큼 참조
DWORD PTR [0x8048000]
// 데이터 0x8048000을 4바이트만큼 참조
WORD PTR [rax]
// rax가 가르키는 주소에서 데이터를 2바이트만큼 참조
어떤 값을 레지스터나 메모리에 옮기도록(대입하도록) 지시
B에 들어있는 값을 A에 대입
mov rdi, rsi
// rsi의 값을 rdi값에 대입
mov QWORD PTR[rdi], rsi
// rsi의 값을 rdi가 가리키는 주소에 대입
mov QWORD PTR[rdi+8*rcx], rsi
// rsi의 값을 rdi+8*rcx가 가리키는 주소에 대입
mov
와 lea
의 차이점은 유효 주소를 저장하냐, 메모리의 값을 직접 저장하냐의 차이lea rsi, [rbx+8*rcx]
// rbx+8*rcx 를 rsi에 대입
덧셈,뺄셈,곱셈,나눗셈을 하고 inc
나 dec
로 값을 1 증가시키거나 1 감소시킨다.
A에 B의 값을 더한다. 이때, A의 값은 A+B로 바뀐다.
add eax, 3
// eax += 3
add ax, WORD PTR[rdi]
// ax += *(WORD *)rdi
A에서 B의 값을 뺀다. 이때 A값은 A-B로 바뀐다.
sub eax, 3
// eax -= 3
sub ax, WORD PTR[rdi]
// ax -= *(WORD *)rdi
A의 값을 1 증가시킴
inc eax
// eax += 1
A의 값을 1 감소시킴
dec eax
// eax -= 1
레지스터, 메모리 및 코드가 다음과 같을 때, 아래에서 적절한 값을 채우시오.
[Register]
rax = 0x31337
rbx = 0x555555554000
rcx = 0x2
=================================
[Memory]
0x555555554000| 0x0000000000000000
0x555555554008| 0x0000000000000001
0x555555554010| 0x0000000000000003
0x555555554018| 0x0000000000000005
0x555555554020| 0x000000000003133A
==================================
[Code]
1: add rax, [rbx+rcx*8]
2: add rcx, 2
3: sub rax, [rbx+rcx*8]
4: inc rax
rax
에 저장된 값은 0x3133A
이다.rax
의 값은 rbx+0x10(0x555555554010)
에 저장된 0x3
만큼 증가합니다.rax
에 저장된 값은 0
이다.rax
의 값은 rbx+0x20
에 저장된 0x3133A
만큼 감소합니다.rax
에 저장된 값은 1
이다.rax
의 값은 1
증가합니다.