Moving Data
Source에서 Data로 이동하는 명령어는 movq로, 다음과 같이 사용하면 된다.
-
movq Source, Dest;
-
피연산자 타입
-
상수
-
예) $0x400, $-533
-
앞에 $를 붙여준다
-
-
레지스터
-
예) %rax, %r13
-
16레지스터들 중 하나를 사용한다
-
%rsp는 사용하지 않는다
-
대부분의 레지스터는 특정 명령어를 위해 사용한다
-
-
메모리
-
예) (%rax)
-
레지스터가 가리키는 메모리의 주소에 저장된 데이터로 8바이트에 저장된다
-
-
movq Operand Combinations
Source | Dest | Src, Dest | C Analog |
---|---|---|---|
Imm | Reg | movq $0x4, %rax | temp = 0x4; |
Imm | Mem | movq $-147, (%rax) | *p = -147; |
Reg | Reg | movq %rax, %rdx | temp2 = temp1; |
Reg | Mem | movq %rax, (%rdx) | *p = temp; |
Mem | Reg | movq (%rax), %rdx | temp = *p; |
메모리에서 메모리로의 데이터 이동은 한 명령어로 할 수 없다.
Simple Memory Addressing Modes
-
Normal (R) Mem[Reg[R]]
-
레지스터 R이 가리키는 특정 메모리 값에 접근하는 경우
-
예) movq (%rcs), %rax
-
-
Displacement D(R) Mem[Reg[R] + D]
-
레지스터 R이 특정 메모리 구역의 시작위치를 가리키는 경우
-
R에서부터 D만큼 떨어진 메모리 값에 접근할 수 있다
-
예) movq 8 (%rbp), %rdx
-
Complete Memory Addressing Modes
-
Most General Form
-
D(Rb, Ri, S) Mem[Reg[Rb] + S * Reg[Ri] + D]
-
D : Constant “displacement”로 1, 2, 4바이트 중 하나
-
Rb : 베이스 레지스터
-
Ri : 인덱스 레지스터
- %rsp는 사용 불가
-
S : 규모 : 1, 2, 4, 8 바이트 중 하나
-
-
-
Special Cases
-
(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]]
-