and
, or
, xor
, not
등의 논리연산이 있음. [Register]
eax = 0xffff0000
ebx = 0xcafebabe
[Code]
and eax, ebx
[Result]
eax = 0xcafe0000
[Register]
eax = 0xffff0000
ebx = 0xcafebabe
[Code]
or eax, ebx
[Result]
eax = 0xffffbabe
[Register]
eax = 0xffffffff
ebx = 0xcafebabe
[Code]
xor eax, ebx
[Result]
eax = 0x35014541
A의 비트 전부 반전(1의 보수 기법)
[Register]
eax = 0xffffffff
[Code]
not eax
[Result]
eax = 0x00000000
ZF, CF, SF, OF
등 설정..ex. 서로 같은 두수를 빼면 결과가 0이되어 ZF
플래그가 설정되는데, 이후에 CPU는 이 플래그를 보고 두 값이 같았다는걸 알수있음
[Code]
1: mov rax, 0xA
2: mov rbx, 0xA
3: cmp rax, rbx ; ZF=1
AND
비트연산을 취함ex. 아래와 같은 경우에는 0이된 rax
를 AND연산을 수행하면 결과가 0이므로 ZF플래그가 설정된다. 이후에 CPU는 이 플래그를보고 rax
가 0이였는지 판단 가능
[Code]
1: xor rax, rax
2: test rax, rax ; ZF=1
rip 레지스터를 이동시켜 실행 흐름을 바꾼다.
rip
: 명령어 포인터 레지스터로써 CPU가 어느 부분의 코드를 실행할지 가리킴, 8바이트 크기
A로 rip
를 이동시킴 (jmp 1이면 1번 코드로 다시 돌아가서 실행!)
1: xor rax, rax
2: jmp 1 ; jump to 1
직전 코드에서 비교한 두 피연산자가 같으면 점프
[Code]
1: mov rax, 0xcafebabe
2: mov rbx, 0xcafebabe
3: cmp rax, rbx ; rax == rbx
4: je 1 ; jump to 1
직전에 비교한 두 연산자중 전자가 더 크면 점프
[Code]
1: mov rax, 0x31337
2: mov rbx, 0x13337
3: cmp rax, rbx ; rax > rbx
4: jg 1 ; jump to 1