Addressing Mode
Addressing Mode
주소 지정 모드
- 주소 지정 모드 Addressing Mode
- 주소 즉시 Address Immediate 주소 지정 모드
- 주소 모드
- 피연산자에 나타난 값을 주소로 해석함 (직접 간접, 절대 상대 주소 해당)
- 즉시 모드
- 피연산자에 나타난 값은 상수로 해석함
- 주소 모드
- 직접 간접 Direct Indirect 주소 지정 모드
- 직접 주소
- 기계 명령어의 피연산자 부분이 주기억장치 접근 주소로 사용되는 경우
- #주소 → 값 가져옴
- 간접 주소
- 피연산자 부분이 가르키는 곳에 저장된 기억장치 같이 2차(최종) 주소로 사용되는 경우
- #주소 → 주소 → 값 가져옴 Like 포인터
- 직접 주소
- 절대 상대 Absolute Relative 주소 지정 모드
- 절대 주소
- 피연산자에 나타난 주소가 그대로 주기억장치 접근 주소로 사용되는 경우
- #주소 → 값 가져옴
- 상대 주소
- 피연산자에 나타난 주소에 제 3의 기준 값을 더한 값이 주기억장치 접근 주소로 사용되는 경우
- #주소 + 기준 값 → 값 가져옴
- 절대 주소
- 주소 즉시 Address Immediate 주소 지정 모드
- OP Coder 연산 코드, Operand 피연산자
- I.E. Add_절대/상대_직접/간접, 상수
TODO
간단한 메모리 주소 모드
- 참고
- Reg[R]: 레지스터 R 안의 값
- Mem[M]: 메모리 M 안의 값값
- 표준모드 (R)
- Mem[Reg[R]]
- 레지스터 R은 메모리의 주소를 나타냄
- C의 포인터 역참조 (Dereferencing)
- movq (%rcx), %rax
- 변위모드 D(R)
- Mem[Reg[R]+D]
- 레지스터 R은 메모리 구역의 시작 주소를 나타냄
- 상수 변위 D는 오프셋을 나타냄
- movq 8(%rbp), %rdx
1
2
3
4
5
6
7
8
9
10
11
12
void Temp(SomeType a, SomeType b) {}
// a → %rdi, b → %rsi
__asm
{
Temp:
movq (%rdi), %rax
movq (%rsi), %rdx
movq %rdx, (%rdi)
movq %rax, (%rsi)
ret
}
- 완전한 메모리 주소 모드 (인덱스 주소모드)
- 일반 형태
- D(Rb, Ri, S) Mem[Reg[Rb]+S*Reg[Ri]+D]
- D: 상수 변위(Displacement) 1,2,4 Bytes
- Rb: Base Register: 16개 정수 레지스터 중 어떤 것
- Ri: Index Register: %rap를 제외한 어떤 것
- 의외로 %ebp를 사용할 수도 있음
- s: 배울 (Scale): 1,2,4,8 (why there numbers?)
- 특수 형태
- (Rb, Ri) Mem[Reg[Rb]+Reg[Ri]]
- D(Rb,Ri) Mem[Reg[Rb]+Reg[Ri]+D]
- (Rb,Ri,S) Mem[Reg[Rb]+S*Reg[Ri]]
- 일반 형태
@ 여러 오퍼랜드 형태
- 데이터의 이동: x86-64
- 데이터 이동 move Source, Dest
- Indtel은 move Dest, Source
- 피연산자 (오퍼랜드 Operands)
- Immediate 정수 상수 데이터
- i.e. $0x400, $-533
- C상수 같지만 ‘$’접두어 붙임
- 1,2,4 Bytes로 인코드
- Register: 16개 정수 레지스터 중 하나
- i.e. %rax, %r13
- 특별히 %rsp는 특수 용도로 예약되어 있음
- 그 외 레지스터들은 특정 명령을 위한 특수용도를 가짐
- Memory: 레지스터의 주어진 주소에서 연속된 8바이트 메모리
- 간단 에 :%rax
- 다양한 주소모드 (Address Modes) 제공
- Immediate 정수 상수 데이터
- 데이터 이동 move Source, Dest
- movq 오퍼런드 조합
- Imm
- to Reg, movq $0x4, %rax
- Like c temp = 0x4;
- to Mem, movq $-146, (%rax)
- Like c *p = -147;
- to Reg, movq $0x4, %rax
- Reg
- to Reg, movq %rax, %rdx
- Like c temp2 = temp1;
- to Mem, movq %rax, (%rdx)
- Like *p = temp;
- to Reg, movq %rax, %rdx
- Mem
- to Reg. movq (%rax), %rdx
- Like c temp = *p;
- to Reg. movq (%rax), %rdx
- 하나의 명령으로 메모리에서 메모리로는 이동 불가
- Imm
- 데이터 이동
- movx, x in {b,w,l,q}
- movq, 8Byte quad word
- movl, 4Byte double word
- movw, 2Byte word
- movb, 1Byte byte
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.