Доступ к массиву на ассемблере - PullRequest
2 голосов
/ 23 февраля 2012

Я пытаюсь просто суммировать массив в сборке.

int main(){
 int a[5] = {1, 2, 3, 4, 5};
 int result;

 _asm{
   mov ecx, 5 ;set the counter for 5
   mov eax, 0 ;zero eax
 NXT: add eax, [esi*4+a] ;add array value
      inc esi ;increase esi to read next value
      LOOP NXT ;loop back to next

   mov [result], eax ;mov eax into result

  }

 printf("result: %u",result);

Независимо от того, какое значение у массивов, оно всегда равно 2.

Япытаюсь запустить на Mac.

Я компилирую с помощью:

gcc -fasm-blocks -m32 -c sum.cpp

и связываюсь с

gcc -arch i386 -g -o sum sum.o

Я пробовал разные вещи, но могупохоже, что он суммирует массив.

1 Ответ

3 голосов
/ 23 февраля 2012

Похоже, вы ничего не инициализируете esi, поэтому оно содержит некоторое случайное значение в начале цикла.

Кроме того, поскольку a существует в не-фиксированное расположение (это локальная переменная, в конце концов), вы должны сначала загрузить адрес a в регистр:

lea ebx, a
...
add eax, [esi*4+ebx]

Я подозреваю, что ваш встроенный ассемблер делает неправильно[esi*4+a].

...