2015-11-27 1 views
0

Я сделал матрицу 3x3 со случайным числом n в C, и теперь я хочу проверить пары этой матрицы в сборке, вызывающей функцию count_pairs_matrix (int ** m, int y, int k).Как перемещаться по матрице в сборке?

у -> являются количество строк

к -> являются число столбцов

Я делаю это:

movl 8(%ebp), %eax #pointer m 
movl 12(%ebp), %ebx #k 
movl 16(%ebp), %ecx #y 
movl $0, %esi 

(..) 
movl (%eax,%esi,4), %edx <-- the problem is here, the register edx have the address but not the number of that position of the matrix 
+0

Вы должны были бы разыменованием '% edx' что-то вроде' MOVL (% EDX),% edx' после 'MOVL (% EAX,% еси , 4),% edx' –

+0

Это синтаксис AT & T x86x, а не [Синтаксис NASM] (https://en.wikibooks.org/wiki/X86_Assembly/NASM_Syntax). –

+0

Значит ли 'int ** m' в прототипе означает, что вы действительно представляете свою матрицу 3x3 с массивом из 3 указателей на массивы из 3 целых чисел? Это огромная трата пространства по сравнению с 'int m [3] [3]'. В asm разница между необходимостью разыменования в два раза или вычислением 'i * k + j' для получения правильного смещения в один блок памяти. –

ответ

0

Прежде всего, это газ синтаксис, а не синтаксис nasm.

Во-вторых, матричная итерация выглядит как-то еще. Предполагая прямую 2d массив (не массив из массивов),

movl 8(%ebp), %eax #pointer m 
    movl 12(%ebp), %ebx #k 
    movl 16(%ebp), %ecx #y 

    mull %ebx 
    movl %eax, %esi 

.l movl (%esi), %edx 
    (and process) 
    addl $4, %esi 
    decl %ebx 
    jnz .l 
Смежные вопросы