1. 시프트(Shift) 연산

 

- 산술 시프트

곱셈과 나눗셈을 간단하게 할 수 있음.

게임 서버에서 오브젝트 ID를 만들 때(64비트)

 

(1) Left Shift

바이트 내의 비트를 왼쪽으로 한 칸씩 밀어냄

ex) 0011 0010 Lsh 1 = 0110 0100

shl eax, 8 ; 비트를 왼쪽으로 8칸 밀어냄

부호가 양수일 때  왼쪽으로 한 칸 밀려나면 값이 2배 증가

 

(2) Right Shift

바이트 내의 비트를 오른쪽으로 한 칸씩 밀어냄

ex) 0011 0010 Rsh 1 = 0001 1001

shr eax, 8 ; 비트를 오른쪽으로 8칸 밀어냄

부호가 양수일 때  오른쪽으로 한 칸 밀려나면 값이 1/2로 감소

 

단, 레지스터의 크기를 넘어 밀려난 비트는 손실됨(값이 0으로 변환됨)

 

2. 논리(Logical) 연산

 

(1) NOT

NOT A ; A의 반대를 출력함

NOT 0(False) = 1(True)

 

(2) AND

A AND B ; A이고 B인 값을 출력함

둘 다 1이면 1, 그 이외에는 0을 출력

 

(3) OR

A OR B ; A이거나 B를 만족하면 값을 출력

둘 중 하나라도 1이면 1, 아니면 0을 출력

 

(4) XOR

둘 다 1이거나 둘 다 0이면 0을 출력, 아니면 1을 출력

 

mov al, 0b10010101
mov bl, 0b01111100

and al, bl ; al = al and bl
=> 0b0001 0100 = 0x14

not al
=> 0b1110 1011 = 0xeb
mov al, 0b10010101
mov bl, 0b01111100
xor al, bl
xor al, bl
=> 자기 자신으로 되돌아옴

암호화에 사용할 수 있음

[값] xor [키] => 암호화

[암호화 된 값] xor [키] => 복호화

 

xor al, al  ; al에 0을 대입함

 

3. 비트플래그

각 비트에 정보를 저장할 수 있음(플레이어의 행동, 스킬 등)

'어셈블리' 카테고리의 다른 글

0-9. 반복문(Loop)  (0) 2023.04.28
0-8. 분기문(If)  (0) 2023.04.28
0-6. 사칙연산  (0) 2023.04.27
0-5. 문자와 엔디안  (0) 2023.04.27
0-4. 변수와 레지스터  (0) 2023.04.27