C++ Rookiss Part1 C++ 프로그래밍 입문 : 레지스터 기초
🙇♀️레지스터 기초
8 bit = 1 byte
16 bit = 2 byte = 1 word
32 bit = 4 byte = 2 word = 1 dword (double-word)
64 bit = 8 byte = 4 word = 1 qword (quad-word)
🪐레지스터 기초
- 레지스터를 사용하는 이유
- 하드 디스크까지는 멀고 레지스터는 내장되어 있으므로 매우 빠름
- 연산 결과물을 임시적으로 저장하기 위해서
- 시피유와 레지스터는 단짝 느낌
- 레지스터 rax
- EAX EBX ECX EDX를 중점적으로 사용하게 될거임
- RAX는 64bit를 모두 사용, EAX는 32bit, AX는 ah와 al이 각각 8bit씩 사용
mov는 move의 약자로 데이터를 이동시킨다는 뜻
mov reg1, cst
mov reg1, reg2
mov eax, 0x1234
mov rbx, 0x12345678
mov cl, 0xff
mov al, 0x00
// al은 8bit만 00으로 밀어주고 그 상위 비트는 영향을 주지 않는다
mov rax, rdx
// rdx의 값을 rax에 복사한다
🪐변수와 레지스터
- 메모리 <-> 레지스터
mov rax, a
-> a의 값을 가져오는게 아니라 a의 주소값을 가져온다
mov rax, [a]
-> a라는 바구니 안에 있는 값을 rax에다 복사
mov al, [a]
-> 1바이트만 이동
mov [a], byte 0x55
mov [a], word 0x6666
mov [a], cl
-> cl 자체가 1바이트를 가져오는 것이므로 크기 지정을 안해도
-
메모리에는 구분할 수 있도록 주소(번지수)가 있다
-
section .data
- 초기화 된 데이터
- [변수이름] [크기] [초기값]
- [크기] db(1) dw(2) dd(4) dq(8)
a db 0x11 ; [0x11]
b dw 0x2222
c dd 0x33333333
d dq 0x4444444444444444
- section .bss
- 초기화 되지 않은 데이터
- [변수이름] [크기] [개수]
- [크기] resb(1) resw(2) resd(4) resq(8)
- 처음에 모든 값들이 0으로 되어있다
- 실행파일의 메모리가 줄어든다
e resb 10
🪐엔디안
-
대부분 리틀 엔디안을 사용함
-
장단점이 교차한다
- 빅 엔디언 : 숫자 비교에 유리
- 리틀 엔티언 : 캐스팅에 유리하다