2012-07-19 2 views
0

주소 지정 모드로 약간 혼란 스럽습니다. 나는이 문장이 있으면Masm32 - 주소 지정 모드 및 배열

array1 DWORD 200 DUP(?) 

:

mov EAX, [EBX + EDI + 10] 

EBX는 EDI는 인덱스, 기본입니다, 그리고 + (10)는 EDI에 열 개 이상의 바이트를 추가 말하고있다? 그래서 EDI는 14 바이트 길이를 리턴 할 것인가? 주소를 반환하고 EAX에 넣으시겠습니까?

와 비슷하게,

mov EAX, [EBX + EDI * 4] 

이 배열에 무엇을 적 인덱스, 4 바이트 반환하는 말인가요? 배열은 각 색인에 대해 4 바이트 길이이므로? 나는 무엇이 4인지 이해하지 못한다고 생각합니다! 뿐만 아니라

mov ECX, 100 ; loop counter 
    mov ESI, 0 

    top1: 

    mov [array1 + ESI * 4], ECX 

    inc ESI 

    loop top1 

제로 4 바이트 큰 인덱스에서 시작하여 배열에 숫자 100를 넣어 것? 그래서 인덱스 [0] = 100, 인덱스 [1] = 101, 인덱스 [2] = 102?

+0

'mov'와 비슷한 주소는 대상에 있지만 그 주소에는 값을 넣지 않습니다. 주소를 원한다면 그것은 바로'lea '입니다. – harold

답변

2
mov EAX, [EBX + EDI + 10] 

EBX의 값을 가지고 EDI의 값을 추가하고 10를 추가, 다음 EAX로 32 비트 값을로드 할 주소로이 결과를 사용하여 감사드립니다.

mov EAX, [EBX + EDI * 4] 

다음 EAX에 32 비트 값을로드 할 어드레스로서 결과를 사용 EDI 4 배 값 EBX의 값을 취하며 추가.

마지막 번호는 array1에서 시작하는 메모리 위치에 100부터 시작하는 숫자의 감소 시퀀스를 저장합니다. ECX은 0이 될 때까지 loop 명령이 실행될 때마다 감소합니다. ECX의 각 프로 그레시브 값은 array1에 더하여 4 회 ESI에 저장되며 모든 반복마다 증가합니다.

+0

EDI의 4 배의 값은 실제로 무엇을 의미합니까? 값이 5라면 우리는 4를 곱하면 20을 반환 할 것입니다. 나는이 일을하는 것을 그다지 보지 못했습니까? 또는 EDI 색인에서 시작하여 4 바이트를 더 많이 재 작성하고 있습니까? –

+1

정확하게 'EDI'가 5 일 때, 6 번째 32 비트 정수가 필요하다는 것을 나타낼 때, 주소가 기본 주소에 5 * 4 = 20을 추가해야합니다 (주소가 8 비트의 단일 바이트를 가리키므로 4 바이트 32 비트 수량을 처리 할 때 인덱스를 4로 곱하십시오). – twalberg