외로운 Nova의 작업실

Assembly 언어 공부 - 25(시프트와 회전 명령어) 본문

Programming/Assembly

Assembly 언어 공부 - 25(시프트와 회전 명령어)

Nova_ 2022. 9. 1. 18:54

안녕하세요. 이번시간에는 어셈블리어의 시프트 연산과 회전 명령어에대해 알아보겠습니다.

 

- 시프트와 회전 명령어

 

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

 

Comments