본문 바로가기
정글

TIL(11일차) 어셈블리어에서의 포인터, 다중배열

by 진득한진드기 2023. 5. 2.

 

어셈블리어에서 단항 연산자 '&'와 '*'는 포인터의 생성과 역참조를 수행한다.

 

어떤 객체를 나타내는 식 Expr이 있다면 &Expr은 객체의 주소를 주는 포인터가된다.

 

주소를 나타내는 식 AExpr에 대해 *AExpr는 그 주소의 위치한 값을 준다.

 

따라서 Expr와 *&Expr는 동일하다.

 

인덱스 i가 레지스터 %rdx와 %rcx에 각각 저장되어 있는 경우 대해 생각해보면

 

E와 관련된 수식들은 아래에 표와 같이 표현 할 수있다.

 

결과 값 레지스터는 %eax(데이터) 또는 %rax(포인터)에 저장하는 수식의 어셈블리 코드이다.

 

 

배열에 관한 포인터

 

 


 

다중배열

C언어에서 다중 배열은 일반적으로 

 

다음과 같이 선언한다.

 

int A[5][3];

typedef int row3_t[3];
row3_t A[5];

 

배열 A는 다섯 개의 행과 세 개의 열을 갖는 이차원 배열로 볼 수 있다.

 

처음 주소 즉, A[0][0]에서 A[4][2]까지 참조가 가능하다.

 

배열의 원소 들은 "행 우선" 순서로 저장된다.

 

다차원 배열의 원소를 접근하기 위해서 컴파일러는 원하는 오프셋을 계산하는 코드를 생성하고, 배열의 시작을 기본주소로,

 

오프셋을 인덱스로 하는 MOV 인스트럭션을 사용한다.