📂 전체 예제 코드 및 설명
%include "io64.inc"
- SASM에서 제공하는 입출력 및 편의 매크로 포함
- 이 안에
PRINT_HEX, NEWLINE 등이 정의되어 있음
🔔 기본 섹션 및 진입점 설정
section .text
global main
main:
mov rbp, rsp ; 스택 프레임 설정 (디버깅 용이)
.text: 실행 코드 섹션
global main: 링커가 진입점으로 인식하게 지정
mov rbp, rsp: 현재 스택 상태 저장 (디버깅 편리)
📌 시프트 연산 - Shift Operation
초기값 설정
mov eax, 0x12345678
PRINT_HEX 4, eax
NEWLINE
eax에 16진수 값 저장
- 현재 값 출력
- 줄바꿈 출력
좌측 시프트 (shl)
shl eax, 8
PRINT_HEX 4, eax
- eax를 왼쪽으로 8비트 이동 (값은 256배가 됨)
- 이동 후 값 출력 (왼쪽 8비트 날아가고, 하위 8비트 0으로 채워짐)
우측 시프트 (shr)
shr eax, 8
PRINT_HEX 4, eax
NEWLINE
- eax를 오른쪽으로 8비트 이동 (값은 1/256배)
- 이동 후 값 출력 (오른쪽 8비트 날아가고, 상위 8비트는 0으로 채워짐)
💡 시프트 연산 요점 정리
| 명령어 | 의미 | 효과 |
|---|
shl reg, n | 좌측 시프트 | 2^n 곱셈 효과 |
shr reg, n | 우측 시프트 | 2^n 나눗셈 효과 |
📌 논리 연산 - Logical Operation
논리연산 개념 정리 (A, B를 조건으로 가정)
| 연산 | 설명 | 진리표 |
|---|
| NOT | 반전 | 1→0, 0→1 |
| AND | 둘 다 1이어야 1 | 1 and 1 = 1 |
| OR | 하나만 1이어도 1 | 1 or 0 = 1 |
| XOR | 서로 다를 때만 1 | 1 xor 0 = 1 |
예제: 논리연산 실제 코드
mov al, 0b10010101
mov bl, 0b01111100
- al에
10010101 저장
- bl에
01111100 저장
AND 연산
and al, bl
PRINT_HEX 1, al
NEWLINE
al = al AND bl
- 두 비트가 모두 1일 때만 1
- 결과 출력
- 줄바꿈 출력
NOT 연산
not al
PRINT_HEX 1, al
NEWLINE
al을 반전 (1↔0, 0↔1)
- 결과 출력
- 줄바꿈 출력
논리연산 정리 표
| 명령어 | 동작 | 비트 계산 결과 |
|---|
and al, bl | al과 bl AND | al = al & bl |
or al, bl | al과 bl OR | al = al | bl |
xor al, bl | al과 bl XOR | al = al ⊕ bl |
not al | al 반전 | al = ~al |
📌 비트플래그 응용 예제
mov al, 0b10010101
mov bl, 0b01111100
- al에 비트플래그 세팅 (10010101)
- bl에 다른 비트플래그 세팅 (01111100)
현재 값 출력
NEWLINE
PRINT_HEX 1, al
NEWLINE
XOR 연산으로 상태 반전
xor al, bl
PRINT_HEX 1, al
NEWLINE
- al의 각 비트를 bl의 비트와 XOR
- XOR은 다르면 1, 같으면 0
- 결과 출력
XOR 재적용 (원복)
xor al, bl
PRINT_HEX 1, al
NEWLINE
- 동일한 값과 XOR 두 번 하면 원래 값 복원
- 결과 출력
💡 XOR의 특징 정리
| 상황 | 결과 |
|---|
a xor b | 원래 값과 다른 값으로 변환 |
a xor b xor b | 원래 값으로 복원 |
a xor a | 결과는 무조건 0 |
자기 자신 XOR = 0
xor al, al
PRINT_HEX 1, al
NEWLINE
- al을 자기 자신과 XOR → 결과는 0
- 출력 확인
마무리
xor rax, rax
ret
✅ 전체 요점 정리표
| 연산 종류 | 의미 | 특징 |
|---|
| shl | 좌측 시프트 | 곱하기 효과 |
| shr | 우측 시프트 | 나누기 효과 |
| and | 논리 AND | 둘 다 1일 때만 1 |
| or | 논리 OR | 둘 중 하나라도 1이면 1 |
| xor | 논리 XOR | 서로 다를 때만 1 |
| not | 비트 반전 | 0 ↔ 1 |
🌟 비트플래그 활용 예시
| 비트플래그 | 의미 |
|---|
| 0b00000001 | 옵션 1 ON/OFF |
| 0b00000010 | 옵션 2 ON/OFF |
| 0b00000100 | 옵션 3 ON/OFF |
| ... | ... |
- 특정 기능 ON/OFF 플래그 관리에 매우 유용
and, or, xor로 비트 조작 가능
- 게임 서버의 상태 관리에 자주 사용
💡 XOR을 사용하는 이유
| 상황 | 설명 |
|---|
| 암호화 | data xor key로 간단한 암호화 가능 |
| 상태 토글 | 특정 플래그를 반전시킬 때 유용 |
| 원복 처리 | 같은 값 XOR 두 번으로 원래 값 복원 |