문제

MASM32 어셈블리를 사용하여 메인 메모리에서 읽으려고 노력하고 있으며이를 위해 (이전의 다른 질문에 대한 답변에서 권장했듯이) 크게 분리 된 메모리 위치를 포함하는 배열 (읽기를 피하기 위해 작성했습니다. 은닉처). 배열을 만들고 읽을 수 있었지만 문제가 있습니다. 내가 이미하고 테스트 한이 배열은 내가 준 데이터 (즉 숫자)로 작동하는 것입니다. 그러나 나는 메모리 위치가 필요하며 그에 대한지도 나 참조를 찾을 수 없습니다. 나는 다음과 같은 것이 필요하다는 것을 의미합니다.

my_arr db 5, 2, 8, 9, 1, 7, 3, 0, 4, 6

그러나 숫자를 사용하는 대신 해당 메모리 위치 예약 단어를 사용해야합니다. 그러나 나는 그들을 찾을 수 없다 = (또는 다른 무엇을 찾아야할지에 대한 아이디어가 있습니다.


편집하다

내가 올바르게 얻었는지 확인하겠습니다. 그런 다음 (배열을 사용하는 대신, 메인 메모리에서 읽기를 강제로 읽기 위해 모든 공간을 사용하는 변수를 사용하는 대신, 당신은 내가 할 수 있다고 말해 주시겠습니까?

도움이 되었습니까?

해결책

이것은 당신이 말했듯이 (연속) 바이트의 배열입니다.

my_arr db 5, 2, 8, 9, 1, 7, 3, 0, 4, 6

이것은 10MB (CPU 캐시에 비해 큰)를 차지하는 변수입니다.

wasted_space BYTE 10485760 DUP(?)

다음은 다음 사이에 낭비되는 공간이 많은 몇 가지 변수입니다.

my_var_1 db 5
spacer_1 BYTE 10485760 DUP(?)
my_var_2 db 2
spacer_2 BYTE 10485760 DUP(?)
my_var_3 db 8
spacer_3 BYTE 10485760 DUP(?)
my_var_4 db 9
spacer_4 BYTE 10485760 DUP(?)
my_var_5 db 1
spacer_5 BYTE 10485760 DUP(?)
my_var_6 db 7
spacer_6 BYTE 10485760 DUP(?)
my_var_7 db 3
spacer_7 BYTE 10485760 DUP(?)
my_var_8 db 0
spacer_8 BYTE 10485760 DUP(?)
my_var_9 db 4
spacer_8 BYTE 10485760 DUP(?)
my_var_10 db 6

이 (데이터 세그먼트에서 변수 생성)는 일부 데이터 메모리 주소를 얻는 한 가지 방법입니다 (변수에는 주소가 포함되지 않습니다 ... 오히려 변수는 주소에 있습니다).

메모리 주소를 얻는 또 다른 방법은 힙에서 메모리를 할당하고 할당 된 메모리의 주소를 반환하는 O/S API를 호출하는 것입니다.


ASM 에서이 작업을 수행하는 이유를 모르겠습니다 (어셈블리 학습 제외). 캐싱에 대해 배우는 것이라면 C를 사용하여 (그리고 더 쉽게) 할 수 있다고 생각했을 것입니다.

어쨌든, 캐싱에 대해 궁금했습니다. 캐시 미스를 일으키기에 충분한 공간은 얼마입니까? 미스를 유발하기 위해 몇 가지 다른 변수가 필요합니까 (캐시가 분할되어 몇 가지 (단지 소수) 널리 간격을 두는 메모리 캐시를 포함 할 수 있습니까?

그것 (캐싱)은 수년에 걸쳐 복잡한 주제가되었습니다. http://lwn.net/articles/252125/ Wikipedia에서 링크 된 기사입니다. 이 기사에는 몇 가지 그래프가 포함되어 있습니다 그림 3.11 : 여러 크기에 대한 순차적 판독 값.

다른 팁

어셈블리의 간접 메모리 액세스

배열의 바이트를 메모리 주소로 처리하려면 기본 주소로 사용될 수있는 레지스터에로드 한 다음 레지스터가 가리키는 메모리에 액세스해야합니다.

MOV AX, [MY_ARR+3]  ; Element 3 in array, that is 9
MOV BX, [AX]        ; Read from that address

캐시에 대해

캐시는이 배열에서 다루는 메모리 주소 범위보다 훨씬 클 수 있습니다. 따라서 모두 캐시에 맞습니다.

또한 캐시가 아마도 연관성이있을 수 있습니다. 즉, 동일한 (전체) 캐시 라인에 있지 않으면 캐시에 매우 멀리 떨어져있는 경우 캐시에 함께 맞을 수 있습니다.

실제로 캐시를 끊고 메모리에 직접 액세스해야한다는 것을 보장하려면 캐시보다 더 큰 연속 메모리 위치 세트에 액세스해야합니다. 즉 캐시만큼 큰 배열을 만듭니다. 또한 여러 레이어의 캐시 레이어 (L1, L2, L3 및 추가)가있을 수 있으므로 오버런하려는 캐시에 따라 얼마나 큰지에 달려 있습니다.


나는 C-to Time 메모리 및 캐시에 한 번 같은 프로그램을 작성했으며, 시간 측정 오버 헤드 (그러한 짧은 시간에 무시할 수 없음)에 대한 통계 계산 및 보상으로 실제로 정확한 결과를 얻었습니다 (이것은 될 수 있습니다. 테스트를 더 길게 실행하고 표준 편차가 다운 될 때까지 필요한만큼 정확하게 만들어졌습니다).

그러나 저의 프로그램은 가장 효율적인 방법이 아니었고 캐시의 연관성에 대해 크게 힌트를주지 않았습니다 (채색 구성표에 대한 지식과 별도로 측정해야합니다). 그러나 둘 다 비교적 아키텍처 독립적 인 방식으로 다소 효율적으로 이루어졌습니다. Sigmetrics 2005 Larry McVoy와 Carl Staelin의 작업.

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