Перевести код C в код сборки?

Я должен перевести этот код C в код сборки:

 #include <stdio.h>

 int main(){

 int a, b,c;
 scanf("%d",&a);
 scanf("%d",&b);
 if (a == b){
   b++;
 } 
 if (a > b){
  c = a;
  a = b;
  b = c;    
 }
 printf("%d\n",b-a);
 return 0;
 }  

Мой код ниже, и неполный.

    rdint %eax        # reading a
    rdint %ebx        # reading b
    irmovl $1, %edi

    subl %eax,%ebx
    addl %ebx, %edi
    je Equal


    irmov1 %eax, %efx  #flagged as invalid line
    irmov1 %ebx, %egx
    irmov1 %ecx, %ehx
    irmovl $0, %eax
    irmovl $0, %ebx
    irmovl $0, %ecx

    addl %eax, %efx    #flagged as invalid line
    addl %ebx, %egx
    addl %ecx, %ehx



    halt

По сути, я думаю, что это в основном сделано, но я прокомментировал две строки, помеченные как недействительные, когда я пытаюсь запустить его, но я не уверен, почему они недействительны. Я также не уверен, как сделать if if для a > b. Я мог бы использовать любые предложения от людей, которые знают о языке ассемблера y86.

2 ответа

Решение

Из того, что я могу найти в Интернете ( 1, 2), единственные поддерживаемые регистры: eax, ecx, edx, ebx, esi, edi, esp, а также ebp,

Вы запрашиваете несуществующие регистры (efx и далее).

Также irmov для перемещения непосредственного операнда (читай: числовое значение константы) в операнд регистра, тогда как ваш irmov1 %eax, %efx имеет два операнда регистра.

Наконец, в компьютерном программном обеспечении существует огромная разница между символом, представляющим цифру "один", и символом, представляющим букву "L". Имейте в виду свои 1 и L. Я имею в виду irmov1 против irmovl,

Jens,

Во-первых, Y86 не имеет никаких регистров efx, egx и ehx, поэтому вы получаете недопустимые строки при заливке кода через YAS.

Во-вторых, вы создаете условные ветви, вычитая два регистра, используя инструкцию subl, и переходите к коду условия, установленному ALU Y86 с помощью инструкций jxx.

Проверьте мой блог на http://y86tutoring.wordpress.com/ для деталей.

Другие вопросы по тегам