2015-01-07 1 views
1

MASM에서 두 dimmensional 배열에 액세스하는 방법을 보여줄 수 있습니까?MASM의 두 dimmensional 배열에 액세스하는 방법

C++ 코드 :

int k = 0 
    for (i = 0; i<5; ++i) 
    { 
     if (k == text.length())break; 
     for (j = 0; j<2; ++j) 
     { 
      for (t = 0; t<26; ++t) 
      { 
       if (text[k] == letters[t]){ tab[i][j] = t; k++; break; } 
      } 
     } 
    } 

MASM 단지 내 코드의 일부

mov al, [ebx]  ;ebx - begin of text array   
xor esi, esi   
for1: 
cmp al, 00     
je break_for1     
mov j, 0   
for2: 
mov t, 0      
mov ecx, adrAlphabet  ;ecx - begin of letters array   
for3:    
;if (text[k] == letters[t]){ tab[i][j] = t; k++; break; } 
mov ah, [ecx]    
cmp ah, 00      
je end_of_alphabet    
cmp al, 00      
je end_of_text     
cmp al, ah       
jne not_equal 
;here comes the problem 
     mov edx, t      
     mov [letters + (esi*4 + j)*4], edx 
; 
inc k       
inc ebx       
jmp break_t     
; end if 
not_equal: 
inc ecx       
inc t      
cmp t, 26      
jne for3 

break_t: 
inc j       
cmp j, 2      
jne for2 

inc esi        
cmp esi, 5      
jne for1 

break_for1: 
end 

,하지만 난 그냥 배열을 이해합니다. MASM에서 tab [i] [j]를 어떻게 사용할 수 있습니까? 또 다른 질문은, 어떻게 배열의 길이를 수정할 수 있습니까? 즉, 프로그램 시작시 크기가 계산 된 다음 배열 크기를 설정하고 싶습니다.

감사

+1

1) '행당 요소 수 i','j' 추가 각 요소의 크기 합을 승산하고, 마지막의 기본 주소를 곱하기 정렬. 2) 어레이의 메모리를 동적으로 할당하십시오. 그렇게하는 방법은 타겟 OS에 따라 다릅니다. Windows 응용 프로그램을 작성하는 경우 HeapAlloc을 찾으십시오. – Michael

답변

-2

[a][b]는 크기의 2 개 차원 배열은 크기 [a*b] 단일 일차원 배열 동등하도록 C++ 표준에 의해 보장된다. 2 차원 배열로 생각하지 않고 그냥 정상 배열로 생각할 수 있습니다. 연속 된 데이터 덩어리입니다. 당신이 a이 (우리의 배열의 행 수)는 항상 당신이 직접 사용할 수있는 2, 4, 8 알고 있다면 당신은 tab+a*i+j

접근로가 정확히 동일합니다 tab[i][j]에 액세스하려면,이다

난 EAX와 J 인 형태

mov byte ptr [eax*8+ecx], someValue

의 표현은 ECX이다.

그렇지 않으면 shifts 또는 imul을 사용하여 수동으로 i*a+j을 계산하여이를 배열의 인덱스로 사용해야합니다. exemple 들어

:

; Write 0 at tab[i][j] 
; We use EDX because of how IMUL works 
mov edx, i ; EDX = i 
imul a ; EDX = i*a 
add edx, j ; EDX = i*a+j 
add edx, offset tab ; EDX = tab[i*a+j] = tab+i*a+j 
mov byte ptr [edx], 0 
+0

고마워, 작동 해. – Asker

+1

이 답변에는 몇 가지 실수가 있습니다. 행 수로 곱하기에서 잘못된 어셈블리 조각을 통해 정확하게 주소를 계산하지 못합니다. – Ped7g

관련 문제