Перевести код 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/ для деталей.