우리는 간단하게 맛보기만 하고 넘어갈 것이다.
나중에 CPP에서 더 알아 볼것이다.
배열과 리스트
: 동일한 특성의 데이터들의 집합을 가리키는 자료구조
둘의 가장 큰 차이는 구조적 차이라고 생각한다.
배열의 경우 연속된 메모리 공간에 할당되고, 리스트의 경우 메모리가 연속적인 공간에 있지 않고 다음 노드를 가리키는 주소값을 가지고 있다.
배열 : 동일한 타입의 데이터 묶음
배열을 구성하는 각 값을 배열 요소(element)라고함.
배열의 위치를 가르키는 숫자를 인덱스(index)'
section .data에서
msg db 'Hello world!', 0x00
a db 1, 2, 3, 4, ... 10
이렇게 해주었을 때 이게 배열의 문법이다.
메모리 주소를 함 볼까??
값이 이렇게 연속적으로 들어가있다.
section .data
b times 5 dw 1
b라는 이름의 배열을 만드는데 데이터는 times 5 == 5개이고
각 데이터의 크기는 2바이트이고 초기값은 1이다.
메모리 보면
2바이트에 1씩 초기화 되어서 10바이트.
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
레지스터에다가 메모리 값을 복사를 하면
a의 주소값이 들어갔었다.
(ㅎㅎ 그랫나..??)
지금 rax에 들어와있는
0x40301d가 a의 메모리 주소이다.
이게 아마 5바이트 일거같은데...
이 주소를 메모리에 다시 올려려서 주소를 눌러보면
0x1, 0x2 .. 들어가있음.
mov rax, a에서 a는 결국
데이터가 시작하는 첫번재 데이터의 주소값이다.
PRINT_HEX 1, [ a ] 를 통해서 a의 값 출력이 가능했는데
그 다음에 있는 주소의 값들은..??
(어소에서 배운거 응용함)
어떤방식으로든 OK
a배열의 모든 값 추출
나는일단 이런식으로 함.
add eax, 1보다 좀더 빠름 (dec도 마찬가지 sub)
주소를 기반으로 덧셈으로 접근을 하는 경우가 많다.
구조체나 클래스도 이런
특정 주소를 기준으로 덧셈으로 접근을 하는 경우가 굉장히 많다.
나는 이렇게함 일단.
HEX2 2,