2011-09-22 5 views
0

이것은 간단한 질문이지만 google에서 신뢰할 수있는 답변을 찾을 수 없습니다.x86 간단한 mov 명령

이 명령은 무엇을 의미 하는가 :

movl %eax, (%esi, %ecx, 4) 

그것은 (%esi, %ecx, 4)이 너무 가리키고있는 메모리에 값을 레지스터 eax에서 값을 이동인가?

(%esi, %ecx, 4)은 배열입니다. 즉, Array [Xs + 4i]를 의미합니다. 여기서 Xs는 Array의 메모리에서 시작점이고 i는 정수 배열의 오프셋입니다.

+0

코드는 eax가 정수 배열을 나타내는 것은 아닙니다. 그것은 포인터의 벡터 일 수 있습니다. 그렇지 않으면, 예 : 소스를 먼저, 목적지를 두 번째로 지정하십시오. 인텔/마이크로 소프트가 그 반대의 방식을 취한 이후로는 언제나 혼란스러워합니다. –

답변

4

정확합니다. 이것은 AT & T 구문이므로 원본이 먼저 도착한 다음 대상이옵니다. 따라서, 메모리 위치 esi + 4*ecxeax 레지스터의 내용을 저장합니다.

배열로 생각하면 esi을 기반으로하는 4 바이트 객체 배열의 ecx 번째 항목에 eax을 저장합니다.

2

네, 바로 그게 그 것입니다.

offset(base, index, multiplier) 

offset가가가 base에서 base가 시작하는 위치의 레지스터 오프셋, index가 얼마나 개시 후 특정하는 레지스터 지정 상수 서명이다로서 AT & T 구문에서 메모리 기입 어드레싱 1, 2, 4, 또는 8

을 지정해야 할 수 multiplier 곱한 후 보는 어레이 중 적어도 하나 offset, baseindex. 을 base없이 사용하려면 앞에 쉼표 ((, index))가 있어야합니다. 단순히 수학 문제이기 때문에,

[base + index*multiplier + offset] 

이 이해하기 쉽게 : 당신은 인텔 문법 1.

multiplier, 기본값을 지정하지 않으면,이 같이 기록됩니다.

관련 문제