2014-05-14 4 views
0

그래서 나는 MASM32 (C++에서 온 배열)로 작업하려고 노력 중이며, 실제로 짜증이납니다. 그것은 12 × 12 게임 보드에 각각 폭 1과 3 긴 3 배를 배치배열에 값을 저장

void randomplaceShip() 
{ 
    int toPlace = 3; 
    srand(time(0)); 

    while (toPlace > 0) 
    { 
     int v1 = rand() % 12; 
     int v2 = rand() % 12; 

     if (dArray[v1][v2] != 'X' && v1 < 9) 
     { 
      for (int i=0; i<3; i++) 
      { 
       dArray[v1+i][v2] = 'X'; 
      } 
      toPlace--; 
     } 
    } 
} 

: 나는 C에서 원하는 ++과이 어떻게 생겼는지 프로토 타입. 지금까지 어셈블리에서 어레이 주소를 esi 레지스터에 저장하고 1-9 사이의 임의의 숫자를 rVal에 저장합니다. C++ 에서처럼 인덱싱이 없기 때문에 올바른 위치에 "X"를 저장하는 데 문제가 있습니다. MASM32에서 사용하는 배열은 144 슬롯 (12x12 보드 용)이있는 바이트 배열입니다. 당신이 무슨 일을하는지

lea esi, dArray 
    mov eax, 11 

    .while eax > 10 
     invoke crt_rand 
    .endw 
    mov rVal1, eax 

    mov eax, 11 
    .while eax > 10 
     invoke crt_rand 
    .endw 
    mov rVal2, eax 

    movzx eax, byte ptr [esi+1*rVal1] ;The problem 
    mov eax, "x"       ;is here 

답변

0

:

movzx eax, byte ptr [esi+1*rVal1] 

이 쓰기, 메모리에서하지 읽고 있습니다. 주소도 잘못되었습니다. 주소가 esi + 인 주소에서 rVal1 (의 값을 주소로 사용한다는 의미가 아닙니다.이 주소는 " x의 주소를 주소로 사용"을 의미합니다) 주소를 읽으려고합니다. .

mov eax, rVal1 
add eax, i    ; eax = rVal1 + i 
shl eax, 2    ; eax = (rVal1 + i) * 4 
lea eax, [eax*2 + eax] ; eax = ((rVal1 + i) * 4) * 3 
add eax, rVal2   ; eax = (rVal1 + i) * 12 + rVal2 
mov byte ptr [dArray + eax], 'X' 
: 배열의 각 요소는 바이트라고 가정

, 당신이 원하는 것은 OFFSET dArray + (rVal1 + i) * 12 + rVal2에서이 같은 즉, 무언가를 값 'X'을 저장하는 것입니다