2014-05-14 1 views
0

나는이 어셈블리를 가지고 :왜 어셈블리에서 주소를 계산하기위한 지침 대신 "+"및 "*"기호를 사용합니까?

movzx eax, r8w 
add r8d, 0x4 
movzx edx, r8w 
cmp edx, 0x1f4 
movdqu xmm3, xmmword ptr [r9+rax*4+0xfb0] ; Why "+" instead of ADD asm?? 
movdqu xmm1, xmmword ptr [r11+rax*4]  ; ?? 
movdqu xmm4, xmmword ptr [r10+rax*4]  ; ?? 

왜이 "+"와 "*"연산자 대신에 추가로 표시하고 주소를 계산하기 위해 ASM 지침을 곱하면? 확실히 어셈블리의 요점은 C++을 x86 명령어로 완전히 분해하는 것입니다.

+10

인 -

번째 지점이 또한 평소 명령어 기반 부가보다 훨씬 빠르게 발생한다는 것이다. x86에는 단일 명령을 실행하는 과정에서이 계산을 수행 할 수있는 어드레싱 모드가 있습니다. 상수와 두 개의 레지스터를 추가하는 주소를 계산할 수 있으며 레지스터 하나에 2 또는 4 또는 8을 곱할 수 있습니다. 이것은 단일 명령어가 상당히 복잡한 작업을 수행 할 수 있기 때문에 RISC 칩이 아닌 CISC 칩으로 간주되는 이유 중 하나입니다. – jcoder

+3

@jcoder : 대답이 아닌가요? –

+0

그리고 또한 : rax가 변경 될 의도가 없다는 것을주의하십시오 (Add가 수행 할 작업). – icbytes

답변

1

질문의 첫 번째 부분 (왜 ADD 명령이 아닌지)과 두 번째 부분 (*)은 동일한 대답을 가지고 있습니다. 여기서 지침은 레지스터를 사용하여 인덱스를 작성하는 것입니다. 이렇게하면 메모리에 대한 색인 된 액세스가 가능하며 메모리에 정의 된 논리 배열에 액세스하는 데 매우 유용합니다.

두 가지 중요한 점 - 피승수는 임의의 값일 수 없으며 1, 2, 4 또는 8 중 하나 여야합니다. 이는 최대 64 비트 (qword) 크기의 요소에만 직접 액세스를 제한합니다. 16 또는 32를 허용하면 xmmword 또는 ymmword의 직접 메모리 배열이 가능했을 것입니다. 사용 가능한 즉각적인 오프셋은 네이티브 64 비트 코드에서도 최대 32 비트 길이로 제한됩니다. 일반적으로 그렇게하면 문제가 발생하지 않습니다.

shl rbx,1 
mov rax, qword ptr [rsi+rbx] 

같은 명령 열이 단일 명령이므로 상당히보다 느린

mov rax,qword ptr [rsi+2*rbx]