Assembly 언어 공부 - 25(시프트와 회전 명령어)
안녕하세요. 이번시간에는 어셈블리어의 시프트 연산과 회전 명령어에대해 알아보겠습니다.
- 시프트와 회전 명령어
SHL | 왼쪽 시프트 |
SHR | 오른쪽 시프트 |
SAL | 왼쪽 산술 시프트 |
SAR | 오른쪽 산술 시프트 |
ROL | 왼쪽 회전 |
ORO | 오른쪽 회전 |
RCL | 왼쪽 캐리포함 회전 |
RCR | 오른쪽 캐리포함 회전 |
SHLD | 2배 정밀도 왼쪽 시프트 |
SHRD | 2배 정밀도 오른쪽 시프트 |
- 논리 시프트와 산술 시프트
시프트 연산에는 총 2가지가 있습니다. 논리 시프트 연산과 산술 시프트 연산이죠. 시프트 연산을 할때는 항상 공백비트가 생깁니다. 이 공백비트를 0으로 채우는게 논리 시프트 연산이고, 이전의 숫자의 부호를 유지시키면서 채우는게 산술 시프트 연산이죠.
예를들어, 11111110b 를 오른쪽 시프트를 하게되면 01111111b가 됩니다. 하지만 오른쪽 산술 시프트를 하게되면 11111111b가 됩니다. 이 처럼 빈칸 공백에따라 어떤 비트를 넣을건지에따라 시프트 종류가 다릅니다.
- SHL, SHR
SHL은 왼쪽 시프트 연산입니다. 아래는 예시입니다.
.code
mov bl, 01111111b
shl bl, 1
위 연산의 결과는 11111110b 입니다. 만약 shl bl, 2 였다면, 11111100b가 되었을 겁니다.
SHR은 오른쪽 시프트 연산입니다. 아래는 예시입니다.
.code
mov bl, 11111110b
shr bl, 1
위 연산의 결과는 1111111b 입니다.
- SAL, SAR
SAL은 왼쪽 산술 시프트 연산입니다. 아래는 예시입니다.
.code
mov bl, 01111111b
sal bl, 1
위 연산의 결과는 01111110b 입니다. 부호비트를 0으로 일정하게 유지시켜줍니다.
SAR은 오른쪽 산술 시프트 연산입니다. 아래는 예시입니다.
.code
mov bl, 11111110b
sar bl, 1
위 연산의 결과는 1111111b 입니다. 부호비트를 1로 유지시켜줍니다.
- ROL, ROR
ROL은 왼쪽 회전 연산입니다. 아래는 예시입니다.
.code
mov bl, 10101010b
rol bl, 1
위 연산의 결과는 01010101b 입니다.
ROR은 오른쪽 회전 연산입니다. 아래는 예시입니다.
.code
mov bl, 10101010b
ror bl, 1
위 연산의 결과는 01010101b 입니다.
- RCL, RCR
RCL은 왼쪽 캐리포함 회전 연산입니다. 아래는 예시입니다.
.code
clc ;CF = 0
mov bl, 88h ; CF, BL = 0 10001000b
rcl bl, 1 ; CF, BL = 1 00010000b
rcl bl, 1 ; CF, BL = 0 00100001b
RCR은 오른쪽 캐리포함 회전 연산입니다. 아래는 예시입니다.
.code
clc ;CF = 0
mov bl, 88h ; CF, BL = 0 000010001b
rcr bl, 1 ; CF, BL = 1 000001000b
rcr bl, 1 ; CF, BL = 0 100000100b