정글
TIL(11일차) 어셈블리어에서의 포인터, 다중배열
진득한진드기
2023. 5. 2. 23:12
어셈블리어에서 단항 연산자 '&'와 '*'는 포인터의 생성과 역참조를 수행한다.
어떤 객체를 나타내는 식 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 인스트럭션을 사용한다.