[Shift and rotate]
[Shift and Rotate Instructions]
리버싱을 하다보면, 이런 명령어를 만나게된다.
SHL, SHR, SAL, SAR
ROL, ROR, RCL, RCR
SHLD, SHRD
일단, Logical shift와 arithmetic shift를 비교해보자.
Logical shift는 부호 비트가 보존되지않으며, 새로운 비트를 0으로 채운다.
arithmetic shift는 새로운 비트를 sign bit(부호비트)의 복사본으로 채운다.
[SHL SHR]
SHL 명령어는 destination operand를 source operand만큼 왼쪽으로 shift시킨다.
(SHL destination, source)
그리고 하단 비트는 0으로 채운다.
SHL이 한 번 이뤄질때마다 *2를 한 효과를 갖게된다.
하지만, 하단 비트를 0으로 채우기 때문에 값의 범위가 넘어가면 값의 손실을 갖는다.
SHR 명령어는 destination operamd를 source operand만큼 오른쪽으로 shift시킨다.
(SHR destination, source)
마찬가지로 상위 비트는 0으로 채운다.
SHR이 한 번 이뤄질때마다 /2를 한 효과를 갖게된다.
그리고 SHR또한 값의 범위를 넘어서면 값의 손실을 갖는다.
[SAL SAR]
SAL과 SAR은 SHL/SHR과 달리 부호를 고려하는 shift이다.
[ROL ROR RCR RCL]
ROL명령어는 각 자리의 비트들이 왼쪽으로 shift하고, 최상위의 비트가 Carry Flag와 최하단 비트로 이동하는 연산이다.
ROR명령어는 ROL의 반대로 각 자리의 비트들이 오른쪽으로 shift하고, 최하위의 비트가 Carry Flag와 최상단 비트로 이동하는 연산이다.
RCL(rotate carry left)명령어는 각 비트들이 왼쪽으로 shift하고, Carry Flag가 LSB가 되고 MSB가 Carry Flag가 된다.
RCR(rotate carry right)명령어는 각 비트들이 오른쪽으로 shift하고, Carry Flag가 MSB가 되고 LSB가 Carry Flag가 된다.
[SHLD SHRD]
SHLD destination, source, count
count만큼 destination을 shift left하고, left하여 생긴 공백은 source의 상위비트로 채운다.
(source operand는 변화가 없다.)
SHRD destination, source, count
count만큼 destination을 shift right하고, right하여 생긴 공백은 source의 하위비트로 채운다.
[Shifting multiple doublewords]
때때로 배열안에 모든 비트들이 shift해야 할 때가 있다.
[Binary multiplication]
SHL을 n번 하면 2^n을 한다.
우리는 이를 이용하여 곱셈을 이런식으로 표현할 수 있다.
[Isolating a bit string]
예시로 year만 해보자.
AL에 DH를 넣으면 LSB를 제외한 모든 비트가 year비트가 된다.
이를 정리하기 위해 shr로 오른쪽으로 한번 shift한다.
SHR을 한 번 하면, MSB가 의미가 없어진다. 그래서 mov ah, 0으로 AH를 clear한다.
그 다음에 ax에 1980을 더하면 year은 1980과 관련있게 된다.
'BoB > 합격 후 활동' 카테고리의 다른 글
Intel x86 Insturction Set Architecture - 6 (0) | 2019.11.24 |
---|---|
Intel x86 Insturction Set Architecture - 4 (0) | 2019.11.04 |
Intel x86 Insturction Set Architecture - 3 (0) | 2019.11.02 |
Intel x86 Insturction Set Architecture - 2 (0) | 2019.10.31 |
Intel x86 Instruction Set Architecture - 1 (0) | 2019.10.28 |