2016-09-21 2 views
-1
movq %rax,%rdx 

movq 13(%rax),%rdx 

movq 0x47(%rax,%rcx),%rdx 

rcx = 0000000000000030 
rax = 0000000008048a37 

이 세 가지 조립 라인 지침의 차이점은 무엇입니까? 나는 첫 번째 것이 8048a37을 % rdx로 옮기는 것을 안다. 둘째로, 나는 8048a4를 얻기 위해 13을 8048a37에 추가해야한다고 생각하고 8048a4a가 가리키고있는 것이 % rdx로 옮겨진다. 셋째로 rax, rdx 및 47을 추가하여 8048aae를 얻은 다음 8048aae가 가리키는 것이 % rdx로 이동하게됩니다.어셈블리 기본 사항 - movq

+3

프로세서 설명서는 Intel과 AMD에서 무료로 다운로드 할 수 있습니다. 여기에는 모든 지침과 주소 ​​지정 모드에 대한 포괄적 인 참조가 포함됩니다. –

+1

정확히. 당신의 관찰이 정확합니다. – fuz

+0

아 .. 네 관측을 올바르게 보지 못했다. 죄송합니다!!! – amanuel2

답변

2

이러한 어셈블리 명령어의 차이점은 오프셋에 액세스한다는 것입니다. 그들을 통해 갈 수 :

movq %rax,%rdx 

그냥 RDX 레지스터 (EDX 32 비트 64 비트 레지스터)

movq 13(%rax),%rdx 

은 RAX 레지스터의 주소를 이동에 RAX 레지스터 (EAX 비트 64 비트 레지스터) 이동 가

movq 0x47(%rax,%rcx),%rdx 

레지스터 RDX하는 13의 오프셋으로 RDX 레지스터 + 0x47로 RAX 레지스터 + RCX 레지스터의 어드레스를 이동.

+3

로드 유효 주소 명령어 (lea)는 주소를 이동할 것입니다. 질문의 설명이 정확합니다. – user3386109

0

movq %rax, %rdx - RAX 레지스터의 내용을 RDX 레지스터로 이동합니다.

movq 13(%rax), %rdx - 메모리에서 RDX 레지스터로 주소 [RAX + 13]의 8 바이트 값을로드합니다.

movq 0x47(%rax,%rcx),%rdx - 메모리에서 RDX 레지스터로 주소 [RAX + RCX + 0x47]의 8 바이트 값을로드합니다.

+0

아니요, 위치 변경 (0x47)은 피연산자 크기에 의해 조절되지 않습니다. asm 소스의 변위는 항상 바이트 단위입니다. 재미있는 사실 : AVX512 disp8 변위에 대한 기계 인코딩은 피연산자 크기로 조정되므로 컴팩트 변위로 +127 * 64 바이트에 도달 할 수 있지만 'vcmpeqps 13 (% rax), % zmm1, % k1' (512 -bit 메모리 피연산자)는 disp32가 필요합니다. 13은 64의 배수가 아니기 때문입니다.하지만 내가 말한 것처럼 소스에 쓰는 방법에는 영향을 미치지 않습니다. –