CPP_RO_배열과 주소

CJB_ny·2022년 7월 2일
0

C++ 정리

목록 보기
11/95
post-thumbnail

우리는 간단하게 맛보기만 하고 넘어갈 것이다.

나중에 CPP에서 더 알아 볼것이다.


개념 복습 👍

배열과 리스트

배열과 리스트

: 동일한 특성의 데이터들의 집합을 가리키는 자료구조

둘의 가장 큰 차이는 구조적 차이라고 생각한다.

배열의 경우 연속된 메모리 공간에 할당되고, 리스트의 경우 메모리가 연속적인 공간에 있지 않고 다음 노드를 가리키는 주소값을 가지고 있다.


배열과 주소

  • 배열 : 동일한 타입의 데이터 묶음

  • 배열을 구성하는 각 값을 배열 요소(element)라고함.

  • 배열의 위치를 가르키는 숫자를 인덱스(index)'

section .data에서

msg db 'Hello world!', 0x00

a db 1, 2, 3, 4, ... 10

이렇게 해주었을 때 이게 배열의 문법이다.

db. dw ... 와같은 동일한 사이즈로 데이터가 연속적으로 있을 경우자체를 배열이라고 한다.

메모리 주소를 함 볼까??

값이 이렇게 연속적으로 들어가있다.

동일한 값 들어갈경우

section .data

b times 5 dw 1

b라는 이름의 배열을 만드는데 데이터는 times 5 == 5개이고
각 데이터의 크기는 2바이트이고 초기값은 1이다.

메모리 보면

2바이트에 1씩 초기화 되어서 10바이트.

section .bss

bss의 경우에는 초기화를 할 수 없지만

데이터 몇개 넣을지 가능하다.

section .bss
num resb 10

1byte 10개 넣도록 하겠다. -> bss메모리에

주소 값 보기 실습

a의 경우 잘 들어가있다.

b를 보면

0x01, 0x00 이렇게 뒤집혀서 들어가있는데

저번에 Endian에서

Intel기반 아키텍쳐에서는 Little-Endian을 사용하기 때문에

0x01, 0x00 => 0x0001 이렇게 표현하고 있는 것을

0x01, 0x00이라고 표현을 한 것이다.


Endian
https://velog.io/@starkshn/CPPRO%EB%AC%B8%EC%9E%90%EC%99%80-%EB%A0%88%EB%94%94%EC%95%88-0g5qcxw0


그리고 a의 메모리 바이트 단위의 값을 보면

a와 b의 인접한 데이터 끼리는 바짝 붙어있는 것을 볼 수 있다.

0x1, 0x2 ... 0x5에서 끝나는게 아니라 b의 영역인

0x1, 0x0 이 붙어있음.

mov rax, a ❗❗❗ 워낙 중요

mov rax, a

레지스터에다가 메모리 값을 복사를 하면

a의 주소값이 들어갔었다.

(ㅎㅎ 그랫나..??)

지금 rax에 들어와있는

0x40301d가 a의 메모리 주소이다.

이게 아마 5바이트 일거같은데...

이 주소를 메모리에 다시 올려려서 주소를 눌러보면

0x1, 0x2 .. 들어가있음.

알수있는게

mov rax, a에서 a는 결국

데이터가 시작하는 첫번재 데이터의 주소값이다.

오늘의 퀴즈

PRINT_HEX 1, [ a ] 를 통해서 a의 값 출력이 가능했는데

그 다음에 있는 주소의 값들은..??

(어소에서 배운거 응용함)

연습문제 a출력

어떤방식으로든 OK

a배열의 모든 값 추출

나는일단 이런식으로 함.

inc사용하기

add eax, 1보다 좀더 빠름 (dec도 마찬가지 sub)

C++

주소를 기반으로 덧셈으로 접근을 하는 경우가 많다.

구조체나 클래스도 이런

특정 주소를 기준으로 덧셈으로 접근을 하는 경우가 굉장히 많다.

연습문제 2 b출력

나는 이렇게함 일단.

HEX2 2,

나중에 맵의 정보 추출할때에도 배열 주소 연산 사용한다 ❗

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

0개의 댓글