, представленный ниже, - это код, который я использую для простой программы сборки y86. Учитывая два целых числа, он должен распечатать большую из двух. Справа от каждой строки у меня есть эквивалентный перевод C.y86 монтажные этикетки не делают то, что они должны быть
# I ask about the need for a first line comment below.
rdint %eax # scanf("%d", &a);
rdint %ebx # scanf("%d", &b);
rrmovl %eax, %ecx # c = a;
subl %ebx, %ecx # c = a - b;
jge ALarger # if (c >= 0) { goto ALarger };
wrint %ebx # printf("%d", b);
jmp End # goto End;
ALarger:
wrint %eax # printf("%d", a);
End:
irmovl $10, %ecx # c = 10;
halt
wrch %ecx
Используя ассемблер Яс, полученный .yo файл выглядит следующим образом:
0x000: f118 | # I ask about the need for a first line comment below.
0x002: f208 | rdint %eax # scanf("%d", &a);
0x004: f238 | rdint %ebx # scanf("%d", &b);
0x006: 2001 | rrmovl %eax, %ecx # c = a;
0x008: 6131 | subl %ebx, %ecx # c = a - b;
0x00a: 7514000000 | jge ALarger # if (c >= 0) { goto ALarger };
0x00f: f338 | wrint %ebx # printf("%d", b);
0x011: 7016000000 | jmp End # goto End;
|
0x016: | ALarger:
0x016: f308 | wrint %eax # printf("%d", a);
|
0x018: | End:
0x018: 30810a000000 | irmovl $10, %ecx # c = 10;
0x01e: 10 | halt
- Это не была собрана правильно. Мне сказали, что везде, где встречается ярлык, он заменяется адресом того, где он находится в программе. Если введенное первое число больше, инструкция по строке 0x00a - . Это говорит счетчику программы перейти к строке 0x014 (строка, которая даже не существует), когда она должна сказать, чтобы она перешла к 0x016. Та же проблема существует для строки 0x011. Почему это происходит?
- Когда я собираю программу, используя адресные строки вместо меток, результат печатается, однако новая строка не является. Как я могу это исправить?
- Наконец, второстепенный вопрос: если у меня не было комментария в качестве первой строки, первая строка кода игнорируется. Это должно произойти?
Благодарим за внимание, я с нетерпением жду любых ответов, которые вы можете предоставить.
Я ничего не знаю об этом, но, оглядываясь по сети, кажется, что другие примеры, которые я могу найти, имеют отступ с сборкой, с метками слева от той же строки, например http: //csapp.cs .cmu.edu/public/simguide.pdf - это может объяснить неправильные адреса ярлыков и, если бы это была действительно дрянная реализация, может даже объяснить необходимость в исходном комментарии ... другими словами, дикая догадка заключается в том, что ваш формат ввода неправильный, и парсер yas запутан. –
Что произойдет, если вы поместите метку в ту же строку, что и инструкция: «ALARGER: wrint% eax» в той же строке и т. Д. –
Когда я делаю это, строка для ALARGER: wrint% eax по-прежнему 0x016 и End: irmovl $ 10,% ecx по-прежнему 0x018. Команды jge и jmp также остаются неизменными. Кажется, это стилистическая вещь. Спасибо в любом случае @andrew. –