반응형
우선 어셈블리어 ROL과 ROR에 대해 알아보자. dreamhack basic 7번 문제를 풀면서 공부
ROR은 Rotate Right의 약자이고 ROL은 Rotate Left의 약자이다.
쉬프트 연산을 하면서 소거되는 비트의 값이 사라지지 않고 새로 생기는 비트에 복사된다.
말로 설명하면 어려우니 예를 들어보자.
예를 들어 AL에 0X85(1000 0101)가 들어있다고 가정 해보자.
ROR AL, 1 -> 0x85를 2진수로 바꾸면 1000 0101 -> 1100 0001이 된다.
보다시피 오른쪽으로 비트가 밀리면서 소거될 1이 왼쪽으로 복사된다.
ROR을 C언어로 구현해 보면(최하위 비트가 1일 때 최상위 비트에 1이 복사된다.)
홀수일 때 최하위 비트는 무조건 1이라는 점을 이용해서 만들어보자.
int ror(unsigned int number, int count) { // number : rol이 수행될 피연산자, count : rol을 수행할 횟수 for(; count!=0; count--) { if(number%2 != 0) { // number가 홀수(최하위비트가 1)일 때 number = number>>1; // 오른쪽으로 shift연산 number = number+0x80; // 최상위 비트에 1추가 number = number&0xFF; // INT형이 4바이트이므로 상위 2BYTE값을 0으로 고정한다. } else { // number가 홀수(최하위비트가 1)가 아닐 때 number = number>>1; number = number&0xFF; // INT형이 4바이트이므로 상위 2BYTE값을 0으로 고정한다. } } return number; // ror이 수행된 피연산자 리턴 } |
마찬가지로 AL에 0X85(1000 0101)가 들어있다고 가정 해보자.
ROL AL, 1 -> 0x85를 2진수로 바꾸면 1000 0101 -> 0000 1011이 된다.
왼쪽으로 비트가 밀리면서 소거될 1이 오른쪽으로 복사된다.
ROL을 C언어로 구현해 보면(최상위 비트가 1일 때 최하위 비트에 1이 복사된다.)
최상위 비트가 1이라면 무조건 0x80(128)보다 크다는 점을 이용해서 만들어보자.(2byte(AL) 기준)
int rol(unsigned int number, int count) { // number : rol이 수행될 피연산자, count : rol을 수행할 횟수 for(; count!=0; count--) { if(number>=0x80) { // 최상위 비트가 1일때 number = number<<1; // 왼쪽으로 shift연산 number = number+1; // 최하위 비트에 1추가 number = number&0xFF; // INT형이 4바이트이므로 상위 2BYTE값을 0으로 고정한다. } else { // 최상위 비트가 1이 아닐 때 number = number<<1; number = number&0xFF; // INT형이 4바이트이므로 상위 2BYTE값을 0으로 고정한다. } } return number; // rol이 수행된 피연산자 리턴 } |
가 된다. 사지방에서 DEV C++이 안되는 자리를 잡아서 맞는지 검증은 안 해봤다. 내일 안 까먹으면 다른 자리에서 한 번 해 봄.
반응형
'리버싱 > 공부' 카테고리의 다른 글
어셈블리어 and, or, xor, not 명령어 (0) | 2022.06.02 |
---|---|
어셈블리어 add, sub, inc, dec 명령어 (0) | 2022.06.02 |
test, cmp 그리고 분기문 jmp (0) | 2022.03.15 |
shr, shl, sar, sal (0) | 2022.03.10 |
mov와 lea (0) | 2022.03.09 |