배열과 주소
배열이란?
동일한 타입의 데이터를 묶은 것을 말한다.
- 배열을 구성하는 각 값을 배열 요소(Element)라고 한다.
- 배열의 위치를 가리키는 숫자를 인덱스(Index)라고 한다.
변수 a처럼 직접 값을 지정해서 배열을 만들어도 되고
변수 b처럼 배열 개수와 크기, 초기값 등을 한 번에 지정해 주어도 된다.
보는 바와 같이 메모리에 a, b배열의 값이 저장된 것을 확인할 수 있다.
(b변수의 값이 0x3, 0x0처럼 반대로 저장된 것은 엔디언 때문이다.)
이제 변수 a에 저장되어 있는 1~5까지의 숫자를 반복문을 통해 각각 출력하는 코드를 만들어봤다.
스스로 만든 코드이다.
결괏값은 정상적으로 출력되나 누가 봐도 복잡스럽고 과하다.
아직 공부한 것들을 제대로 활용하지 못하고 모르는 부분도 많다고 다시 한번 느꼈다.
좀 더 효율적인 코드를 밑에 추가하겠다.
코드가 매우 간결하고 깔끔하다.
inc ebx는 add ebx, 1과 같다
그렇기 때문에 ebx의 값을 1씩 증가시키면서 [a], [a+1].... [a+n]으로 출력된다.
그리고 ebx의 값이 5와 같다면 점프를 멈추고 흐름이 밑으로 내려간다.
이제는 변수 b에 저장되어 있는 값들을 반복문을 통해 모두 출력하는 코드를 만들어보았다.
변수 b는 dw(2byte)이기 때문에 프린트문에 출력을 2바이트로 지정해주었다.
그리고 ebx의 값이 변수 a때 처럼 1씩 증가하면 제대로 된 값을 출력할 수 없다.
그 이유는 아래와 같다.
첫번째 루프에서는 ebx의 값이 0 이기 때문에 [b]의 값이 그대로 출력된다.
즉, 0x03, 0x00 부분이 출력되는데 리틀 엔디언 때문에 실제로는 0x0003이 출력되는 것이다.
그러나 두번째 루프에서는 ebx의 값이 1 증가했다고 가정했을 때
0x00, 0x03 부분이 출력되고 리틀 엔디언 때문에 실제로는 0x0300이 출력되는 것이다.
그래서 ebx의 값은 1씩 증가하는 게 아니라 2씩 증가해야 정상적인 출력 값을 얻을 수 있다.