전체 글 131

#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

#4. 변수와 레지스터

*변수의 선언 & 사용 => 데이터를 저장하는 바구니. => 처음 바구니 사용하겠다 선언 => 이름 , 크기 지정 *어셈블리 데이터 선언 방식 *초기화된 데이터 ( section .data ) [변수이름] [크기] [초기값] [크기] db ( 1 ) / dw ( 2 ) / dd ( 4 ) / dq ( 8 ) a dd 0 a dw 0 a dd 0 a dq 0 *초기화 되지 않은 데이터 ( section .bss ) [변수이름] [크기] [개수] [크기] resb ( 1 ) / resw ( 2 ) / resd ( 4 ) / resq ( 8 ) num resb 10 section .data msg db 'Hello World', 0x00 a db 0x01, section .bss num resb 1 BSS :..

프로그래밍/C++ 2022.07.15

#3. 레지스터

*레지스터 란 ?? (위키백과) => 컴퓨터의 프로세서 내에서 자료를 보관하는 아주 빠른 기억장소. => 현재 계산을 수행 중인 값을 저장하는데 사용. 즉, CPU 가 계산할 수 있는 최소 단위 64bit / 32bit 환경 -> 레지스터 크기라고 생각. 그래서 포인터의 크기가 8byte( 64bit ) / 4byte ( 32bit ) 로 나뉘어진다. 왜냐하면 레지스터가 8byte 만큼의 주소를 저장할 수 있기 때문이다. *레지스터 종류 ( 레지스터가 하나만 존재하는 것이 아니다. ) ax : 산술, 논리연산 수행. bx : esi, edi 와 함께 메모리 주소 저장 용도로 사용. cx : 카운터 레지스터, 반복 카운터. dx : 큰 수의 연산이 이루어질 때, eax 와 함께 쓰임. si : 데이터를 조..

프로그래밍/C++ 2022.07.14

#2. 데이터 기초

*컴퓨터에서 데이터 저장은 어떤 방식으로 하는가 ?? *음수를 표현하는 방법 => 최상위 비트를 '부호 유무' 사용 => '2의 보수' => 8비트 (=1바이트) 에서 최상위 비트는 '-128' 이 됨. HEX : 16진수 DEC : 10진수 OCT : 8진수 BIN : 2진수 2진수 ( 0, 1 ) => 'b' 0 1 10 11 100 101 111 1000 1001 ... => 0b ( binary ) 8진수 ( 0 1 2 ... 8 ) => '0' 0 1 2 ... 8 => 000 16진수 ( 0 1 2 ... A B C D E F ) => '0x' 0 1 2 ... F 10 => 0x00 *16진수가 좋은 경우 ?? => 2진수와의 변환이 용이 0b 1001 0101 = 0x95 *데이터 단위 8..

프로그래밍/C++ 2022.07.14