프로그래밍 74

#14. 부동소수점 & boolean

*참 / 거짓 ( boolean ) *bool 은 그냥 1바이트 정수에 불과 *어셈블리에서 bool 이란 것은 없음. *C++ 은 어셈블리보다 좀 더 높은 언어, '가독성' *왜 bool 1byte 로 잡았을까 ?? => 메모리의 최소단위가 1바이트 이기 때문 *실수 ( 부동소수점 ) '부동 소수점은 항상 근사값' 이라는 것을 알아야함. 특히 수가 커질수록 오차 범위도 매우 커짐 ex) 1/3 = 0.33333333333333333333333333333333333.... *실수 2개를 == 으로 비교하는 것은 지양 *float (4byte) / double (8byte) *고정소수점 => 점 앞/뒤를 기준으로 16/16씩 끊으면 ?? => 너무 작다. *부동소수점 => . 을 유동적으로 움직여서 표현하는..

프로그래밍/C++ 2022.07.16

#13. 정수

* '정수' 에 대해 알아보자. char a; // 1바이트 short b; // 2바이트 int c; // 4바이트 __int64 d; // 8바이트 (long long) signed char a; // 1바이트 signed short b; // 2바이트 signed int c; // 4바이트 signed __int64 d; // 8바이트 (long long) signed : 음수를 포함 => signed 를 생략하고 있다. unsigned : 음수를 포함하지 않음 signed char a; // 1바이트 (-128 ~ 127) signed short b; // 2바이트 (-32768 ~ 32767) signed int c; // 4바이트 ... signed __int64 d; // 8바이트 (long..

프로그래밍/C++ 2022.07.16

#12. 스택 메모리 & 스택 프레임 ( Stack Frame )

*스택 메모리 => 스택 메모리의 주소는 '높은주소' 부터 시작 * 스택 프레임 => 함수에 대한 지역 변수와 매개변수를 일시적으로 보유하는 스택 메모리 영역 https://docs.microsoft.com/ko-kr/cpp/mfc/memory-management-frame-allocation?view=msvc-170 => bp ( base pointer ) 와 sp ( stack pointer )를 기준으로 해당 함수가 스택 메모리에서 사용할 영역을 지정한다. bp 와 sp 는 레지스터의 한 종류. ( = 링크 ) *포인터 레지스터 ip ( Instruction Pointer ) : 다음 수행 명령어의 위치 => 'Code 영역에 해당하는 줄 위치' sp ( Stack Pointer ) : 현재 '스택..

프로그래밍/C++ 2022.07.15

#11. 함수 기초

*함수 ( 프로시저 procedure 서브루틴 subroutine ) ex) PRINT_MSG: PRINT_STRING msg NEWLINE ret *두 값 중 더 큰 값을 반환하는 max => 값은 어떻게 넘겨받을까 ?? 반환은 어떻게 할까 ?? => 인자가 10개라면 어떻게 할까 ?? => eax, ebx 에 이미 중요한 값이 있다면 어떻게 할까?? => .data .bss 사용하면 ?? => 그러면 인자를 도대체 몇개를 할당해야 하지 ?? 결과적으로, '스택 ( Stack )' 이라는 메모리 영역 사용을 사용하게 됨. => 매개변수 전달 => 돌아갈 주소 관리 => 다른 메모리 구조가 필요했다. => 유효 범위의 개념이 있다. -> (함수 호출) => 정리의 개념이 있다. -> (함수 종료) => ..

프로그래밍/C++ 2022.07.15

#10. 배열과 주소

*배열 : 동일한 타입의 데이터 묶음 => element : 구성하는 각 값 => Index : 배열의 위치를 가리키는 숫자 *주소 => [ 시작 주소 + 인덱스 * 데이터 크기 ] a db 0x01, 0x02, 0x03, 0x04, 0x05 ; 5 * 1 = 5byte b times 5 dw 1 ; 5 * 2byte = 10byte %include "io64.inc" section .text global CMAIN CMAIN: mov rbp, rsp; for correct debugging mov rax, a xor ecx, ecx LABLE_PRINT_A: ; PRINT_HEX 1, [a + ecx] ; NEWLINE inc ecx ; add ecx, 1 cmp ecx, 5 jne LABLE_PRIN..

프로그래밍/C++ 2022.07.15

#9. 어셈블리 반복문

*반복문 ( while, for ) => 특정 조건을 만족할 때까지 반복해서 실행 *Hello World 10번 출력 %include "io64.inc" section .text global CMAIN CMAIN: mov rbp, rsp ; for correct debugging mov ecx, 10 LABLE_LOOP: PRINT_STRING msg NEWLINE dec ecx ; sub ecx, 1 와 동일 cmp ecx, 0 jne LABLE_LOOP xor rax, rax ret section .data msg db 'Hello World', 0x00 section .bss num resb 1 본 내용은 인프런의 루키스님 강의를 듣고 정리한 내용입니다. 강의 듣기 !!

프로그래밍/C++ 2022.07.15

#8. 어셈블리 분기문

*특정 조건에 따라서 코드 흐름을 제어하는 것 ex) 스킬 버튼을 눌렀는가 ?? 제한 시간 내에 던전 입장 수락 버튼을 눌렀는가 ?? *CMP dst, src ( dst 기준 ) 비교를 한 결과물은 'Flag Register' 저장 JMP [ label ] JMP : 무조건 Jump JE : JumpEquals 같으면 Jump JNE : JumpNotEquals 다르면 Jump JG : JumpGreater 크면 Jump JGE : JumpGreaterEquals 크거나 같으면 Jump ... *어셈블리 cmp 명령 *eflag Register *두 숫자가같으면 1, 아니면 0을 출력하는 프로그램. section .text global CMAIN CMAIN: mov rbp, rsp; for correct..

프로그래밍/C++ 2022.07.15

#7. 시프트, 논리 연산

https://docs.microsoft.com/ko-kr/cpp/cpp/left-shift-and-right-shift-operators-input-and-output?view=msvc-170 https://ko.wikipedia.org/wiki/%EC%82%B0%EC%88%A0_%EC%8B%9C%ED%94%84%ED%8A%B8 *시프트 연산 long long test = (23LL 1 11011001b (-39) >> 1 11101100b (-20) >> 1 *부호 있는 숫자일 때, *양수일때 모두 0 으로 채움. *음수일때 일 땐, 1 로 채워짐 *Shift 연산은 어느 상황에 사용할까?? => 비트 연산으로 빠르게 처리할 수 있는 상황들이 존재. * > 시, /2 하는 것과 같음. >> 2칸을 이..

프로그래밍/C++ 2022.07.15

#5. 문자와 엔디안

*컴퓨터가 데이터를 저장하고 있는 상태 => 비트단위로 저장되어있음. => 결국 0x11, 17, 00010001b 표기만 다를 뿐 저장되는 내용은 같다. *아스키코드 *컴퓨터는 H, E, l, ... 이런 문자들을 알 수 없다. *문자열 끝에는 항상 NULL (0x00) 이 포함되어 있어야함.. => 해당 문자열이 언제 끝나는지 알려주어야 됨. *리틀엔디안 & 빅엔디안 => intel 에서는 '리틀 엔디안' 적용. => 항상 낮은 주소부터 Big / Little 기준으로 넣어진다. *왜 '리틀엔디안' 을 사용했을까 ?? => 장단점이 교차한다. *리틀엔디안 => 캐스팅에 유리 ( ex. 4바이트 데이터에서 1바이트만 가져오고 싶을 때 ) *빅엔디안 => 숫자 비교에 유리 ( ex. 0x1234 / 0x..

프로그래밍/C++ 2022.07.15