본문 바로가기

System Hacking

6일차] 비트연산자, 논리연산, 형변환

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