In dieser Funktion möchte ich gerade Zahlen in Matrix bekommen. Meine Parameter sind ein zweidimensionaler Zeiger und die Dimensionen der Matrix. Kann mir jemand helfen? Wo ich falsch ...Zählen Sie gerade Zahlen in Matrix
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
Meine Implementierung in 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;
}
Wie wird die Matrix deklariert? –
Sie haben nicht die vollständige Assemblersprache-Funktion angezeigt, und Sie halten die Aufrufkonvention nicht ein (Sie speichern oder stellen keine gespeicherten Register wieder her oder richten% ebp richtig ein) - damit ich nicht mit Ihrem Code experimentieren kann Ich bin nicht motiviert, dir dabei zu helfen. – zwol
Ich habe jedoch einen Ratschlag: Vergleichen Sie Ihren Assembly-Code _line by line_ mit dem Ergebnis der Ausführung Ihres C-Codes durch 'gcc -m32 -march = native -fomit-frame-pointer -fno-schedule-insns -fno- Zeitplan-insns2 -O2 -S'. Wo sie sich unterscheiden, nehmen Sie an, dass der Compiler etwas weiß, was Sie nicht tun, und erforschen Sie etwas. (Sie können alle Zeilen ignorieren, die '.cfi_etwas blah bla bla 'lesen.) – zwol