массив и сборка - PullRequest
       2

массив и сборка

1 голос
/ 31 марта 2012

Если я объявлю эти 3 массива

int a[10][10];
int b[10][15];
int c[10][30];

Для какого из этих трех массивов код ассемблера вернет элемент [i] [j]? Предполагая, что начальный адрес массива хранится в% ebx.

pushl   %ebp
movl    %esp, %ebp
movl    8(%ebp), %edx          /* index i */
movl    12(%ebp), %ecx         /* index j */
movl    %edx, %eax
sall    $4, %eax
subl    %edx, %eax
addl    %ecx, %eax
movl    (%ebx,%eax,4), %eax
popl    %ebp
ret

Как вы решаете этот тип вопросов

Ответы [ 2 ]

1 голос
/ 31 марта 2012

Я бы подхожу к этому, выполняя рукописную математику с примечаниями, например:

movl    8(%ebp), %edx          /* index i */
-> edx = i
movl    12(%ebp), %ecx         /* index j */
-> ecx = j
movl    %edx, %eax
-> eax = i
sall    $4, %eax
-> eax = 16 * i
subl    %edx, %eax
-> eax -= i, thus:
-> eax = 16 * i - i = 15 * i
addl    %ecx, %eax
-> eax += j, thus: 
-> eax = 15 * i + j 
movl    (%ebx,%eax,4), %eax
-> eax = array[4 * eax], thus:
-> eax = array[sizeof(int) * (15 * i + j)]

Итак, в конце eax вы получите то, что находится в данном массиве (указаноebx в начале) в позиции 15 * i + j.Это может правильно адресовать:

  • массив int
  • массив с 15 для его первого (самого правого) измерения

Учитывая это и ваштри массива:

int a[10][10];
int b[10][15];
int c[10][30];

это адрес b правильно, но не a или c.

0 голосов
/ 31 марта 2012

Работа в обратном направлении от строки, которая разыменовывает массив:

movl    (%ebx,%eax,4), %eax

Здесь 4*eax используется в качестве смещения (где 4 - sizeof(int)), поэтому значение в eax - это число int s от начала массива. Теперь напишите уравнение для eax в терминах аргументов, считанных из стека ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...