shr, shl, sar, sal
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).