어셈블리어에서 단항 연산자 '&'와 '*'는 포인터의 생성과 역참조를 수행한다.
어떤 객체를 나타내는 식 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 인스트럭션을 사용한다.
'정글' 카테고리의 다른 글
TIL(13일차) re : 프로시저 (0) | 2023.05.04 |
---|---|
TIL(12일차) 플로이드 워샬 알고리즘 (0) | 2023.05.03 |
TIL(10일차) 어셈블리어 간단한 계산 명령어와 연습문제 (1) | 2023.05.01 |
TIL(9일차) 기계어 인스트럭션 보기 (0) | 2023.04.30 |
TIL(8일차) 어셈블리어 (0) | 2023.04.28 |