어셈블리 2

비트 연산으로 산술연산 빠르게 처리하기

> n 은 2를 n번 나눈 것이고 위의 것들은 익히 잘 알려져 있고 꽤 쓰이는 듯 하다. 다음으로 2의 n제곱 단위의 수를 나눈 나머지 연산의 경우도 앤드 연산으로 가능하다. i % 2 => i & 1 i % 4 => i & 3 i % 8 => i & 7 i % 16 => i & 15 i % 32 => i & 31 .... i % 2의 n제곱 => i & (2의 n제곱 - 1) 나머지 연산보다는 비트 연산이 비할바 없이 빠르다. 참고로 릴리즈 실행 화일을 올리디버거 사용하여 어셈블리 코드를 뜯어보니 역시나 컴파일러가 저 경우 앤드 연산으로 알아서 최적화 코드를 생성함을 알 수 있었다. 다음으로 xor 연산으로 특정한 경우 뺄셈처리가 가능하다. 가령 32개의 요소가 있는 경우 0 ~ 31까지 인덱스를 역순..

C, C++ 문법 2011.07.24

mov와 lea 명령어 차이

mov는 좌변에 우변(혹은 상수)의 값을 입력하는 것이다. lea는 좌변(레지스터만 가능)에 우변의 주소값을 입력하는 것이다. mov eax, dword ptr ss:[ebp-4]; 위의 경우 eax는 ebp-4 메모리 주소에 있는 4바이트(dword)값이 입력될 것이다. 참고로 dword ptr ss:[ebp-4];에서 [주소]는 주소에 존재하는 값을 의미한다. dword ptr에 의해 4바이트 의 값을 읽어들인다. word ptr이면 2바이트, byte ptr이면 1바이트를 읽어들인다. mov는 값을 입력하는 것이므로 mov eax, 12345(상수) 문장은 당연히 성립가능하다. mov dword ptr ss:[esp-4], 12345; mov dword ptr ds:[0x00560033], 1234..

Assembly 2011.02.27