연습장

3일차 본문

언리얼 개발자/어셈블리

3일차

도다람 2022. 7. 25. 18:37

7. 시프트(shift)연산과 논리(logical)연산

시프트 연산
한칸씩 밀겠다

10진수 기준으로 보면(부호가 음수가 아니라는 가정하에) 곱하기2를 한 것과 똑같음 

mov eax, 0x12345678
PRINT_HEX 4, eax

shl eax, 8
PRINT_HEX 4, eax

shr eax, 8
PRINT_HEX 4, eax

시프트 연산
: 왼쪽이나 오른쪽으로 한 칸씩 밀어주는

부호가 음수가 아니라는 기준 하에 
시프트 연산으로 왼쪽으로 당기는 행동 자체는 곱하기 2를 한것과 동일함

곱셈 나눗셈을 시프트 연산으로 빠르게 처리할 수 있음(간접적으로 사용)

게임서버에서 objectID를 만들어 줄 때
(직접적으로 사용)



논리 연산
not and or xor

비트 논리 연산자 
조건 A : 잘생겼다
조건 B : 키가 크다

not A : 잘생겼다의 반대 -> 0이면 1, 1이면 0
A and B : 잘생겼고 키도 크다 -> 둘다1이면 1, 아니면 0
A or B : 잘생겼거나 키가 크거나 -> 둘중 하나라도 1이면 1, 아니면 0
A xor B : 잘생기고 작거나 못생기고 크거나 -> 둘다 1이거나 둘다 0이면 0, 아니면 1



응용 사례 : bitflag
동일한 값으로 xor 두번하면 자기 자신으로 되돌아오는 특성
암호학에서 유용하다 (value xor key)


8. 분기문(IF문)
특정 조건에 따라 코드 흐름을 제어하는 기능
분기문과 반복문을 적절히 조합하면 거의 모든 코딩이 가능하다

 


*CMP(compare) 명령어: 비교로 조건을 체크하는 가장 대표적 명령어

 

 

*CMP dst, src (dst가 기준)
비교를 한 결과물은 Flag Register에 저장됨

 


*JMP [label] 시리즈
JMP : 무조건 jump // 무조건 진행해라
JE : JumpEquals 같으면 jump // 같으면 해당위치로 점프
JNE : JumpNotEquals 다르면 jump // 다르면 점프
JG : JumpGreater 크면 jump // 크면 점프
JGE : JumpGreaterEquals 크거나 같으면 jump // 크거나 같으면 점프
JL
JLE

 


<두 숫자가 같으면 1, 아니면 0을 출력하는 프로그램>

mov rax, 10 
mov rbx, 20 // 비교할 두 숫자

cmp rax, rbx // 두 숫자를 비교해줌

je LABEL_EQUAL // 결과물이 같으면 아래 위치의 코딩으로 넘어감

mov rcx, 0 // 다르면 0이 출력됨
jmp LABEL_EQUAL_END

LABEL_EQUAL:   //어셈블리 코딩할 때만 유효, 결과물이 나올 때는 라벨 이퀄이라는 이름은 없어짐
mov rcx, 1  // rcx에 1을 넣어준 후
LABEL_EQUAL_END:
PRINT_HEX 1, rcx  // 1을 출력해줌



<연습 문제, 어떤 숫자가(1~100) 짝수면 1, 홀수면 0을 출력하는 프로그램>

mov ax, 100
나누기 연산
div reg
div bl => ax/bl(al몫 ah 나머지) 응용



'언리얼 개발자 > 어셈블리' 카테고리의 다른 글

2일차  (0) 2022.07.24
1일차  (0) 2022.07.20
Comments