CPP_RO_레지스터 기초

CJB_ny·2022년 6월 28일
0

C++ 정리

목록 보기
3/95
post-thumbnail
post-custom-banner

레지스터와 메모리 사이의 데이터를 왔다갔다 하는거 그런 방벙에 대해서 알아 볼 것이다.

레지스터는 메모리 안에 있는 것이다.

  • 레지스터(Register)의 이해

    레지스터는 CPU(Central Processing Unit)가 요청을 처리하는 데 필요한 데이터를 일시적으로 저장하는 기억장치이다.

실제로 컴퓨터에서 데이터를 영구적으로 저장하기 위해서는 하드디스크를 이용해야 하고,
임시적으로 저장하는 장소를 메모리(RAM)이라고 알고 있을 것이다.

하지만, 메모리로 연산의 결과를 보내고 영구적으로 저장할 데이터를 하드디스크에 저장해야 하는 등의 명령을 처리하기 위해서는 이들에 대한 주소와 명령의 종류를 저장할 수 있는 기억 공간이 하나 더 필요하다.
그리고 이 공간은 무리 없이 명령을 수행하기 위해 메모리보다 빨라야 한다.
바로 이런 역할들을 하는 것이 CPU옆에 붙어있는 레지스터이다.

레지스터는 공간은 작지만 CPU와 직접 연결되어 있으므로 연산 속도가 메모리보다 실제 수십 배에서 수백 배까지 빠르다.

그리고 CPU는 자체적으로 데이터를 저장할 방법이 없기 때문에 메모리로 직접 데이터를 전송할 수 없다.
때문에 연산을 위해서는 반드시 레지스터를 거쳐야 하며, 이를 위해서 레지스터는 특정 주소를 가리키거나 값을 읽어올 수 있다.


어셈블리 프로그래밍 삼총사

CPU, 레지스터, 메모리

비트 <-> 바이트 ❗

  • 8bit = 1byte

  • 16bit = 2byte = 1 word

  • 32bit = 4byte = 2 word = 1 dword (double-word)

  • 64bit = 8byte = 4 word = 1 qword (quad-word)

이거 익숙해져야한다.

컴퓨터 구조

CPU와 거리 멀면 멀 수록 접근 속도 ㅈㄴ 느리다.

레지스터는 CPU안에 내장되어있음

CPU가 연산을하고 중간에 연산한 것의 결과물들을 어딘가에다가는 저장을 해야함.

(레지스터도 종류가 많다)

레지스터 종류

이렇게 ㅈㄴ 많은데

이중에서 우리가 자주 사용할 EAX, EBX, ECX, EDX를 다뤄볼 예정이다.

그래서 이것을 또 사용한다고 끝이 아니라 어떻게 사용을 할 것인지도 정해주어야함.

이 그림을 보면은 rax가 64bit = qword를 다 사용한다는 말이다.

(간단하게 레지스터의 크기는 64bit == 8byte라고 생각하면된다)

부분적으로 사용 ❗

eax라고 32bit만 쪼개서 사용한다.

또 쪼개서 사용한다면 ax -> ah, al이라고 보면은 된다.

어떤 부분을 사용할지에 따라서 예약된 이름들이 달라진다는 것을 알아야함.

꼭알아야함.

명령어

  1. mov reg1, cst
    mov 키워드에다가 "레지스터 이름", 아무런 숫자 (cat)

  2. mov reg1, reg2

읽는 방법

오른쪽에서 왼쪽으로 읽으면 됨.

  • mov reg1, cst

    => 어떤 레지스터(reg1)이 있는데 이 레지에 어떤값(cst)를 넣어주세요 임.

  • mov reg1, reg2

    => 두번째 레지스터에 있는 값을 첫번째 레지스터에 복사해 주세요.

예시

이런식으로 가능함.

rax라 했는데 이게 지금 rbx, rcx, rdx 이런식으로 가능한가봄.

al도 마찬가지 al, bl, cl, dl 이렇게.

주의 ❗

cl이 지금

최하단 8bit만 사용하는것인데

이렇게 큰값을 넣어버리면,

빌드해보면 에러난다

(오류 없는지만 빌드 -> Ctrl + F9)

실행

그냥 실행을 할 때는 F9

디버그 모드인 F5를 누르면

빌드 F9 누르고 F5 디버그 모드 하면 딱 걸리는데

F10 한줄 한줄 실펴봄.


설정

이거 해주면 레지스터랑 메모리 뜸.


지금 rax에 이상한 값이 있는데 F10으로 실행해주면

이렇게 값이 바뀜 -> 들어간 값이.

info 가 10진수로 보여줌

만약 이런 경우?

mov al, 0x00

mov rax, rdx 하면은?

디버깅 모드로 ㄱㄱ

원하는 줄에 우클릭 -> F5 -> F5

일로 넘어옴

현재 rax에 HEX값이 0x1234값이 들어가있는데

mov al, 0x00 실행하면

0x1200 들어감

이유 ❗

eax = 32비트 == DWORD이다.

al의 경우 8비트 = 1바이트이다.

지금 이상태에서 8비트 만큼을 0으로 밀어주면

0x1200 이 된다.

상위 비트에는 아무런 영향을 주지 않는다.

mov rax, rdx

이상태에서 실행 ->

이렇게 값을 복사한다.


이해가 안가는것

220719 다시 이해함 👍

mov eax, 0x1234

mov al, 0x00

해주면 rax 레지스터 안에

처음에는 0x1234들어갔다가.

0x1200 들어감.

지금 내가 레지스터의 이름이 햇갈리는데

rax 8byte, eax 4byte, ax 2byte, ah, al 1byte

인데 a, b, c, d이렇게 구분이 되는데

비트 크기가 달라도 a가 공통되면 해당 레지스터에 값을 넣는 식인거 같다.


profile
https://cjbworld.tistory.com/ <- 이사중
post-custom-banner

0개의 댓글