C++ Rookiss Part1 C++ 프로그래밍 입문 : 사칙연산
🙇♀️사칙연산
GET_DEC 1, al
GET_DEC 1, num
PRINT_DEC 1, al
NEWLINE
PRINT_DEC 1, num
🪐사칙연산
GET_DEC : input창에 입력을 받고 싶을 때 사용
- 더하기 연산
- add a, b (a = a + b)
- a는 레지스터 or 메모리
- b는 레지스터 or 메모리 or 상수
- 단 a, b 모두 메모리는 x
add al, 1 ; 레지스터 + 상수
PRINT_DEC 1, al ; 1+1=2
NEWLINE
add al, num ; 에러발생
PRINT_DEC 1, al
NEWLINE
레지스터에서 변수들은 값이 아니랑 주소값을 들고 있으므로 오버플로우가 발생하여 에러가 난다
add al, [num]
- 레지스터 + 메모리
mov bl, 3 ; 레지스터 + 메모리
add al, bl
PRINT_DEC 1, al
NEWLINE
add [num], byte 1 ; 메모리 + 상수
PIRNT_DEC 1, [num]
NEWLINE
변수에 상수를 더할 때는 상수의 크기까지 적어줘야 됨 변수는 그냥 주소값만 들고 있기 때문
add [num], al ; 메모리 + 레지스터
PIRNT_DEC 1, [num]
NEWLINE
빼기는 더하기와 동일하고 기호는 sub
- 곱하기 연산
- mul reg
- mul bl => al * bl
- 연산 결과를 ax에 저장
- mul bx => ax * bx
- 연산 결과는 dx(상위 16비트) ax(하위16비트)에 저장
- mul ebx => eax * ebx
ex) 5 * 8 은?
mov ax, 0
mov al, 5
mov bl, 8
mul bl
PRINT_DEC 2, ax
NEWLINE
- 나누기 연산
- div reg
- div bl => ax / bl
- 연산 결과는 al(몫) ah(나머지)
ex) 100 / 3은?
mov ax, 100
mov bl, 2
div bl
PRINT_DEC 1, al
NEWLINE
mov al, ah
PRINT_DEC 1, al
🪐쉬프트 연산과 논리 연산
- 쉬프트(shift) 연산, 논리(logical) 연산
- 산술쉬프트에서 최상이 비트는 유지된다
mov eax, 0x12345678
PRINT_HEX 4, eax
NEWLINE
shl eax, 8
PRINT_HEX 4, eax
NEWLINE
shr eax, 8
PRINT_HEX 4, eax
NEWLINE
총 연산결과
12345678
34567800
345678
- 쉬프트 연산의 장점
- 곱셉/나눗셈
- 게임서버에서 objectID를 만들어 줄 때
- 논리연산
- not and or xor
- 결혼업체 예시
- 조건 A : 잘생겼다
- 조건 B : 키가 크다
- not A : 잘생겼다의 반대 -> (0이면 1, 1이면 0)
- A and B : 잘생겼고 and 키도 키고 -> 둘 다 1이면 1, 아니면 0
- A or B : 잘생겼거나 or 키가 크거나 -> 둘 중 하나라도 1이면 1, 아니면 0
- A xor B : 잘생기고 작거나 or 못생기고 크거나 -> 둘 다 1이거나 둘 다 0이면 0, 아니면 1
- 비트 논리 연산자!
mov al, 0b10010101
mov bl, 0b01111100
and al, bl ; al = al and bl
PRINT_HEX 1, al
NEWLINE
결과 : 14
not al
PRINT_HEX 1, al
NEWLINE
결과 : eb
응용 사례 : bitflag
PRINT_HEX 1, al
NEWLINE
xor al, bl
PRINT_HEX 1, al
NEWLINE
xor al, bl
PRINT_HEX 1, al
NEWLINE
결과 : 95, e9, 95
- 동일한 값으로 xor 두번하면 자기 자신으로 되돌아오는 특성
- 암호학에서 유용하다! (value xor key)
xor al, al
PRINT_HEX 1, al
결과 : 0
xor
로 같은 값을하면 그 수는 0이 된다