1. 비트연산: shift 연산
1). 부호가 없는 연산
- 왼쪽으로 이동: shl
- 오른쪽으로 이동: shr
ex).
eax = 4 |
0000 0100 |
eax = eax << 1 |
0000 1000 |
eax = eax << 2 |
0001 0000 |
eax = eax << 3 |
0010 0000 |
# 왼쪽으로 한 칸 옮길 때 마다 *2가 된다. 따라서 특정 곱셈의 경우 비트연산을 통해서 할 때도 있다.
# 반대로 오른쪽으로 한 칸 옮길 때 무다 /2가 된다.
# 비트를 복구할 때 손실될 경우도 있다. 1111 1111를 << 2를하면 1111 1100가되는데 다시 >>2 를하면 0011 1111 이런식으로 부호가 바뀌어 버리는 경우가 있으므로 주의해야 한다.
# 위와 같이 부호가없는 shl shr 명령어를 사용하였을 경우 왼쪽으로 갔다 오른쪽으로 도로 가면 제대로 복구가 안되는 것을 확인할 수 있다.
2). 부호가 있는 연산(MSB를 유지)
- 왼쪽으로 이동: sal
- 오른쪽으로 이동: sar
2. 논리연산: and, or, not
1). and
1 and 1 = 1
1 and 0 = 0
0 and 1 = 0
0 and 0 = 0
and를 이용해서 마스킹을 통해 8비트 나눗셈을 할경우 몫을 추출해 낼 수 있다.
예를들어 14/3 을하면 al에는 몫이 ah에는 나머지가 저장되는데
하위 8비트를 1111 1111(255)로 and연산자를 이용해주면 몫만 구해올 수 있고
비트 연산자를 이용해서 오른쪽으로 8번 비트연산을 해주면 나머지만 구해올 수 있다.
2). or
1 or 1 = 1
1 or 0 = 1
0 or 1 = 1
0 or 0 = 0
2-1) xor
1 or 1 = 1
1 or 0 = 1
0 or 1 = 1
0 or 0 = 0
3). not(neg)
not 1 = 0
not 0 = 1
3. 형변환
1). 작은 -> 큰
- movzx ( zero extend )
- movsx ( sign extend )
2). 큰 -> 작은
-eax -> ax -> al
'System Hacking' 카테고리의 다른 글
8일차] 반복문(for, if) (0) | 2018.05.17 |
---|---|
7일차] 분기문(if, switch) (0) | 2018.05.16 |
5일차] 연산자 (사칙연산) (0) | 2018.05.15 |
4일차] 명령어(mov, lea) (0) | 2018.05.14 |
3일차] 각 메모리 공간의 데이터 표현 + 레지스터 (0) | 2018.05.11 |