2011-01-13 4 views
1

Так или иначе связанной с этим calling assembly functions from cПередача массива функции внешней сборки

Я передаю к этой функции массив междунара и длину:

do_stuff_in_asm (array, len); 

Сборка часть выглядит следующим образом

................... 
movl 8(%ebp), %eax 
movl 12(%ebp), %ecx 
movl $0, %edi 
................... 
movl (%eax,%edi,4), %edx 
pushl %edx 
pushl $printtext 
call printf 
addl $8, $esp 
.................. 

Я могу напечатать аргумент len 12 (% ebp), но каждый раз, когда я пытаюсь сделать то же самое на% edx, который должен быть первым элементом массива, я получаю ошибку сегментации.

int *array, n, i; 

printf ("Give array size: "); 
scanf("%d",&n); 

array = malloc (n * sizeof(int)); 

После этого данные заполнены.

+0

Вы уверены, что 'array' содержит допустимую строку ASCII с завершением \ 0? – Simone

+0

массив определяется как int * array; array = malloc ....; для массива <= input .. –

+0

Глупый вопрос, который необходимо задать: вы проверяете, что 'malloc' не терпит неудачу, не так ли? –

ответ

0

Вы должны были разместить полный код. В качестве иллюстрации я написал this sample program. Обратите внимание, что это только встроенный asm, поэтому ideone может скомпилировать его из одного файла. Как вы можете видеть, код, который вы опубликовали, при правильном использовании, работает. Поэтому проблема должна быть в какой-то другой части, которую вы опустили.

+0

, он работает со следующими комментариями: печатает первое значение в массиве, но терпит неудачу, если я активирую цикл asim-файла http://ideone.com/XyrPx и файл C http://ideone.com/mzFD1 –

+0

@void: поскольку я прокомментировал ваш другой вопрос, вызываемым функциям разрешено изменять eax, ecx и edx. Таким образом, вызов printf уничтожит eax (на самом деле содержит возвращаемое значение), вам придется перезагрузить его. – Jester

+0

Я очень заботился об edi и ecx, что я потерял следы eax, я идиот. благодаря –