Как мне преобразовать этот цикл C for в язык ассемблера?

Мне нужно написать ассемблерную программу, находящую максимум x^3 -14x^2 +56x -64 в диапазоне -2‹=x‹=8, и максимальное значение должно быть в одном из регистров в конце программы .

Я написал код на C, но не знаю, как самому преобразовать его в ассемблер. Я действительно смущен в этот момент. Кстати, я должен преобразовать его сам. Я не могу использовать gcc для преобразования в сборку. Это для СПАРК

#include<stdio.h>
int  main()
{


int i;
int ans;

for (i = -2; i < 9; i++){
    ans = (i * i * i) - (14 * i * i) + (56 * i) - 64;
}
} 

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

main:

  save  %sp, -96, %sp

  ba     test
  mov    -2, %a_r

loop: 

  mov    %a_r, %o0       !a_r moved into o0
  mov    %a_r, %o1       !a_r moved into o1
  call   .mul            !they are multiplied and stored in o0
  call   .mul            !they are multiplied again and stored in o0
  mov    %o0, r0         !results stored in r0
  mov    %a_r, %o0       !a_r moved into o0 and o1
  mov    %a_r, %o1
  call   .mul            !they are multiplied and stored in o0
  mov    14, %o1         
  call   .mul            !o0 result is multiplied by 14 and stored in r1
  mov    %o0, r1
  mov    56, %o0         !56 moved into o0
  mov    %a_r, %01       !a_r moved into o1
  call   .mul            !they are multiplied and stored in r2
  mov    %o0, r2         
  Sub    r0,r1,r0        !r0-r1 stored in r0
  Add    r0,r2,r0        !r0+r2 stored in r0
  Sub    r0,64,r0        !r0-64 stored in r0
  add    %a_r, 1, %a_r   !a_r + 1

test:
  cmp     %a_r %b_r      ! a_r<=8?
  ble     loop

person user2012751    schedule 17.02.2013    source источник
comment
Что вы пробовали?   -  person nrz    schedule 17.02.2013
comment
gcc -S prog.c -o prog.s это начало. Вы можете изучить сгенерированную сборку, чтобы получить некоторые идеи.   -  person nneonneo    schedule 17.02.2013
comment
Сборка x86, MIPS, ARM или что?   -  person NeXuS    schedule 17.02.2013


Ответы (1)


В вашем ответе не хватает деталей, потому что у нас нет информации о том, на какую машину вы нацелены. Это также звучит как домашнее задание, поэтому я не буду давать вам полный ответ.

Однако я скажу вам, что для реализации циклов в ассемблере (любого вида) вам необходимо использовать метки и инструкции ветвления.

Кроме того, это простые суммы и умножения. Просто позаботьтесь о хранении i и ans в двух разных регистрах (в конце концов, это разные переменные).

РЕДАКТИРОВАТЬ

Кажется, вы находитесь в правильном направлении (я никогда не писал для SPARC, но беглый взгляд на документы говорит мне, что у вас есть правильное представление). О максимальном количестве: как бы вы поступили в C/C++? Подумайте об этом и сделайте такую ​​же сборку! :)

person NeXuS    schedule 17.02.2013