문제

그래서 나는 어셈블리를 배우고 있으며 메모리 읽기와 캐시의 독서 사이의 시차를 찾는 과제가 있습니다. 우리는 2 개의 루프를 만들고 타이밍을 통해이를 수행해야합니다. (하나는 메인 메모리에서 읽고 다른 하나는 캐시에서 읽습니다). 문제는 캐시 나 기본 메모리에서 읽는 방법을 알려주는 것을 모르고 찾을 수 없다는 것입니다. 당신은 나를 도와 줄 수 있습니까? 나는 masm32에서 이것을하고있다. 나는 루프를 만드는 방법을 이해하고 대부분의 어셈블리 언어를 잘 이해할 수는 있지만, 나는 그것을 읽을 수 없다 =/


편집하다:

질문이 있습니다.이 작업을 수행했습니다 ...

mov ecx, 100 ;loop 100 times
xor eax, eax ;set eax to 0
_label:
mov eax, eax ;according to me this is read memory is that good?
dec ecx ;dec loop
jnz _label ;if still not equal to 0 goes again to _label

... 괜찮을까요?


편집 2 :

그럼, 나는 pry를 의도하지 않고 당신의 도움에 감사드립니다. 또 다른 질문이 있습니다. 왜냐하면 이것들은 내가해야 할 두 개의 고리이기 때문입니다. 어떻게 든 비교해야합니다. 타이머 명령을 찾고 있었지만 찾은 것만 찾지 못했습니다. TimeGetTime, GetTickCount 그리고 성능 카운터 그러나이 지침을 이해하는 한 루프가 완료되는 데 걸리는 시간이 아닌 시스템 시간을 반환합니다. 내가 원하는 것을 실제로 할 수있는 방법이 있습니까? 아니면 다른 방법을 생각해야합니까?

또한, 두 번째 루프 (캐시에서 읽지 않은 것)의 다른 레지스터에서 읽는 것은 다양한 "mov"지침을 제공해도 괜찮습니까? 아니면 내가 완전히 기지에서 벗어 났습니까?

이 모든 질문에 대해 죄송하지만 다시 도와 주셔서 감사합니다.

도움이 되었습니까?

해결책

캐시에서 읽으려면. 동일한 (또는 매우 유사한) 메모리 주소에서 읽는 루프가 있습니다.

  • 해당 주소에서 처음 읽을 때 해당 메모리 주소 (및 근처 메모리 주소)의 값이 캐시로 이동합니다.
  • 그만큼 다음 당신이 그것을 읽은 시간 같은 주소, 값은 이미 캐시되었으므로 캐시에서 읽고 있습니다.

성취되지 않은 메모리를 읽으려면 많은 사람들이 읽는 루프를 가지고 있습니다.


두 번째 질문에 답하기 위해 :

  • ECX와 JNZ로하고있는 일은 괜찮아 보입니다 (타이머가 얼마나 정확하고 민감한지는 모르겠지만 100 번 이상 고리하고 싶을 수도 있습니다).

  • 그만큼 mov eax, eax "메모리 읽기"가 아닙니다. 대신, 나는 메모리를 읽는 MASM 구문이 더 비슷하다고 생각합니다. mov eax,[esi] ( "주소가 포함 된 메모리 위치를 읽으십시오. esi")

  • 사용중인 O/S에 따라 실제로 존재하고 읽을 수있는 메모리 주소를 읽어야합니다. 예를 들어 Windows에서 응용 프로그램은 수행 할 수 없습니다. mov esi, 0 그 뒤에 mov eax, [esi] 응용 프로그램은 주소/위치가 0 인 메모리를 읽을 수 없기 때문입니다.


세 번째 질문에 답하기 위해 :

TimeGetTime, GetTickCount 및 성능 카운터

TimeGetTime, GetTickCount 및 Performance Counter에 대한 언급은 Windows에서 실행 중임을 의미합니다.

예, 이것은 현재 시간을 다양한 해상도/정확도로 반환합니다. 예를 들어, gettickcount는 약 50msec의 해상도를 가지므로 50-100 만 지속되는 타이밍 이벤트 시점에서는 부정확합니다. MSEC. 그것이 내가 그렇게 말한 이유입니다 100 당신의 ecx 아마도 충분히 크지 않을 것입니다.

그만큼 QueryPerformanceCounter 기능은 아마도 가장 정확한 타이머 일 것입니다.

이 타이머를 간격 타이머로 사용하려면 :

  • 루프를 시작하기 전에 시간을 가지십시오
  • 루핑을 마친 후에 다시 시간을 얻으십시오
  • 이 두 번 빼기 : 차이는 시간 간격입니다.

다양한 "Mov"지침을 제공해도 괜찮습니까?

네, 그렇게 생각합니다. 나는 당신이 이렇게 할 수 있다고 생각합니다 (이름은 확실하지 않습니다. 이것이 이름 메모리 위치에서 읽을 수있는 올바른 masm 구문인지 기억하지 못합니다) ...

mov eax,[memory1]
mov eax,[memory2]
mov eax,[memory3]
mov eax,[memory4]
mov eax,[memory5]

... 어디 memory1 ~을 통해 memory5 데이터 세그먼트의 광범위한 글로벌 변수의 주소입니다.

아니면 할 수 있습니다 ...

mov eax,[esi]
add esi,edx
mov eax,[esi]
add esi,edx
mov eax,[esi]
add esi,edx
mov eax,[esi]
add esi,edx
mov eax,[esi]

... ESI가 긴 메모리 덩어리의 바닥을 가리키는 경우, EDX는 청크 길이의 약 5 분의 1과 같은 증분입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top