PC리버싱/(구)기초정리 by ME

시프트

Lamed_Dhhd 2020. 5. 14. 20:00
반응형

시프트와 회전 명령어 및 응용

 

 

 

목표 : 시프트 연산의 기본적이 사용법과 응용 및 각 연산이 플래그에 미치는 영향까지 알아보자.

 

 

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

 

 

반응형