시프트와 회전 명령어 및 응용
목표 : 시프트 연산의 기본적이 사용법과 응용 및 각 연산이 플래그에 미치는 영향까지 알아보자.
1.시프트(Shift)란?
- 피연산자 내부에서 비트를 좌우로 이동하는 것을 의미한다. 표 1-1은 인텔이 제공하는 시프트 명령어를 나열한 것이다.
[표 1-1] – 시프트와 회전 명령어
명령어 |
설명 |
SHL |
* 왼쪽 시프트 |
SHR |
* 오른쪽 시프트 |
SAL |
* 왼쪽 산술 시프트 |
SAR |
* 오른쪽 산술 시프트 |
ROL |
* 왼쪽 회전 |
ROR |
* 오른쪽 회전 |
RCL |
* 왼쪽 캐리포함 회전 |
RCR |
* 오른쪽 캐리포함 회전 |
SHLD |
* 2배 정밀도 왼쪽 시프트 |
SHRD |
* 2배 정밀도 오른쪽 시프트 |
2. 논리 시프트와 산술 시프트
1) 논리 시프트
- 피연산자의 비트를 시프트하는 방법으로 새로 만들어진 비트 위치를 0으로 채우고 비트 7에 0을 할당한다.
그림 2-1) 논리 시프트
- 다음의 2진값 11001111에 대해서 오른쪽으로 논리 시프트를 수행 하면 01100111이된다. 최하위 비트는 carry플래그로 시프트된다.
2) 산술 시프트
- 새로 만들어진 비트위치는 원래 수의 비트 값이 복사되어 채워진다. 부호 값을 유지할 경우 사용된다.
그림 2-2) 산술 시프트
- 다음은 2진값 11001111을 오른쪽으로 1비트 산술 시프트 될 때에 값은 11100111이 된다.
3. SHL 명령어
1) SHL 명령어 – SHL 명령어는 목적지 피연산자에 대해서 최하위 비트를 0으로 채우는 논리 시프트를 수행한다. 최상위 비트는 carry플래그로 이동하고 carry플래그에 있던 비트는 없어진다.
그림 3-1) SHL 명령어
Ex 1) shl 예제
mov bl,8Fh ; bl = 10001111b shl bl,1 ; cf =1, bl = 00011110b |
Ex 2) 빠른 곱셈
mov bl,5 shl bl,1 ---> shl을 이용해서 2의 거듭제곤급에 대한 곱셈을 빠르게 수행할 수 있다. 피연산자를 n비트왼쪽으로 시프트하면 피연산자에 2^n을 곱한 것이 된다(이는 차후 자세히 설명하도록 하겠습니다.). |
4. SHR 명령어
1) SHR 명령어 – SHR 명령어는 목적지 피연산자에 대해서 최상위 비트를 0으로 대치하는 오른쪽 시프트를 수행한다. 최하위비트는 CARRY플래그로 복사되고 CARRY플래그에 있던 비트는 없어진다.
그림 4-1) SHR 명령어
Ex 1) shr 예제1
mov al,0D0h ; al = 11010000b shr al,1 ; al = 01101000b, cf = 0 |
Ex 2) shr 예제2
mov al,0D0h ; al = 11010000b shr al,2 ; al = 00110100b, cf = 0 |
Ex 3) 빠른 나눗셈
mov al,32 ; al = 00100000b shr al,1 ; al = 00010000b(16), cf = 0 shr al,2 ; al = 00000100b(4), cf = 0 |
5. SAL과 SAR 명령어
- SAL과 SAR 명령어는 각각 SHL/SHR 명령어와 동일하다. 단지 위에서 언급한 산술 시프트와 논리 시프트의 수행 차이만을 나타낸다. 다음의 예를 보며 정확히 이해하자.
Ex 1) shr 예제1
mov al,0F0h ; al = 11110000b ( -16 ) sar al,1 ; al = 11111000b ( -8 ), cf = 0 |
mov al,0F0h ; al = 11110000b ( -16 ) shr al,1 ; al = 01111000b ( 120), cf = 0 |
Ex 2) ax의 eax로의 부호 확장
mov ax,-128 ; eax = ????FF80h shl eax,16 ; eax = FF800000h sar eax,16 ; eax = FFFFFF80h |
6. ROL 명령어
1) ROL 명령어 – ROL 명령어는 각 비트를 왼쪽으로 시프트한다. 최상위 비트는 CARRY 플래그와 최하위 비트 위치로 복사된다.
그림 6-1) ROL 명령어
- 비트 회전은 비트를 잃어 버리지 않는다. 그림 6-1과 같이 한쪽 끝에서 회전되어 나온 비트는 다른 한쪽 끝에서 다시 나타난다.
Ex 1) ROL 명령어
mov al,40h ; al = 01000000b rol al,1 ; al = 10000000b, cf = 0 rol al,1 ; al = 00000001b, cf = 1 rol al,1 ; al = 00000010b, cf = 0 |
Ex 2) 비트 그룹의 교환
mov ax,1234h rol ax,4 ; ax = 2341h rol ax,4 ; ax = 3412h rol ax,4 ; ax = 4123h rol ax,4 ; ax = 1234h |
7. ROR 명령어
- ROR 명령어는 각 비트를 오른쪽으로 시프트하고 최하위 비트를 CARRY 플래그와 최상위 비트 위치로 복사한다. 명령어 형식은 SHL에 대한 형식과 같다.
8. RCL과 RCR 명령어
1) RCL 명령어 - RCL명령어는 각 비트를 왼쪽으로 시프트하고 CARRY플래그를 최하위 비트로 복사하고 최상위 비트를 CARRY플래그로 복사한다.
그림 8-1) RCL 명령어
Ex 1) RCL 명령어
clc ; cf =0; mov bl,88h ; cf, bl = 0 10001000b rcl bl,1 ; cf, bl = 1 00010000b rcl bl,1 ; cf, bl = 0 00100000b |
1) RCR 명령어 – RCR 명령어는 각 비트를 오른쪽으로 시프트하고 CARRY플래그를 최상위 비트에 복사하고 최하위 비트를 CARRY플래그에 복사한다.
9. SHLD와 SHRD
1) SHLD/SHRD - SHLD/SHRD 명령어는 목적지 피연산자를 지정된 비트 수만큼 왼쪽으로 시프트한다. 시프트로ㅗ 비어 있게 되는 비트 위치들은 소스 피연산자의 최상위 비트들로 채워진다. 소스 피연산자는 영향을 받지 않지만 플래그들은 영향을 받는다.
shld destination, source, count |
Ex 1) shld 명령어
.data wval WORD 9BA6h .code mov ax,0AC36h shld wval,ax,4 ; wval = BA6Ah -> shld 과정을 살펴보면 우선 wval의 4비트가 왼쪽으로 시프트되서 BA60h가 된 후 ax의 상위 4비트가(A)가 wval에 하위 위치로 들어가게 됩니다. 따라서 shld 명령어의 결과는 BA6Ah가 됩니다. |
Ex 2) shrd 명령어
.code mov ax,234Bh mov dx,7654h shrd ax,dx,4 ; ax = 4234h |
'PC리버싱 > (구)기초정리 by ME' 카테고리의 다른 글
빈 프로그램exe (공유) (0) | 2020.05.20 |
---|---|
X64dbg 설치 관련 (0) | 2020.05.16 |
프로그래밍(코딩,정공학)과리버싱(역공학)의활용 (0) | 2020.05.09 |
크랙미1 풀이 (0) | 2020.04.29 |
리버싱초보자를 위한 어느정도 도전과제들 (10) | 2020.04.20 |