
1) mov rax, [rbx+8]
mov의 경우, operand1에 operand2의 결과를 대입한다.
: rbx+8 = 401A40+8 = 401A48
: 401A48 = 0x00...0COFFEE
즉, rbp+8 값을 rax에 대입하므로 rax의 값은 0x00COFFEE가 된다

2) lea rax, [rbx+8]
: rbx+8 = 401A40+8 = 401A48
lea의 경우, operand1에 operand2의 주소를 대입한다.
즉, rbx+8의 주소를 rax에 대입하므로 rax의 값은 0x401A48이 된다

3) add rax, [rbx+rcx*8]
: rbx+rcx*8 = 0x555555554010 = 0x3
: (전) rax : 0x31337
add의 경우, operand1과 operand 2의 합연산 이후의 값이므로
rax는 0x3+0x31337의 결과로 0x31340이 된다

4)
1- rax = 0x3133A
2 - rcx = 0x4
3 - sub rax, [rbx+rcx*8]
: rbx+rcx8 = 0x555555554000+0x48 = 0x555555554020 = 0x3133A
sub의 경우, operand1과 operand2의 뺄셈 연산을 통한 값이므로
rax는 0x3133A-0x3133A의 결과인 0x0이 된다.

5) inc rax
1 - rax = 0x3133A
2 - rcx = 0x4
3 - rax = 0x0
: inc rax
inc는 1만큼 올려주는 것이기에, rax는 0x1이 된다

6) and rax, rcx
: rax & rcx
and는, operand1과 operand2의 AND 연산의 결과를 operand1에 대입하므로


7) and rbx, rcx
: rbx & rcx = 0x00000000ffffffff & 0x123456789abcdef0


8) or rax, rbx
: rax || rbx = 0x1234567800000000 || 0x000000009abcdef0


9) xor rax, rbx
: rax ^ rbx = 0x35014541 ^ 0xdeadbeef


10) xor rax, rbx
: rax ^ rbx = 0xebacfbae ^ 0xdeadbeef
: 여기서 중요한 점은, 같은 값을 xor 두번 연산하게 되면 원본 값이 나오게 된다


11) not eax
: eax에 not연산을 취하여야 하는데
: rax의 32비트는 0x45014541이기에 ( 64비트면 0x0000000035014541 )
: rax에 not 연산을 취한 결과와 동일하다

그러나, 윈도우 계산기에서는 0x0000000035014541에서 not연산을 취하기 때문에, ffffffffcafebabe라는 값이 나오게 된다.