计算矩阵中的偶数

时间:2016-12-11 17:15:03

标签: c assembly x86

在这个函数中,我希望在矩阵中得到偶数。我的参数是二维指针和矩阵的维度。 有人可以帮帮我吗?哪里出错...

    subl    $12, %esp                    # 12 bytes to local variables

    movl    $0, -12(%ebp)                # counter = 0
    movl    8(%ebp), %esi               # **m
    movl    $0, %ebx                     # i = 0
it_rows:
    cmpl    12(%ebp), %ebx              # while(i != y)
    jz      end                         # if not equal jump
    leal    (%esi, %ebx, 4), %edi       # m+i
    movl    $0, %ecx                     # j = 0
it_col:
    cmpl    16(%ebp), %ecx              # while(j != k)
    jz      next_row
    movl    (%edi, %ecx, 4), %eax       # *(*(m+i)+j)
    andl    $0x1, %eax               # LSB
    cmpl    $0, %eax                     # LSB == 0
    jnz     not_even
    movl    -12(%ebp), %eax             # counter
    incl    %eax                        # counter++
    movl    %eax, -12(%ebp)             # update local variable
not_even:
    incl    %ecx                        # j++
    jmp     it_col
next_row:
    incl    %ebx                        # i++
    jmp     it_rows

我在C中的实现:

int count_even_matrix(int **m, int y, int k) {
    int i, j;
    int c = 0;
    for(i = 0; i < y; i++) {
        for(j = 0; j < k; j++) {
            if(*(*(m+i)+j)%2 == 0) {
                c++;
            }
        }
    }
    return c;
}

3 个答案:

答案 0 :(得分:0)

使用

更改if
if ((m[i][j] % 2 ) == 0) {    
     c++;  
 }

i是您的矩阵行索引,j是列索引。这两个for已经增加了它们。

答案 1 :(得分:0)

我只是C中的初学者,但是如果你将二维数组的数组名称传递给你的函数,你实际上是将一个指针传递给数组的第一个元素,在本例中是一个3元素的一维数组。所以我相信你的指针应该声明为int(* m)[3]。

答案 2 :(得分:0)

  

我想将我的C实现写到汇编中。

您的程序集只有一个错误:leal,必须为movl。考虑一下,您所说的二维指针int **类型所传达的指向int指针的指针。与

    leal    (%esi, %ebx, 4), %edi       # m+i

您仅将指针的地址加载到第 ebx 行中的int,但是实际上您需要该指针的值,即。 e。 int的地址,以及您获得的地址

    movl    (%esi, %ebx, 4), %edi       # *(m+i)