[asm] and 연산으로 홀수 짝수 구별하기
홀수 짝수를 구별하는 방법은 여러가지가 있다. 보통의 경우, 나머지를 구하는 연산을 사용한다. 그러나 더 간단하게는 and 연산으로 구할 수도 있다.
다음과 같이 십진수와 2진수를 비교해 보자.
Decimal | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
Binary | 0000 | 0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 | 1000 |
자세히 관찰해 보면 짝수의 경우는 LSB(Least Significant Bit)가 0이고, 홀수는 1이라는 것을 알 수 있다. 이것을 이용해 보면 LSB 가 0 인지 1인지만 확인할 수 있으면 짝수와 홀수를 간단하게 알아낼 수 있다.
and 연산으로 어떻게 마지막 자리수가 0 인지 1 인지 알아낼 수 있을까. 그것은 and 연산의 특성을 이용하는 것이다. and 연산은 입력값이 모두 1이어야 결과가 1이며 하나라도 0이면 결과는 0이다. 예를 들어 0000 과 0101 을 and 연산시켜 보자.
0101 and
----------------
0000
둘 중 하나라도 0이면 0이다. 마지막 자리수만 확인하고 싶다면 0001 을 and 연산 시키면 된다.
0101 and
----------------
0001
0001 과 and 연산시킨 결과가 0001 이다. 십진수로는 1이다. 0101 은 십진수로 5이다. 5는 홀수이다.
결론은 이렇다. 어떤수를 1과 and 연산시켜서 결과가 0이면 짝수, 1이면 홀수이다. 만약, eax 에 5가 들어있고 이 값이 홀수인지 짝수인지 알고 싶다면, and eax, 1 하면 된다. 연산결과 eax 에 1이 있으면 원래 있던 값은 홀수이다.
00000000 00000000 00000000 00000001 and
-----------------------------------------------------------------
00000000 00000000 00000000 00000001
C언어를 기준으로 나머지를 구하는 연산은 % 이다. bitwise and 연산은 & 이다.
C++ Builder 를 이용하여 두가지 연산을 사용한 결과를 디스어셈블 해보면 다음과 같이 나온다.
8B55FC mov edx,[ebp-0x04]
81E201000080 and edx,0x80000001
7905 jns 0x004011a2
4A dec edx
83CAFE or edx,-0x02
42 inc edx
8955FC mov [ebp-0x04],edx
8365FC01 and dword ptr [ebp-0x04],0x01
연산 결과 변수 num 에 0 이 있으면 짝수이고, 1 이 있으면 홀수이다.