将值存储在数组中

时间:2014-05-14 20:58:54

标签: assembly masm masm32

所以我正在尝试使用MASM32中的数组(来自C ++),它真的很烦人。我用C ++原型化了我想要的东西,它看起来像这样:

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--;
        } 
    }
}

它将3艘船放在12x12游戏板上,每1个宽1个长3个。到目前为止,在汇编中,我将我的数组地址存储在esi寄存器中,并获得我在rVal中存储的1-9之间的随机数。我在正确的位置存储“X”时遇到问题,因为没有像C ++那样的索引。我在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

1 个答案:

答案 0 :(得分:0)

你在这做什么:

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

从内存中读取,而不是写入内存。地址也不正确;您试图从esi + 的地址中读取 rVal1的地址([x]并不意味着“使用{{1}处的值}}作为地址“。它只是表示”使用x的地址作为地址“。

假设数组中的每个元素都是一个字节,你想要的是将值x存储在'X',即:

OFFSET dArray + (rVal1 + i) * 12 + rVal2