ARM программирование выводит массив и malloc очищает входной массив? - PullRequest
2 голосов
/ 26 октября 2011

Мое назначение - взять массив чисел и поместить его в сборку ARM, выполнить дополнение 2, а затем снова вывести его для отображения. Я смог выполнить большую часть работы, но вывод говорит мне, что он не работает правильно.

код C:

#include <stdio.h>

int * comp( int a[], int size ) ;

void main( int argc, char * argv[] )
{
int array[] = { 1, -1, 252, -252, 0, 3015 } ;
int size = sizeof(array) / sizeof(int) ;
int * result ;
int i ;

result = comp( array, size ) ;
printf( "Original Complement\n" ) ;
for( i = 0 ; i < size ; i++ )
printf( "%d %d\n", array[i], *(result+i) ) ;

}

ARM сборка:

AREA |comp$code|, CODE, READONLY ; tell the assembler stuff

IMPORT malloc ; import malloc to be used

EXPORT comp ; tell the assembler to show this label to the linker

comp ; the label defining the entry point

stmfd sp!, {v1-v6, lr} ; standard entry
str v1, [a1] ; copy a1 over to v1
str v2, [a2] ; copy a1 over to v1
bl malloc ; clears pointer for new array

loop
ldr a4,[v1],#4 ; start going through loop starting at top or array
mvn a4, a4 ; ones complement
add a4,a4,#1 ; make it 2's complement

str a4,[a1], #4 ; move back into the array
subs v2, v2, #1 ; set a flag for the end of the loop
bne loop ; start again for the next value in the array
ldmfd sp!, {v1-v6, pc} ; puts all registers back into the caller
END

выход:

Original  Complement
0         -442500552
-1        -442500552
252       0
-252      0
0         0
3015      0

Может кто-нибудь помочь мне понять, почему он дает мне такой испорченный вывод

1 Ответ

4 голосов
/ 26 октября 2011
str v1, [a1] ; copy a1 over to v1

Это будет хранить неопределенное содержимое регистра v1 над первым элементом массива int, переданного в a1. Вы можете видеть, что первый элемент в исходном массиве в вашем выводе был перезаписан с помощью 0.

Если вы хотите запомнить оригинал a1 в другом регистре, вы, вероятно, имели в виду mov v1, a1.

str v2, [a2] ; copy a1 over to v1

Опять не то, что вы имели в виду, но с a2, представляющим собой маленькое целое число size Я удивлен, что эта попытка записи в нехватку памяти не сразу завершается сбоем!

bl malloc ; clears pointer for new array

Здесь вы не передаете объем памяти, который вы хотите malloc, он получает адрес массива int и обрабатывает его как число байтов. Предполагая 32-битное int, вы бы хотели mov a1, a2, asl#2 умножить размер int на 4 байта.

Вы, вероятно, также должны убедиться, что он не вышел из строя и вернул NULL.

ldmfd sp!, {v1-v6, pc} ; puts all registers back into the caller

Регистр результата a1 будет указывать на конец своего массива в этой точке вместо начала. Вы захотите сохранить исходный результат malloc и вернуть его сюда.

...