리버싱/공부

shr, shl, sar, sal

Goblebin 2022. 3. 10. 12:38
반응형

shift 연산이다. 이 어셈블리어를 공부하기 전에 

https://dojang.io/mod/page/view.php?id=183 

 

C 언어 코딩 도장: 24.3 부호 있는 자료형의 비트 연산 알아보기

지금까지 부호 없는(unsigned) 자료형으로 비트 연산을 했습니다. 하지만 부호 있는 자료형을 비트 연산할 때는 부호 비트를 조심해야 합니다. 먼저 부호 없는 자료형과 부호 있는 자료형에 >> 연산

dojang.io

이곳에서 보수에 대한 개념을 공부를 하는게 좋다.

부호가 있는 연산은 왼쪽에서 숫자가 채워질 때 1로 채워진다....(모르던 사실) 


shr, shl은 부호가 없는 연산이다. (즉 c언어로 따지면 unsigned int로 선언된 변수를 연산할 때 사용한다.)

가독성을 위해 AL레지스터(2byte)를 활용했다.

al에 0x10이라는 값이 들어있다고 가정했을 때

shr eax, 3(오른쪽으로 3번 쉬프트)

 

30을 2진수로 바꾸면 0001 0000이고 오른쪽으로 3번 이동시키면 0000 0010이된다. 16진수로 변환하면 0x00000002이 된다. 

 

십진수로 생각하면 

0x00000010 -> 16

0x00000002 -> 2

16을 2로 3번 나눈 값이다(16/2/2/2 = 2). 나중에 어셈블리어를 공부하며 역함수를 생각할 때 유용할 듯 싶다.


al에 0x10이라는 값이 들어있다고 가정했을 때

shl eax, 3(왼쪽으로 3번 쉬프트)

30을 2진수로 바꾸면 0001 0000이고 오른쪽으로 3번 이동시키면 1000 0000이된다. 16진수로 변환하면 0x00000080이 된다.

 

십진수로 생각하면

0x00000010 -> 16

0x00000080 -> 128

16을 2로 3번 곱한값이다(16*2*2*2 = 2).


sar, sal은 부호가 있는 연산이다. (즉 c언어로 따지면 signed int로 선언된 변수를 연산할 때 사용한다.)

al에 0x90(2진수로 1001 0000)이라는 값이 들어있다고 가정했을 때

sar eax, 3(오른쪽으로 3번 쉬프트)

 

30을 2진수로 바꾸면 1001 0000이고 오른쪽으로 3번 이동시키면 1111 0100이된다. 16진수로 변환하면 0x000000F4가 된다.

 

십진수로 생각하면

0x00000090 -> 1001 0000 -> 0110 1111(비트값 반전) -> 0111 0000(2의 보수) -> -112

0x000000F9 -> 1111 0010 -> 0000 1101(비트값 반전) -> 0000 1110(2의 보수) -> -14

부호가 있는 연산에서는 오른쪽으로 쉬프트 연산을 했을 때 1로 채워진다.

16을 2로 3번 나눈 값이다((-112)/2/2/2 = -14).


al에 0xF8(2진수로 1111 1000)이라는 값이 들어있다고 가정했을 때

sal eax, 3(왼쪽으로 3번 쉬프트)

 

30을 2진수로 바꾸면 1111 1000이고 오른쪽으로 3번 이동시키면 1100 0000이된다. 16진수로 변환하면 0x000000C0이 된다.

 

십진수로 생각하면

0x000000F8 -> 1111 1000 -> 0000 0111(비트값 반전) -> 0000 1000(2의 보수) -> -8

0x000000C0 -> 1100 0000 -> 0011 1111(비트값 반전) -> 0100 0000(2의 보수) -> 64

16을 2로 3번 곱한 값이다((-8)*2*2*2 = 64).

반응형